@aztec/simulator 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f
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 +6 -4
- package/dest/common/errors.d.ts +7 -1
- package/dest/common/errors.d.ts.map +1 -1
- 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 +4 -3
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +22 -19
- 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_context.d.ts +3 -3
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.js +3 -3
- package/dest/public/avm/avm_execution_environment.d.ts +6 -5
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +3 -3
- package/dest/public/avm/avm_machine_state.d.ts +6 -5
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/public/avm/avm_machine_state.js +3 -2
- package/dest/public/avm/avm_memory_types.d.ts +1 -1
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +3 -0
- package/dest/public/avm/avm_simulator.d.ts +3 -2
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +6 -5
- package/dest/public/avm/calldata.d.ts +51 -0
- package/dest/public/avm/calldata.d.ts.map +1 -0
- package/dest/public/avm/calldata.js +64 -0
- 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/avm_simulation_tester.d.ts +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +3 -2
- 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 +17 -2
- package/dest/public/avm/fixtures/initializers.d.ts +1 -1
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.js +2 -1
- 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 +3 -0
- package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +42 -43
- package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +1 -1
- package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +5 -5
- package/dest/public/avm/opcodes/comparators.d.ts +4 -4
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.js +1 -1
- package/dest/public/avm/opcodes/contract.d.ts +5 -4
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +13 -9
- package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +4 -4
- package/dest/public/avm/opcodes/conversion.d.ts +3 -3
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +4 -4
- package/dest/public/avm/opcodes/ec_add.d.ts +4 -6
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +22 -27
- package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +6 -6
- package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +23 -22
- package/dest/public/avm/opcodes/hashing.d.ts +8 -8
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +12 -12
- package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction_impl.js +4 -4
- package/dest/public/avm/opcodes/memory.d.ts +14 -14
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +25 -25
- package/dest/public/avm/opcodes/misc.d.ts +3 -3
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +4 -4
- package/dest/public/avm/opcodes/storage.d.ts +16 -15
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +34 -24
- 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/debug_fn_name.d.ts +4 -4
- package/dest/public/debug_fn_name.d.ts.map +1 -1
- package/dest/public/debug_fn_name.js +7 -5
- 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 +12 -33
- package/dest/public/fixtures/amm_test.js +2 -2
- package/dest/public/fixtures/bulk_test.d.ts +3 -3
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +32 -21
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -11
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tests.js +79 -19
- package/dest/public/fixtures/minimal_public_tx.js +2 -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 +100 -136
- 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 +19 -20
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +42 -10
- package/dest/public/fuzzing/avm_simulator_bin.js +29 -11
- 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 +10 -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 +7 -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 +511 -92
- 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 +36 -45
- 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 +5 -4
- 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 -10
- 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/measured_public_tx_simulator.d.ts +1 -1
- 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 +11 -5
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +26 -16
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
- package/dest/public/side_effect_trace.d.ts +5 -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 +14 -7
- 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 +17 -17
- 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 +23 -20
- 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_context.ts +2 -2
- package/src/public/avm/avm_contract_call_result.ts +8 -6
- package/src/public/avm/avm_execution_environment.ts +9 -4
- package/src/public/avm/avm_gas.ts +2 -2
- package/src/public/avm/avm_machine_state.ts +6 -5
- package/src/public/avm/avm_memory_types.ts +4 -0
- package/src/public/avm/avm_simulator.ts +9 -6
- package/src/public/avm/calldata.ts +101 -0
- 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/avm_simulation_tester.ts +8 -2
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +22 -2
- package/src/public/avm/fixtures/initializers.ts +2 -1
- package/src/public/avm/fixtures/utils.ts +3 -0
- package/src/public/avm/opcodes/accrued_substate.ts +31 -34
- package/src/public/avm/opcodes/arithmetic.ts +1 -1
- package/src/public/avm/opcodes/bitwise.ts +3 -3
- package/src/public/avm/opcodes/comparators.ts +1 -1
- package/src/public/avm/opcodes/contract.ts +9 -8
- package/src/public/avm/opcodes/control_flow.ts +2 -2
- package/src/public/avm/opcodes/conversion.ts +3 -3
- package/src/public/avm/opcodes/ec_add.ts +21 -31
- package/src/public/avm/opcodes/environment_getters.ts +7 -7
- package/src/public/avm/opcodes/external_calls.ts +18 -16
- package/src/public/avm/opcodes/hashing.ts +6 -6
- package/src/public/avm/opcodes/instruction_impl.ts +2 -2
- package/src/public/avm/opcodes/memory.ts +19 -19
- package/src/public/avm/opcodes/misc.ts +2 -2
- package/src/public/avm/opcodes/storage.ts +30 -22
- 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/debug_fn_name.ts +10 -8
- package/src/public/executor_metrics.ts +9 -33
- package/src/public/fixtures/amm_test.ts +2 -2
- package/src/public/fixtures/bulk_test.ts +31 -6
- package/src/public/fixtures/custom_bytecode_tests.ts +166 -19
- package/src/public/fixtures/minimal_public_tx.ts +2 -2
- package/src/public/fixtures/opcode_spammer.ts +200 -125
- package/src/public/fixtures/public_tx_simulation_tester.ts +47 -6
- package/src/public/fixtures/utils.ts +26 -22
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +61 -13
- package/src/public/fuzzing/avm_simulator_bin.ts +43 -8
- 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 +156 -93
- package/src/public/public_processor/public_processor_metrics.ts +28 -44
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +9 -5
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +17 -7
- 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 +32 -17
- package/src/public/side_effect_trace.ts +5 -2
- package/src/public/state_manager/state_manager.ts +29 -20
- package/src/public/test_executor_metrics.ts +27 -3
|
@@ -1,21 +1,389 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
function applyDecs2203RFactory() {
|
|
2
|
+
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
|
+
return function addInitializer(initializer) {
|
|
4
|
+
assertNotFinished(decoratorFinishedRef, "addInitializer");
|
|
5
|
+
assertCallable(initializer, "An initializer");
|
|
6
|
+
initializers.push(initializer);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
|
|
10
|
+
var kindStr;
|
|
11
|
+
switch(kind){
|
|
12
|
+
case 1:
|
|
13
|
+
kindStr = "accessor";
|
|
14
|
+
break;
|
|
15
|
+
case 2:
|
|
16
|
+
kindStr = "method";
|
|
17
|
+
break;
|
|
18
|
+
case 3:
|
|
19
|
+
kindStr = "getter";
|
|
20
|
+
break;
|
|
21
|
+
case 4:
|
|
22
|
+
kindStr = "setter";
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
kindStr = "field";
|
|
26
|
+
}
|
|
27
|
+
var ctx = {
|
|
28
|
+
kind: kindStr,
|
|
29
|
+
name: isPrivate ? "#" + name : name,
|
|
30
|
+
static: isStatic,
|
|
31
|
+
private: isPrivate,
|
|
32
|
+
metadata: metadata
|
|
33
|
+
};
|
|
34
|
+
var decoratorFinishedRef = {
|
|
35
|
+
v: false
|
|
36
|
+
};
|
|
37
|
+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
|
|
38
|
+
var get, set;
|
|
39
|
+
if (kind === 0) {
|
|
40
|
+
if (isPrivate) {
|
|
41
|
+
get = desc.get;
|
|
42
|
+
set = desc.set;
|
|
43
|
+
} else {
|
|
44
|
+
get = function() {
|
|
45
|
+
return this[name];
|
|
46
|
+
};
|
|
47
|
+
set = function(v) {
|
|
48
|
+
this[name] = v;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
} else if (kind === 2) {
|
|
52
|
+
get = function() {
|
|
53
|
+
return desc.value;
|
|
54
|
+
};
|
|
55
|
+
} else {
|
|
56
|
+
if (kind === 1 || kind === 3) {
|
|
57
|
+
get = function() {
|
|
58
|
+
return desc.get.call(this);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (kind === 1 || kind === 4) {
|
|
62
|
+
set = function(v) {
|
|
63
|
+
desc.set.call(this, v);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ctx.access = get && set ? {
|
|
68
|
+
get: get,
|
|
69
|
+
set: set
|
|
70
|
+
} : get ? {
|
|
71
|
+
get: get
|
|
72
|
+
} : {
|
|
73
|
+
set: set
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
return dec(value, ctx);
|
|
77
|
+
} finally{
|
|
78
|
+
decoratorFinishedRef.v = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertNotFinished(decoratorFinishedRef, fnName) {
|
|
82
|
+
if (decoratorFinishedRef.v) {
|
|
83
|
+
throw new Error("attempted to call " + fnName + " after decoration was finished");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assertCallable(fn, hint) {
|
|
87
|
+
if (typeof fn !== "function") {
|
|
88
|
+
throw new TypeError(hint + " must be a function");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertValidReturnValue(kind, value) {
|
|
92
|
+
var type = typeof value;
|
|
93
|
+
if (kind === 1) {
|
|
94
|
+
if (type !== "object" || value === null) {
|
|
95
|
+
throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
96
|
+
}
|
|
97
|
+
if (value.get !== undefined) {
|
|
98
|
+
assertCallable(value.get, "accessor.get");
|
|
99
|
+
}
|
|
100
|
+
if (value.set !== undefined) {
|
|
101
|
+
assertCallable(value.set, "accessor.set");
|
|
102
|
+
}
|
|
103
|
+
if (value.init !== undefined) {
|
|
104
|
+
assertCallable(value.init, "accessor.init");
|
|
105
|
+
}
|
|
106
|
+
} else if (type !== "function") {
|
|
107
|
+
var hint;
|
|
108
|
+
if (kind === 0) {
|
|
109
|
+
hint = "field";
|
|
110
|
+
} else if (kind === 10) {
|
|
111
|
+
hint = "class";
|
|
112
|
+
} else {
|
|
113
|
+
hint = "method";
|
|
114
|
+
}
|
|
115
|
+
throw new TypeError(hint + " decorators must return a function or void 0");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
|
|
119
|
+
var decs = decInfo[0];
|
|
120
|
+
var desc, init, value;
|
|
121
|
+
if (isPrivate) {
|
|
122
|
+
if (kind === 0 || kind === 1) {
|
|
123
|
+
desc = {
|
|
124
|
+
get: decInfo[3],
|
|
125
|
+
set: decInfo[4]
|
|
126
|
+
};
|
|
127
|
+
} else if (kind === 3) {
|
|
128
|
+
desc = {
|
|
129
|
+
get: decInfo[3]
|
|
130
|
+
};
|
|
131
|
+
} else if (kind === 4) {
|
|
132
|
+
desc = {
|
|
133
|
+
set: decInfo[3]
|
|
134
|
+
};
|
|
135
|
+
} else {
|
|
136
|
+
desc = {
|
|
137
|
+
value: decInfo[3]
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
} else if (kind !== 0) {
|
|
141
|
+
desc = Object.getOwnPropertyDescriptor(base, name);
|
|
142
|
+
}
|
|
143
|
+
if (kind === 1) {
|
|
144
|
+
value = {
|
|
145
|
+
get: desc.get,
|
|
146
|
+
set: desc.set
|
|
147
|
+
};
|
|
148
|
+
} else if (kind === 2) {
|
|
149
|
+
value = desc.value;
|
|
150
|
+
} else if (kind === 3) {
|
|
151
|
+
value = desc.get;
|
|
152
|
+
} else if (kind === 4) {
|
|
153
|
+
value = desc.set;
|
|
154
|
+
}
|
|
155
|
+
var newValue, get, set;
|
|
156
|
+
if (typeof decs === "function") {
|
|
157
|
+
newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
158
|
+
if (newValue !== void 0) {
|
|
159
|
+
assertValidReturnValue(kind, newValue);
|
|
160
|
+
if (kind === 0) {
|
|
161
|
+
init = newValue;
|
|
162
|
+
} else if (kind === 1) {
|
|
163
|
+
init = newValue.init;
|
|
164
|
+
get = newValue.get || value.get;
|
|
165
|
+
set = newValue.set || value.set;
|
|
166
|
+
value = {
|
|
167
|
+
get: get,
|
|
168
|
+
set: set
|
|
169
|
+
};
|
|
170
|
+
} else {
|
|
171
|
+
value = newValue;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
for(var i = decs.length - 1; i >= 0; i--){
|
|
176
|
+
var dec = decs[i];
|
|
177
|
+
newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
178
|
+
if (newValue !== void 0) {
|
|
179
|
+
assertValidReturnValue(kind, newValue);
|
|
180
|
+
var newInit;
|
|
181
|
+
if (kind === 0) {
|
|
182
|
+
newInit = newValue;
|
|
183
|
+
} else if (kind === 1) {
|
|
184
|
+
newInit = newValue.init;
|
|
185
|
+
get = newValue.get || value.get;
|
|
186
|
+
set = newValue.set || value.set;
|
|
187
|
+
value = {
|
|
188
|
+
get: get,
|
|
189
|
+
set: set
|
|
190
|
+
};
|
|
191
|
+
} else {
|
|
192
|
+
value = newValue;
|
|
193
|
+
}
|
|
194
|
+
if (newInit !== void 0) {
|
|
195
|
+
if (init === void 0) {
|
|
196
|
+
init = newInit;
|
|
197
|
+
} else if (typeof init === "function") {
|
|
198
|
+
init = [
|
|
199
|
+
init,
|
|
200
|
+
newInit
|
|
201
|
+
];
|
|
202
|
+
} else {
|
|
203
|
+
init.push(newInit);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (kind === 0 || kind === 1) {
|
|
210
|
+
if (init === void 0) {
|
|
211
|
+
init = function(instance, init) {
|
|
212
|
+
return init;
|
|
213
|
+
};
|
|
214
|
+
} else if (typeof init !== "function") {
|
|
215
|
+
var ownInitializers = init;
|
|
216
|
+
init = function(instance, init) {
|
|
217
|
+
var value = init;
|
|
218
|
+
for(var i = 0; i < ownInitializers.length; i++){
|
|
219
|
+
value = ownInitializers[i].call(instance, value);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
var originalInitializer = init;
|
|
225
|
+
init = function(instance, init) {
|
|
226
|
+
return originalInitializer.call(instance, init);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
ret.push(init);
|
|
230
|
+
}
|
|
231
|
+
if (kind !== 0) {
|
|
232
|
+
if (kind === 1) {
|
|
233
|
+
desc.get = value.get;
|
|
234
|
+
desc.set = value.set;
|
|
235
|
+
} else if (kind === 2) {
|
|
236
|
+
desc.value = value;
|
|
237
|
+
} else if (kind === 3) {
|
|
238
|
+
desc.get = value;
|
|
239
|
+
} else if (kind === 4) {
|
|
240
|
+
desc.set = value;
|
|
241
|
+
}
|
|
242
|
+
if (isPrivate) {
|
|
243
|
+
if (kind === 1) {
|
|
244
|
+
ret.push(function(instance, args) {
|
|
245
|
+
return value.get.call(instance, args);
|
|
246
|
+
});
|
|
247
|
+
ret.push(function(instance, args) {
|
|
248
|
+
return value.set.call(instance, args);
|
|
249
|
+
});
|
|
250
|
+
} else if (kind === 2) {
|
|
251
|
+
ret.push(value);
|
|
252
|
+
} else {
|
|
253
|
+
ret.push(function(instance, args) {
|
|
254
|
+
return value.call(instance, args);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
Object.defineProperty(base, name, desc);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function applyMemberDecs(Class, decInfos, metadata) {
|
|
263
|
+
var ret = [];
|
|
264
|
+
var protoInitializers;
|
|
265
|
+
var staticInitializers;
|
|
266
|
+
var existingProtoNonFields = new Map();
|
|
267
|
+
var existingStaticNonFields = new Map();
|
|
268
|
+
for(var i = 0; i < decInfos.length; i++){
|
|
269
|
+
var decInfo = decInfos[i];
|
|
270
|
+
if (!Array.isArray(decInfo)) continue;
|
|
271
|
+
var kind = decInfo[1];
|
|
272
|
+
var name = decInfo[2];
|
|
273
|
+
var isPrivate = decInfo.length > 3;
|
|
274
|
+
var isStatic = kind >= 5;
|
|
275
|
+
var base;
|
|
276
|
+
var initializers;
|
|
277
|
+
if (isStatic) {
|
|
278
|
+
base = Class;
|
|
279
|
+
kind = kind - 5;
|
|
280
|
+
staticInitializers = staticInitializers || [];
|
|
281
|
+
initializers = staticInitializers;
|
|
282
|
+
} else {
|
|
283
|
+
base = Class.prototype;
|
|
284
|
+
protoInitializers = protoInitializers || [];
|
|
285
|
+
initializers = protoInitializers;
|
|
286
|
+
}
|
|
287
|
+
if (kind !== 0 && !isPrivate) {
|
|
288
|
+
var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
|
|
289
|
+
var existingKind = existingNonFields.get(name) || 0;
|
|
290
|
+
if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
|
|
291
|
+
throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
|
|
292
|
+
} else if (!existingKind && kind > 2) {
|
|
293
|
+
existingNonFields.set(name, kind);
|
|
294
|
+
} else {
|
|
295
|
+
existingNonFields.set(name, true);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
|
|
299
|
+
}
|
|
300
|
+
pushInitializers(ret, protoInitializers);
|
|
301
|
+
pushInitializers(ret, staticInitializers);
|
|
302
|
+
return ret;
|
|
303
|
+
}
|
|
304
|
+
function pushInitializers(ret, initializers) {
|
|
305
|
+
if (initializers) {
|
|
306
|
+
ret.push(function(instance) {
|
|
307
|
+
for(var i = 0; i < initializers.length; i++){
|
|
308
|
+
initializers[i].call(instance);
|
|
309
|
+
}
|
|
310
|
+
return instance;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function applyClassDecs(targetClass, classDecs, metadata) {
|
|
315
|
+
if (classDecs.length > 0) {
|
|
316
|
+
var initializers = [];
|
|
317
|
+
var newClass = targetClass;
|
|
318
|
+
var name = targetClass.name;
|
|
319
|
+
for(var i = classDecs.length - 1; i >= 0; i--){
|
|
320
|
+
var decoratorFinishedRef = {
|
|
321
|
+
v: false
|
|
322
|
+
};
|
|
323
|
+
try {
|
|
324
|
+
var nextNewClass = classDecs[i](newClass, {
|
|
325
|
+
kind: "class",
|
|
326
|
+
name: name,
|
|
327
|
+
addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
|
|
328
|
+
metadata
|
|
329
|
+
});
|
|
330
|
+
} finally{
|
|
331
|
+
decoratorFinishedRef.v = true;
|
|
332
|
+
}
|
|
333
|
+
if (nextNewClass !== undefined) {
|
|
334
|
+
assertValidReturnValue(10, nextNewClass);
|
|
335
|
+
newClass = nextNewClass;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return [
|
|
339
|
+
defineMetadata(newClass, metadata),
|
|
340
|
+
function() {
|
|
341
|
+
for(var i = 0; i < initializers.length; i++){
|
|
342
|
+
initializers[i].call(newClass);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function defineMetadata(Class, metadata) {
|
|
349
|
+
return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
350
|
+
configurable: true,
|
|
351
|
+
enumerable: true,
|
|
352
|
+
value: metadata
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
|
|
356
|
+
if (parentClass !== void 0) {
|
|
357
|
+
var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
358
|
+
}
|
|
359
|
+
var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
|
|
360
|
+
var e = applyMemberDecs(targetClass, memberDecs, metadata);
|
|
361
|
+
if (!classDecs.length) defineMetadata(targetClass, metadata);
|
|
362
|
+
return {
|
|
363
|
+
e: e,
|
|
364
|
+
get c () {
|
|
365
|
+
return applyClassDecs(targetClass, classDecs, metadata);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
6
372
|
}
|
|
373
|
+
var _dec, _dec1, _dec2, _initProto;
|
|
7
374
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
|
|
8
375
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
9
376
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
10
377
|
import { createLogger } from '@aztec/foundation/log';
|
|
11
378
|
import { sleep } from '@aztec/foundation/sleep';
|
|
12
|
-
import { DateProvider, Timer, elapsed,
|
|
379
|
+
import { DateProvider, Timer, elapsed, execWithSignal } from '@aztec/foundation/timer';
|
|
13
380
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
14
381
|
import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
15
382
|
import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
16
383
|
import { AvmCircuitInputs, AvmExecutionHints, PublicDataWrite } from '@aztec/stdlib/avm';
|
|
17
384
|
import { computeTransactionFee } from '@aztec/stdlib/fees';
|
|
18
385
|
import { Gas } from '@aztec/stdlib/gas';
|
|
386
|
+
import { NullDebugLogStore } from '@aztec/stdlib/logs';
|
|
19
387
|
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
20
388
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
21
389
|
import { NestedProcessReturnValues, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
|
|
@@ -32,24 +400,25 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
|
|
|
32
400
|
contractDataSource;
|
|
33
401
|
dateProvider;
|
|
34
402
|
telemetryClient;
|
|
35
|
-
|
|
403
|
+
log;
|
|
404
|
+
constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), bindings){
|
|
36
405
|
this.contractDataSource = contractDataSource;
|
|
37
406
|
this.dateProvider = dateProvider;
|
|
38
407
|
this.telemetryClient = telemetryClient;
|
|
408
|
+
this.log = createLogger('simulator:public-processor-factory', bindings);
|
|
39
409
|
}
|
|
40
410
|
/**
|
|
41
411
|
* Creates a new instance of a PublicProcessor.
|
|
42
412
|
* @param globalVariables - The global variables for the block being processed.
|
|
43
|
-
* @param
|
|
413
|
+
* @param contractsDB - Optional pre-populated contracts DB; a fresh one is constructed if omitted.
|
|
44
414
|
* @returns A new instance of a PublicProcessor.
|
|
45
|
-
*/ create(merkleTree, globalVariables, config) {
|
|
46
|
-
const contractsDB = new PublicContractsDB(this.contractDataSource);
|
|
415
|
+
*/ create(merkleTree, globalVariables, config, contractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings())) {
|
|
47
416
|
const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
|
|
48
417
|
const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
|
|
49
|
-
return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
|
|
418
|
+
return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient, createLogger('simulator:public-processor', this.log.getBindings()));
|
|
50
419
|
}
|
|
51
420
|
createPublicTxSimulator(merkleTree, contractsDB, globalVariables, config) {
|
|
52
|
-
return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
|
|
421
|
+
return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config, this.log.getBindings());
|
|
53
422
|
}
|
|
54
423
|
}
|
|
55
424
|
class PublicProcessorTimeoutError extends Error {
|
|
@@ -58,6 +427,22 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
58
427
|
this.name = 'PublicProcessorTimeoutError';
|
|
59
428
|
}
|
|
60
429
|
}
|
|
430
|
+
class PublicProcessorAbortError extends Error {
|
|
431
|
+
constructor(message = 'Aborted while processing tx'){
|
|
432
|
+
super(message);
|
|
433
|
+
this.name = 'PublicProcessorAbortError';
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function isPublicProcessorInterruptError(err) {
|
|
437
|
+
return err?.name === 'PublicProcessorTimeoutError' || err?.name === 'PublicProcessorAbortError';
|
|
438
|
+
}
|
|
439
|
+
_dec = trackSpan('PublicProcessor.processTx', (tx)=>({
|
|
440
|
+
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
441
|
+
})), _dec1 = trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
|
|
442
|
+
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
443
|
+
})), _dec2 = trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
|
|
444
|
+
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
445
|
+
}));
|
|
61
446
|
/**
|
|
62
447
|
* Converts Txs lifted from the P2P module into ProcessedTx objects by executing
|
|
63
448
|
* any public function calls in them. Txs with private calls only are unaffected.
|
|
@@ -69,8 +454,28 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
69
454
|
dateProvider;
|
|
70
455
|
log;
|
|
71
456
|
opts;
|
|
457
|
+
debugLogStore;
|
|
458
|
+
static{
|
|
459
|
+
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
460
|
+
[
|
|
461
|
+
_dec,
|
|
462
|
+
2,
|
|
463
|
+
"processTx"
|
|
464
|
+
],
|
|
465
|
+
[
|
|
466
|
+
_dec1,
|
|
467
|
+
2,
|
|
468
|
+
"processPrivateOnlyTx"
|
|
469
|
+
],
|
|
470
|
+
[
|
|
471
|
+
_dec2,
|
|
472
|
+
2,
|
|
473
|
+
"processTxWithPublicCalls"
|
|
474
|
+
]
|
|
475
|
+
], []));
|
|
476
|
+
}
|
|
72
477
|
metrics;
|
|
73
|
-
constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log =
|
|
478
|
+
constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log, opts = {}, debugLogStore = new NullDebugLogStore()){
|
|
74
479
|
this.globalVariables = globalVariables;
|
|
75
480
|
this.guardedMerkleTree = guardedMerkleTree;
|
|
76
481
|
this.contractsDB = contractsDB;
|
|
@@ -78,6 +483,8 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
78
483
|
this.dateProvider = dateProvider;
|
|
79
484
|
this.log = log;
|
|
80
485
|
this.opts = opts;
|
|
486
|
+
this.debugLogStore = debugLogStore;
|
|
487
|
+
_initProto(this);
|
|
81
488
|
this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
|
|
82
489
|
}
|
|
83
490
|
get tracer() {
|
|
@@ -90,43 +497,52 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
90
497
|
* @param validator - Pre-process validator and nullifier cache to use for processing the txs.
|
|
91
498
|
* @returns The list of processed txs with their circuit simulation outputs.
|
|
92
499
|
*/ async process(txs, limits = {}, validator = {}) {
|
|
93
|
-
const { maxTransactions,
|
|
500
|
+
const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal, signal } = limits;
|
|
94
501
|
const { preprocessValidator, nullifierCache } = validator;
|
|
95
502
|
const result = [];
|
|
96
503
|
const usedTxs = [];
|
|
97
504
|
const failed = [];
|
|
505
|
+
const debugLogs = [];
|
|
98
506
|
const timer = new Timer();
|
|
99
507
|
let totalSizeInBytes = 0;
|
|
100
508
|
let returns = [];
|
|
101
509
|
let totalPublicGas = new Gas(0, 0);
|
|
102
510
|
let totalBlockGas = new Gas(0, 0);
|
|
103
511
|
let totalBlobFields = 0;
|
|
512
|
+
let silentlySkippedCount = 0;
|
|
513
|
+
let totalSilentlySkippedDurationMs = 0;
|
|
104
514
|
for await (const tx of txs){
|
|
105
515
|
// Only process up to the max tx limit
|
|
106
516
|
if (maxTransactions !== undefined && result.length >= maxTransactions) {
|
|
107
517
|
this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
|
|
108
518
|
break;
|
|
109
519
|
}
|
|
110
|
-
// Bail if we've hit the deadline
|
|
520
|
+
// Bail if we've hit the deadline or have been interrupted.
|
|
111
521
|
if (deadline && this.dateProvider.now() > +deadline) {
|
|
112
522
|
this.log.warn(`Stopping tx processing due to timeout.`);
|
|
113
523
|
break;
|
|
114
524
|
}
|
|
115
|
-
|
|
525
|
+
if (signal?.aborted) {
|
|
526
|
+
this.log.warn(`Stopping tx processing due to abort signal.`);
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
116
529
|
const txHash = tx.getTxHash().toString();
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
530
|
+
// Skip this tx if its estimated blob fields would exceed the limit.
|
|
531
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
532
|
+
const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
|
|
533
|
+
if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
534
|
+
this.log.warn(`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`, {
|
|
120
535
|
txHash,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
536
|
+
txBlobFields,
|
|
537
|
+
totalBlobFields,
|
|
538
|
+
maxBlobFields
|
|
124
539
|
});
|
|
125
540
|
continue;
|
|
126
541
|
}
|
|
127
|
-
// Skip this tx if its gas limit would exceed the block gas limit
|
|
542
|
+
// Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
|
|
543
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
128
544
|
const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
129
|
-
if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
545
|
+
if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
130
546
|
this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
|
|
131
547
|
txHash,
|
|
132
548
|
txGasLimit,
|
|
@@ -148,11 +564,6 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
148
564
|
});
|
|
149
565
|
returns.push(new NestedProcessReturnValues([]));
|
|
150
566
|
continue;
|
|
151
|
-
} else if (result.result === 'skipped') {
|
|
152
|
-
const reason = result.reason.join(', ');
|
|
153
|
-
this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
|
|
154
|
-
returns.push(new NestedProcessReturnValues([]));
|
|
155
|
-
continue;
|
|
156
567
|
} else {
|
|
157
568
|
this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
|
|
158
569
|
}
|
|
@@ -166,39 +577,45 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
166
577
|
const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
|
|
167
578
|
this.contractsDB.createCheckpoint();
|
|
168
579
|
try {
|
|
169
|
-
const [processedTx, returnValues] = await this.processTx(tx, deadline);
|
|
580
|
+
const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(()=>this.processTx(tx, deadline, signal));
|
|
170
581
|
// Inject a fake processing failure after N txs if requested
|
|
171
582
|
const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
|
|
172
583
|
if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
|
|
173
584
|
throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
|
|
174
585
|
}
|
|
175
586
|
const txBlobFields = processedTx.txEffect.getNumBlobFields();
|
|
176
|
-
// If the actual size of this tx would exceed block size, skip it
|
|
177
587
|
const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
|
|
178
|
-
|
|
179
|
-
|
|
588
|
+
// If the actual blob fields of this tx would exceed the limit, skip it.
|
|
589
|
+
// Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
|
|
590
|
+
if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
591
|
+
this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
|
|
180
592
|
txHash,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
593
|
+
txBlobFields,
|
|
594
|
+
totalBlobFields,
|
|
595
|
+
maxBlobFields,
|
|
596
|
+
txProcessingTimeMs
|
|
184
597
|
});
|
|
598
|
+
silentlySkippedCount += 1;
|
|
599
|
+
totalSilentlySkippedDurationMs += txProcessingTimeMs;
|
|
600
|
+
this.metrics.recordSilentlySkipped(txProcessingTimeMs);
|
|
185
601
|
// Need to revert the checkpoint here and don't go any further
|
|
186
602
|
await checkpoint.revert();
|
|
187
603
|
this.contractsDB.revertCheckpoint();
|
|
188
604
|
continue;
|
|
189
605
|
}
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
|
|
606
|
+
// During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
|
|
607
|
+
// Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
|
|
608
|
+
// this uses actual gas and stops processing when the limit is exceeded.
|
|
609
|
+
if (!isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)) {
|
|
610
|
+
this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
|
|
193
611
|
txHash,
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
612
|
+
txGas: processedTx.gasUsed.totalGas,
|
|
613
|
+
totalBlockGas,
|
|
614
|
+
maxBlockGas
|
|
197
615
|
});
|
|
198
|
-
// Need to revert the checkpoint here and don't go any further
|
|
199
616
|
await checkpoint.revert();
|
|
200
617
|
this.contractsDB.revertCheckpoint();
|
|
201
|
-
|
|
618
|
+
break;
|
|
202
619
|
}
|
|
203
620
|
// FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
|
|
204
621
|
// I'd rather pass the validators the processedTx as well and let them deal with it.
|
|
@@ -206,42 +623,39 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
206
623
|
result.push(processedTx);
|
|
207
624
|
usedTxs.push(tx);
|
|
208
625
|
returns = returns.concat(returnValues);
|
|
626
|
+
debugLogs.push(...txDebugLogs);
|
|
627
|
+
this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
|
|
209
628
|
totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
|
|
210
629
|
totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
|
|
211
630
|
totalSizeInBytes += txSize;
|
|
212
631
|
totalBlobFields += txBlobFields;
|
|
632
|
+
// Commit the tx-level contracts checkpoint on success
|
|
633
|
+
this.contractsDB.commitCheckpoint();
|
|
213
634
|
} catch (err) {
|
|
214
|
-
if (err
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
//
|
|
218
|
-
// Signal cancellation AND WAIT for the simulation to actually stop.
|
|
219
|
-
// This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
|
|
220
|
-
// and won't check the cancellation flag until that operation completes.
|
|
221
|
-
// Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
|
|
222
|
-
// Wait for C++ to stop gracefully.
|
|
635
|
+
if (isPublicProcessorInterruptError(err)) {
|
|
636
|
+
const interruptReason = err.name === 'PublicProcessorTimeoutError' ? 'timeout' : 'abort signal';
|
|
637
|
+
this.log.warn(`Stopping tx processing due to ${interruptReason}.`);
|
|
638
|
+
// The tx may still be executing on a worker thread (C++ via NAPI).
|
|
639
|
+
// Signal cancellation AND WAIT for the simulation to actually stop before touching fork checkpoints.
|
|
223
640
|
await this.publicTxSimulator.cancel?.();
|
|
224
641
|
// Now stop the guarded fork to prevent any further TS-side access to the world state.
|
|
225
642
|
await this.guardedMerkleTree.stop();
|
|
226
643
|
// We now know there can't be any further access to world state. The fork is in a state where there is:
|
|
227
644
|
// 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
|
|
228
645
|
// 2. Possible state updates on that checkpoint or any others created during execution.
|
|
229
|
-
//
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
await checkpoint.
|
|
233
|
-
// Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
|
|
234
|
-
// This needs to be done directly on the underlying fork as the guarded fork has been stopped.
|
|
235
|
-
await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
|
|
646
|
+
// Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
|
|
647
|
+
// updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
|
|
648
|
+
// created by callers below our depth.
|
|
649
|
+
await checkpoint.revertToCheckpoint();
|
|
236
650
|
// Revert any contracts added to the DB for the tx.
|
|
237
651
|
this.contractsDB.revertCheckpoint();
|
|
238
652
|
// Ensure we're at the same state as when we started processing this tx.
|
|
239
653
|
await this.checkWorldStateUnchanged(startStateReference, txHash, err);
|
|
240
654
|
break;
|
|
241
655
|
}
|
|
242
|
-
// Roll back state to start of TX before proceeding to next TX
|
|
243
|
-
|
|
244
|
-
await
|
|
656
|
+
// Roll back state to start of TX before proceeding to next TX.
|
|
657
|
+
// Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
|
|
658
|
+
await checkpoint.revertToCheckpoint();
|
|
245
659
|
this.contractsDB.revertCheckpoint();
|
|
246
660
|
const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
|
|
247
661
|
this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
|
|
@@ -255,24 +669,30 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
255
669
|
} finally{
|
|
256
670
|
// Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
|
|
257
671
|
await checkpoint.commit();
|
|
258
|
-
this.contractsDB.commitCheckpointOkIfNone();
|
|
259
672
|
}
|
|
260
673
|
}
|
|
261
674
|
const duration = timer.s();
|
|
262
675
|
const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
|
|
263
676
|
this.metrics.recordAllTxs(totalPublicGas, rate);
|
|
264
|
-
|
|
677
|
+
const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
|
|
678
|
+
this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs ` + `(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` + `in ${duration}s`, {
|
|
679
|
+
blockNumber: this.globalVariables.blockNumber,
|
|
680
|
+
successfulCount: result.length,
|
|
681
|
+
failedCount: failed.length,
|
|
265
682
|
duration,
|
|
266
683
|
rate,
|
|
267
684
|
totalPublicGas,
|
|
268
685
|
totalBlockGas,
|
|
269
|
-
totalSizeInBytes
|
|
686
|
+
totalSizeInBytes,
|
|
687
|
+
silentlySkippedCount,
|
|
688
|
+
silentlySkippedDurationMs
|
|
270
689
|
});
|
|
271
690
|
return [
|
|
272
691
|
result,
|
|
273
692
|
failed,
|
|
274
693
|
usedTxs,
|
|
275
|
-
returns
|
|
694
|
+
returns,
|
|
695
|
+
debugLogs
|
|
276
696
|
];
|
|
277
697
|
}
|
|
278
698
|
async checkWorldStateUnchanged(startStateReference, txHash, cause) {
|
|
@@ -288,8 +708,8 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
288
708
|
});
|
|
289
709
|
}
|
|
290
710
|
}
|
|
291
|
-
async processTx(tx, deadline) {
|
|
292
|
-
const [time, [processedTx, returnValues]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
|
|
711
|
+
async processTx(tx, deadline, signal) {
|
|
712
|
+
const [time, [processedTx, returnValues, debugLogs]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline, signal));
|
|
293
713
|
this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`, {
|
|
294
714
|
txHash: processedTx.hash,
|
|
295
715
|
txFee: processedTx.txEffect.transactionFee.toBigInt(),
|
|
@@ -307,7 +727,8 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
307
727
|
});
|
|
308
728
|
return [
|
|
309
729
|
processedTx,
|
|
310
|
-
returnValues ?? []
|
|
730
|
+
returnValues ?? [],
|
|
731
|
+
debugLogs
|
|
311
732
|
];
|
|
312
733
|
}
|
|
313
734
|
async doTreeInsertionsForPrivateOnlyTx(processedTx) {
|
|
@@ -329,7 +750,7 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
329
750
|
const treeInsertionEnd = process.hrtime.bigint();
|
|
330
751
|
this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
|
|
331
752
|
}
|
|
332
|
-
/** Processes the given tx within deadline
|
|
753
|
+
/** Processes the given tx within deadline or until the signal is aborted. */ async processTxWithinDeadline(tx, deadline, signal) {
|
|
333
754
|
const innerProcessFn = tx.hasPublicCalls() ? ()=>this.processTxWithPublicCalls(tx) : ()=>this.processPrivateOnlyTx(tx);
|
|
334
755
|
// Fake a delay per tx if instructed (used for tests)
|
|
335
756
|
const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
|
|
@@ -339,20 +760,31 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
339
760
|
await sleep(fakeDelayPerTxMs);
|
|
340
761
|
return result;
|
|
341
762
|
} : innerProcessFn;
|
|
342
|
-
|
|
763
|
+
const processingSignal = this.getProcessingSignal(tx, deadline, signal);
|
|
764
|
+
if (!processingSignal) {
|
|
343
765
|
return await processFn();
|
|
344
766
|
}
|
|
345
|
-
|
|
767
|
+
return await execWithSignal(()=>processFn(), processingSignal, (signal)=>signal.reason?.name === 'TimeoutError' ? new PublicProcessorTimeoutError() : new PublicProcessorAbortError());
|
|
768
|
+
}
|
|
769
|
+
getProcessingSignal(tx, deadline, signal) {
|
|
770
|
+
if (!deadline) {
|
|
771
|
+
return signal;
|
|
772
|
+
}
|
|
346
773
|
const timeout = +deadline - this.dateProvider.now();
|
|
347
774
|
if (timeout <= 0) {
|
|
348
775
|
throw new PublicProcessorTimeoutError();
|
|
349
776
|
}
|
|
777
|
+
const txHash = tx.getTxHash();
|
|
350
778
|
this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
|
|
351
779
|
deadline: deadline.toISOString(),
|
|
352
780
|
now: new Date(this.dateProvider.now()).toISOString(),
|
|
353
781
|
txHash
|
|
354
782
|
});
|
|
355
|
-
|
|
783
|
+
const timeoutSignal = AbortSignal.timeout(timeout);
|
|
784
|
+
return signal ? AbortSignal.any([
|
|
785
|
+
signal,
|
|
786
|
+
timeoutSignal
|
|
787
|
+
]) : timeoutSignal;
|
|
356
788
|
}
|
|
357
789
|
/**
|
|
358
790
|
* Creates the public data write for paying the tx fee.
|
|
@@ -381,10 +813,11 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
381
813
|
this.metrics.recordClassPublication(...tx.getContractClassLogs().filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
|
|
382
814
|
// Fee payment insertion has already been done. Do the rest.
|
|
383
815
|
await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
|
|
384
|
-
|
|
816
|
+
this.contractsDB.addNewContracts(tx);
|
|
385
817
|
return [
|
|
386
818
|
processedTx,
|
|
387
|
-
undefined
|
|
819
|
+
undefined,
|
|
820
|
+
[]
|
|
388
821
|
];
|
|
389
822
|
}
|
|
390
823
|
async processTxWithPublicCalls(tx) {
|
|
@@ -406,7 +839,8 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
406
839
|
const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, this.globalVariables, avmProvingRequest, publicTxEffect, gasUsed, revertCode, revertReason);
|
|
407
840
|
return [
|
|
408
841
|
processedTx,
|
|
409
|
-
appLogicReturnValues
|
|
842
|
+
appLogicReturnValues,
|
|
843
|
+
result.logs ?? []
|
|
410
844
|
];
|
|
411
845
|
}
|
|
412
846
|
/**
|
|
@@ -418,18 +852,3 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
418
852
|
};
|
|
419
853
|
}
|
|
420
854
|
}
|
|
421
|
-
_ts_decorate([
|
|
422
|
-
trackSpan('PublicProcessor.processTx', (tx)=>({
|
|
423
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
424
|
-
}))
|
|
425
|
-
], PublicProcessor.prototype, "processTx", null);
|
|
426
|
-
_ts_decorate([
|
|
427
|
-
trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
|
|
428
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
429
|
-
}))
|
|
430
|
-
], PublicProcessor.prototype, "processPrivateOnlyTx", null);
|
|
431
|
-
_ts_decorate([
|
|
432
|
-
trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
|
|
433
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
434
|
-
}))
|
|
435
|
-
], PublicProcessor.prototype, "processTxWithPublicCalls", null);
|