@aztec/simulator 0.61.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/acvm/acvm.d.ts +2 -16
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +2 -70
- package/dest/acvm/oracle/oracle.d.ts +4 -3
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +11 -9
- package/dest/acvm/oracle/typed_oracle.d.ts +5 -4
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +9 -6
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +4 -3
- package/dest/avm/avm_machine_state.d.ts +27 -8
- package/dest/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/avm/avm_machine_state.js +6 -10
- package/dest/avm/avm_memory_types.d.ts +8 -0
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +5 -1
- package/dest/avm/avm_simulator.d.ts +2 -19
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +12 -14
- package/dest/avm/avm_tree.d.ts +249 -0
- package/dest/avm/avm_tree.d.ts.map +1 -0
- package/dest/avm/avm_tree.js +637 -0
- package/dest/avm/errors.d.ts +4 -17
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +21 -50
- package/dest/avm/fixtures/index.d.ts +7 -2
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +12 -12
- package/dest/avm/index.d.ts +1 -0
- package/dest/avm/index.d.ts.map +1 -1
- package/dest/avm/index.js +2 -1
- package/dest/avm/journal/journal.d.ts +43 -24
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +172 -39
- package/dest/avm/journal/nullifiers.d.ts +5 -4
- package/dest/avm/journal/nullifiers.d.ts.map +1 -1
- package/dest/avm/journal/nullifiers.js +2 -3
- package/dest/avm/journal/public_storage.d.ts +6 -5
- package/dest/avm/journal/public_storage.d.ts.map +1 -1
- package/dest/avm/journal/public_storage.js +1 -1
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +4 -10
- package/dest/avm/opcodes/arithmetic.d.ts +4 -1
- package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/avm/opcodes/arithmetic.js +18 -4
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +1 -3
- package/dest/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/avm/opcodes/comparators.js +1 -2
- package/dest/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/avm/opcodes/contract.js +2 -3
- package/dest/avm/opcodes/control_flow.d.ts +4 -0
- package/dest/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/avm/opcodes/control_flow.js +26 -11
- package/dest/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/avm/opcodes/conversion.js +1 -2
- package/dest/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/avm/opcodes/ec_add.js +5 -11
- package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/avm/opcodes/environment_getters.js +1 -2
- package/dest/avm/opcodes/external_calls.d.ts +4 -2
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +38 -22
- package/dest/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/avm/opcodes/hashing.js +1 -4
- package/dest/avm/opcodes/instruction.d.ts +4 -0
- package/dest/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction.js +7 -1
- package/dest/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/avm/opcodes/memory.js +1 -7
- package/dest/avm/opcodes/misc.js +3 -3
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -1
- package/dest/avm/opcodes/multi_scalar_mul.js +6 -5
- package/dest/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/avm/opcodes/storage.js +2 -4
- package/dest/avm/serialization/bytecode_serialization.d.ts +1 -6
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +24 -20
- package/dest/avm/serialization/instruction_serialization.d.ts +2 -2
- package/dest/avm/serialization/instruction_serialization.js +2 -2
- package/dest/client/client_execution_context.d.ts +7 -10
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +19 -18
- package/dest/client/db_oracle.d.ts +22 -8
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/db_oracle.js +1 -1
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +5 -4
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +3 -2
- package/dest/client/view_data_oracle.d.ts +6 -12
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +10 -12
- package/dest/common/errors.d.ts +15 -2
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +85 -4
- package/dest/mocks/fixtures.d.ts +9 -28
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +12 -57
- package/dest/public/dual_side_effect_trace.d.ts +34 -26
- package/dest/public/dual_side_effect_trace.d.ts.map +1 -1
- package/dest/public/dual_side_effect_trace.js +48 -36
- package/dest/public/enqueued_call_side_effect_trace.d.ts +96 -33
- package/dest/public/enqueued_call_side_effect_trace.d.ts.map +1 -1
- package/dest/public/enqueued_call_side_effect_trace.js +212 -138
- package/dest/public/execution.d.ts +50 -17
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -29
- package/dest/public/executor.d.ts +28 -11
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +33 -33
- package/dest/public/index.d.ts +4 -5
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +4 -5
- package/dest/public/public_db_sources.d.ts +1 -0
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +21 -19
- package/dest/public/public_processor.d.ts +7 -11
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +60 -42
- package/dest/public/public_processor_metrics.d.ts +3 -3
- package/dest/public/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor_metrics.js +1 -1
- package/dest/public/public_tx_context.d.ts +130 -0
- package/dest/public/public_tx_context.d.ts.map +1 -0
- package/dest/public/public_tx_context.js +293 -0
- package/dest/public/public_tx_simulator.d.ts +36 -0
- package/dest/public/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator.js +148 -0
- package/dest/public/side_effect_trace.d.ts +30 -15
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +70 -16
- package/dest/public/side_effect_trace_interface.d.ts +43 -12
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/transitional_adapters.d.ts +9 -0
- package/dest/public/transitional_adapters.d.ts.map +1 -0
- package/dest/public/transitional_adapters.js +127 -0
- package/dest/public/utils.d.ts +5 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +30 -0
- package/dest/test/utils.d.ts +2 -2
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +4 -4
- package/package.json +12 -9
- package/src/acvm/acvm.ts +3 -94
- package/src/acvm/oracle/oracle.ts +14 -12
- package/src/acvm/oracle/typed_oracle.ts +10 -6
- package/src/avm/avm_gas.ts +3 -2
- package/src/avm/avm_machine_state.ts +28 -12
- package/src/avm/avm_memory_types.ts +5 -0
- package/src/avm/avm_simulator.ts +13 -16
- package/src/avm/avm_tree.ts +785 -0
- package/src/avm/errors.ts +25 -48
- package/src/avm/fixtures/index.ts +16 -12
- package/src/avm/index.ts +1 -0
- package/src/avm/journal/journal.ts +291 -52
- package/src/avm/journal/nullifiers.ts +7 -7
- package/src/avm/journal/public_storage.ts +5 -5
- package/src/avm/opcodes/accrued_substate.ts +3 -9
- package/src/avm/opcodes/arithmetic.ts +26 -4
- package/src/avm/opcodes/bitwise.ts +0 -2
- package/src/avm/opcodes/comparators.ts +0 -1
- package/src/avm/opcodes/contract.ts +1 -2
- package/src/avm/opcodes/control_flow.ts +29 -10
- package/src/avm/opcodes/conversion.ts +0 -1
- package/src/avm/opcodes/ec_add.ts +6 -9
- package/src/avm/opcodes/environment_getters.ts +0 -1
- package/src/avm/opcodes/external_calls.ts +39 -21
- package/src/avm/opcodes/hashing.ts +0 -3
- package/src/avm/opcodes/instruction.ts +7 -0
- package/src/avm/opcodes/memory.ts +0 -6
- package/src/avm/opcodes/misc.ts +2 -2
- package/src/avm/opcodes/multi_scalar_mul.ts +5 -4
- package/src/avm/opcodes/storage.ts +1 -3
- package/src/avm/serialization/bytecode_serialization.ts +31 -22
- package/src/avm/serialization/instruction_serialization.ts +2 -2
- package/src/client/client_execution_context.ts +24 -21
- package/src/client/db_oracle.ts +31 -8
- package/src/client/private_execution.ts +5 -4
- package/src/client/unconstrained_execution.ts +2 -1
- package/src/client/view_data_oracle.ts +14 -13
- package/src/common/errors.ts +119 -3
- package/src/mocks/fixtures.ts +15 -106
- package/src/public/dual_side_effect_trace.ts +138 -50
- package/src/public/enqueued_call_side_effect_trace.ts +352 -212
- package/src/public/execution.ts +58 -42
- package/src/public/executor.ts +52 -67
- package/src/public/index.ts +7 -5
- package/src/public/public_db_sources.ts +22 -19
- package/src/public/public_processor.ts +111 -73
- package/src/public/public_processor_metrics.ts +3 -3
- package/src/public/public_tx_context.ts +411 -0
- package/src/public/public_tx_simulator.ts +232 -0
- package/src/public/side_effect_trace.ts +154 -28
- package/src/public/side_effect_trace_interface.ts +92 -14
- package/src/public/transitional_adapters.ts +347 -0
- package/src/public/utils.ts +32 -0
- package/src/test/utils.ts +9 -2
- package/dest/public/enqueued_call_simulator.d.ts +0 -43
- package/dest/public/enqueued_call_simulator.d.ts.map +0 -1
- package/dest/public/enqueued_call_simulator.js +0 -156
- package/dest/public/enqueued_calls_processor.d.ts +0 -43
- package/dest/public/enqueued_calls_processor.d.ts.map +0 -1
- package/dest/public/enqueued_calls_processor.js +0 -209
- package/dest/public/hints_builder.d.ts +0 -29
- package/dest/public/hints_builder.d.ts.map +0 -1
- package/dest/public/hints_builder.js +0 -75
- package/dest/public/public_kernel.d.ts +0 -30
- package/dest/public/public_kernel.d.ts.map +0 -1
- package/dest/public/public_kernel.js +0 -67
- package/dest/public/public_kernel_circuit_simulator.d.ts +0 -25
- package/dest/public/public_kernel_circuit_simulator.d.ts.map +0 -1
- package/dest/public/public_kernel_circuit_simulator.js +0 -2
- package/dest/public/public_kernel_tail_simulator.d.ts +0 -15
- package/dest/public/public_kernel_tail_simulator.d.ts.map +0 -1
- package/dest/public/public_kernel_tail_simulator.js +0 -39
- package/src/public/enqueued_call_simulator.ts +0 -360
- package/src/public/enqueued_calls_processor.ts +0 -372
- package/src/public/hints_builder.ts +0 -168
- package/src/public/public_kernel.ts +0 -100
- package/src/public/public_kernel_circuit_simulator.ts +0 -32
- package/src/public/public_kernel_tail_simulator.ts +0 -97
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { type AvmProvingRequest, ProvingRequestType, type PublicExecutionRequest } from '@aztec/circuit-types';
|
|
2
|
+
import {
|
|
3
|
+
AvmCircuitInputs,
|
|
4
|
+
AvmCircuitPublicInputs,
|
|
5
|
+
AztecAddress,
|
|
6
|
+
ContractStorageRead,
|
|
7
|
+
ContractStorageUpdateRequest,
|
|
8
|
+
Fr,
|
|
9
|
+
Gas,
|
|
10
|
+
type GasSettings,
|
|
11
|
+
type GlobalVariables,
|
|
12
|
+
type Header,
|
|
13
|
+
L2ToL1Message,
|
|
14
|
+
LogHash,
|
|
15
|
+
MAX_ENQUEUED_CALLS_PER_CALL,
|
|
16
|
+
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL,
|
|
17
|
+
MAX_L2_TO_L1_MSGS_PER_CALL,
|
|
18
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
19
|
+
MAX_NOTE_HASHES_PER_CALL,
|
|
20
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
21
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,
|
|
22
|
+
MAX_NULLIFIERS_PER_CALL,
|
|
23
|
+
MAX_NULLIFIERS_PER_TX,
|
|
24
|
+
MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
|
|
25
|
+
MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
|
|
26
|
+
MAX_PUBLIC_DATA_READS_PER_CALL,
|
|
27
|
+
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
|
|
28
|
+
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
29
|
+
MAX_UNENCRYPTED_LOGS_PER_CALL,
|
|
30
|
+
NoteHash,
|
|
31
|
+
Nullifier,
|
|
32
|
+
PrivateToAvmAccumulatedData,
|
|
33
|
+
PrivateToAvmAccumulatedDataArrayLengths,
|
|
34
|
+
type PrivateToPublicAccumulatedData,
|
|
35
|
+
PublicCallRequest,
|
|
36
|
+
PublicCircuitPublicInputs,
|
|
37
|
+
PublicDataWrite,
|
|
38
|
+
PublicInnerCallRequest,
|
|
39
|
+
ReadRequest,
|
|
40
|
+
RevertCode,
|
|
41
|
+
type StateReference,
|
|
42
|
+
TreeLeafReadRequest,
|
|
43
|
+
TreeSnapshots,
|
|
44
|
+
countAccumulatedItems,
|
|
45
|
+
mergeAccumulatedData,
|
|
46
|
+
} from '@aztec/circuits.js';
|
|
47
|
+
import { computeNoteHashNonce, computeUniqueNoteHash, computeVarArgsHash, siloNoteHash } from '@aztec/circuits.js/hash';
|
|
48
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
49
|
+
import { assertLength } from '@aztec/foundation/serialize';
|
|
50
|
+
|
|
51
|
+
import { AvmContractCallResult } from '../avm/avm_contract_call_result.js';
|
|
52
|
+
import { type AvmPersistableStateManager } from '../avm/journal/journal.js';
|
|
53
|
+
import { getPublicFunctionDebugName } from '../common/debug_fn_name.js';
|
|
54
|
+
import { type PublicEnqueuedCallSideEffectTrace } from './enqueued_call_side_effect_trace.js';
|
|
55
|
+
import { type EnqueuedPublicCallExecutionResult, type PublicFunctionCallResult } from './execution.js';
|
|
56
|
+
import { createAvmExecutionEnvironment } from './executor.js';
|
|
57
|
+
import { type WorldStateDB } from './public_db_sources.js';
|
|
58
|
+
|
|
59
|
+
export function generateAvmCircuitPublicInputs(
|
|
60
|
+
trace: PublicEnqueuedCallSideEffectTrace,
|
|
61
|
+
globalVariables: GlobalVariables,
|
|
62
|
+
startStateReference: StateReference,
|
|
63
|
+
startGasUsed: Gas,
|
|
64
|
+
gasSettings: GasSettings,
|
|
65
|
+
setupCallRequests: PublicCallRequest[],
|
|
66
|
+
appLogicCallRequests: PublicCallRequest[],
|
|
67
|
+
teardownCallRequests: PublicCallRequest[],
|
|
68
|
+
nonRevertibleAccumulatedDataFromPrivate: PrivateToPublicAccumulatedData,
|
|
69
|
+
revertibleAccumulatedDataFromPrivate: PrivateToPublicAccumulatedData,
|
|
70
|
+
endStateReference: StateReference,
|
|
71
|
+
endGasUsed: Gas,
|
|
72
|
+
transactionFee: Fr,
|
|
73
|
+
revertCode: RevertCode,
|
|
74
|
+
): AvmCircuitPublicInputs {
|
|
75
|
+
const startTreeSnapshots = new TreeSnapshots(
|
|
76
|
+
startStateReference.l1ToL2MessageTree,
|
|
77
|
+
startStateReference.partial.noteHashTree,
|
|
78
|
+
startStateReference.partial.nullifierTree,
|
|
79
|
+
startStateReference.partial.publicDataTree,
|
|
80
|
+
);
|
|
81
|
+
const endTreeSnapshots = new TreeSnapshots(
|
|
82
|
+
endStateReference.l1ToL2MessageTree,
|
|
83
|
+
endStateReference.partial.noteHashTree,
|
|
84
|
+
endStateReference.partial.nullifierTree,
|
|
85
|
+
endStateReference.partial.publicDataTree,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const avmCircuitPublicInputs = trace.toAvmCircuitPublicInputs(
|
|
89
|
+
globalVariables,
|
|
90
|
+
startTreeSnapshots,
|
|
91
|
+
startGasUsed,
|
|
92
|
+
gasSettings,
|
|
93
|
+
setupCallRequests,
|
|
94
|
+
appLogicCallRequests,
|
|
95
|
+
teardownCallRequests.length ? teardownCallRequests[0] : PublicCallRequest.empty(),
|
|
96
|
+
endTreeSnapshots,
|
|
97
|
+
endGasUsed,
|
|
98
|
+
transactionFee,
|
|
99
|
+
!revertCode.isOK(),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const getArrayLengths = (from: PrivateToPublicAccumulatedData) =>
|
|
103
|
+
new PrivateToAvmAccumulatedDataArrayLengths(
|
|
104
|
+
countAccumulatedItems(from.noteHashes),
|
|
105
|
+
countAccumulatedItems(from.nullifiers),
|
|
106
|
+
countAccumulatedItems(from.l2ToL1Msgs),
|
|
107
|
+
);
|
|
108
|
+
const convertAccumulatedData = (from: PrivateToPublicAccumulatedData) =>
|
|
109
|
+
new PrivateToAvmAccumulatedData(from.noteHashes, from.nullifiers, from.l2ToL1Msgs);
|
|
110
|
+
// Temporary overrides as these entries aren't yet populated in trace
|
|
111
|
+
avmCircuitPublicInputs.previousNonRevertibleAccumulatedDataArrayLengths = getArrayLengths(
|
|
112
|
+
nonRevertibleAccumulatedDataFromPrivate,
|
|
113
|
+
);
|
|
114
|
+
avmCircuitPublicInputs.previousRevertibleAccumulatedDataArrayLengths = getArrayLengths(
|
|
115
|
+
revertibleAccumulatedDataFromPrivate,
|
|
116
|
+
);
|
|
117
|
+
avmCircuitPublicInputs.previousNonRevertibleAccumulatedData = convertAccumulatedData(
|
|
118
|
+
nonRevertibleAccumulatedDataFromPrivate,
|
|
119
|
+
);
|
|
120
|
+
avmCircuitPublicInputs.previousRevertibleAccumulatedData = convertAccumulatedData(
|
|
121
|
+
revertibleAccumulatedDataFromPrivate,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// merge all revertible & non-revertible side effects into output accumulated data
|
|
125
|
+
const noteHashesFromPrivate = revertCode.isOK()
|
|
126
|
+
? mergeAccumulatedData(
|
|
127
|
+
avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes,
|
|
128
|
+
avmCircuitPublicInputs.previousRevertibleAccumulatedData.noteHashes,
|
|
129
|
+
)
|
|
130
|
+
: avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes;
|
|
131
|
+
avmCircuitPublicInputs.accumulatedData.noteHashes = assertLength(
|
|
132
|
+
mergeAccumulatedData(noteHashesFromPrivate, avmCircuitPublicInputs.accumulatedData.noteHashes),
|
|
133
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const txHash = avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.nullifiers[0];
|
|
137
|
+
|
|
138
|
+
const scopedNoteHashesFromPublic = trace.getSideEffects().noteHashes;
|
|
139
|
+
for (let i = 0; i < scopedNoteHashesFromPublic.length; i++) {
|
|
140
|
+
const scopedNoteHash = scopedNoteHashesFromPublic[i];
|
|
141
|
+
const noteHash = scopedNoteHash.value;
|
|
142
|
+
if (!noteHash.isZero()) {
|
|
143
|
+
const noteHashIndexInTx = i + countAccumulatedItems(noteHashesFromPrivate);
|
|
144
|
+
const nonce = computeNoteHashNonce(txHash, noteHashIndexInTx);
|
|
145
|
+
const uniqueNoteHash = computeUniqueNoteHash(nonce, noteHash);
|
|
146
|
+
const siloedNoteHash = siloNoteHash(scopedNoteHash.contractAddress, uniqueNoteHash);
|
|
147
|
+
avmCircuitPublicInputs.accumulatedData.noteHashes[noteHashIndexInTx] = siloedNoteHash;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const nullifiersFromPrivate = revertCode.isOK()
|
|
152
|
+
? mergeAccumulatedData(
|
|
153
|
+
avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.nullifiers,
|
|
154
|
+
avmCircuitPublicInputs.previousRevertibleAccumulatedData.nullifiers,
|
|
155
|
+
)
|
|
156
|
+
: avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.nullifiers;
|
|
157
|
+
avmCircuitPublicInputs.accumulatedData.nullifiers = assertLength(
|
|
158
|
+
mergeAccumulatedData(nullifiersFromPrivate, avmCircuitPublicInputs.accumulatedData.nullifiers),
|
|
159
|
+
MAX_NULLIFIERS_PER_TX,
|
|
160
|
+
);
|
|
161
|
+
const msgsFromPrivate = revertCode.isOK()
|
|
162
|
+
? mergeAccumulatedData(
|
|
163
|
+
avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.l2ToL1Msgs,
|
|
164
|
+
avmCircuitPublicInputs.previousRevertibleAccumulatedData.l2ToL1Msgs,
|
|
165
|
+
)
|
|
166
|
+
: avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.l2ToL1Msgs;
|
|
167
|
+
avmCircuitPublicInputs.accumulatedData.l2ToL1Msgs = assertLength(
|
|
168
|
+
mergeAccumulatedData(msgsFromPrivate, avmCircuitPublicInputs.accumulatedData.l2ToL1Msgs),
|
|
169
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
const dedupedPublicDataWrites: Array<PublicDataWrite> = [];
|
|
173
|
+
const leafSlotOccurences: Map<bigint, number> = new Map();
|
|
174
|
+
for (const publicDataWrite of avmCircuitPublicInputs.accumulatedData.publicDataWrites) {
|
|
175
|
+
const slot = publicDataWrite.leafSlot.toBigInt();
|
|
176
|
+
const prevOccurrences = leafSlotOccurences.get(slot) || 0;
|
|
177
|
+
leafSlotOccurences.set(slot, prevOccurrences + 1);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
for (const publicDataWrite of avmCircuitPublicInputs.accumulatedData.publicDataWrites) {
|
|
181
|
+
const slot = publicDataWrite.leafSlot.toBigInt();
|
|
182
|
+
const prevOccurrences = leafSlotOccurences.get(slot) || 0;
|
|
183
|
+
if (prevOccurrences === 1) {
|
|
184
|
+
dedupedPublicDataWrites.push(publicDataWrite);
|
|
185
|
+
} else {
|
|
186
|
+
leafSlotOccurences.set(slot, prevOccurrences - 1);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
avmCircuitPublicInputs.accumulatedData.publicDataWrites = padArrayEnd(
|
|
191
|
+
dedupedPublicDataWrites,
|
|
192
|
+
PublicDataWrite.empty(),
|
|
193
|
+
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
194
|
+
);
|
|
195
|
+
//console.log(`AvmCircuitPublicInputs:\n${inspect(avmCircuitPublicInputs)}`);
|
|
196
|
+
return avmCircuitPublicInputs;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export async function generateAvmProvingRequest(
|
|
200
|
+
real: boolean,
|
|
201
|
+
worldStateDB: WorldStateDB,
|
|
202
|
+
stateManager: AvmPersistableStateManager,
|
|
203
|
+
historicalHeader: Header,
|
|
204
|
+
globalVariables: GlobalVariables,
|
|
205
|
+
executionRequest: PublicExecutionRequest,
|
|
206
|
+
result: EnqueuedPublicCallExecutionResult,
|
|
207
|
+
allocatedGas: Gas,
|
|
208
|
+
transactionFee: Fr,
|
|
209
|
+
): Promise<AvmProvingRequest> {
|
|
210
|
+
const fnName = await getPublicFunctionDebugName(
|
|
211
|
+
worldStateDB,
|
|
212
|
+
executionRequest.callContext.contractAddress,
|
|
213
|
+
executionRequest.callContext.functionSelector,
|
|
214
|
+
executionRequest.args,
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
const avmExecutionEnv = createAvmExecutionEnvironment(executionRequest, globalVariables, transactionFee);
|
|
218
|
+
const avmCallResult = new AvmContractCallResult(result.reverted, result.returnValues);
|
|
219
|
+
|
|
220
|
+
// Generate an AVM proving request
|
|
221
|
+
let avmProvingRequest: AvmProvingRequest;
|
|
222
|
+
if (real) {
|
|
223
|
+
const deprecatedFunctionCallResult = stateManager.trace.toPublicFunctionCallResult(
|
|
224
|
+
avmExecutionEnv,
|
|
225
|
+
/*startGasLeft=*/ allocatedGas,
|
|
226
|
+
/*endGasLeft=*/ Gas.from(result.endGasLeft),
|
|
227
|
+
Buffer.alloc(0),
|
|
228
|
+
avmCallResult,
|
|
229
|
+
fnName,
|
|
230
|
+
);
|
|
231
|
+
const publicInputs = getPublicCircuitPublicInputs(historicalHeader, globalVariables, deprecatedFunctionCallResult);
|
|
232
|
+
avmProvingRequest = makeAvmProvingRequest(publicInputs, deprecatedFunctionCallResult);
|
|
233
|
+
} else {
|
|
234
|
+
avmProvingRequest = emptyAvmProvingRequest();
|
|
235
|
+
}
|
|
236
|
+
return avmProvingRequest;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function emptyAvmProvingRequest(): AvmProvingRequest {
|
|
240
|
+
return {
|
|
241
|
+
type: ProvingRequestType.PUBLIC_VM,
|
|
242
|
+
inputs: AvmCircuitInputs.empty(),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function makeAvmProvingRequest(inputs: PublicCircuitPublicInputs, result: PublicFunctionCallResult): AvmProvingRequest {
|
|
246
|
+
return {
|
|
247
|
+
type: ProvingRequestType.PUBLIC_VM,
|
|
248
|
+
inputs: new AvmCircuitInputs(
|
|
249
|
+
result.functionName,
|
|
250
|
+
result.calldata,
|
|
251
|
+
inputs,
|
|
252
|
+
result.avmCircuitHints,
|
|
253
|
+
AvmCircuitPublicInputs.empty(),
|
|
254
|
+
),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function getPublicCircuitPublicInputs(
|
|
259
|
+
historicalHeader: Header,
|
|
260
|
+
globalVariables: GlobalVariables,
|
|
261
|
+
result: PublicFunctionCallResult,
|
|
262
|
+
) {
|
|
263
|
+
const header = historicalHeader.clone(); // don't modify the original
|
|
264
|
+
header.state.partial.publicDataTree.root = Fr.zero(); // AVM doesn't check this yet
|
|
265
|
+
|
|
266
|
+
return PublicCircuitPublicInputs.from({
|
|
267
|
+
callContext: result.executionRequest.callContext,
|
|
268
|
+
proverAddress: AztecAddress.ZERO,
|
|
269
|
+
argsHash: computeVarArgsHash(result.executionRequest.args),
|
|
270
|
+
noteHashes: padArrayEnd(
|
|
271
|
+
result.noteHashes,
|
|
272
|
+
NoteHash.empty(),
|
|
273
|
+
MAX_NOTE_HASHES_PER_CALL,
|
|
274
|
+
`Too many note hashes. Got ${result.noteHashes.length} with max being ${MAX_NOTE_HASHES_PER_CALL}`,
|
|
275
|
+
),
|
|
276
|
+
nullifiers: padArrayEnd(
|
|
277
|
+
result.nullifiers,
|
|
278
|
+
Nullifier.empty(),
|
|
279
|
+
MAX_NULLIFIERS_PER_CALL,
|
|
280
|
+
`Too many nullifiers. Got ${result.nullifiers.length} with max being ${MAX_NULLIFIERS_PER_CALL}`,
|
|
281
|
+
),
|
|
282
|
+
l2ToL1Msgs: padArrayEnd(
|
|
283
|
+
result.l2ToL1Messages,
|
|
284
|
+
L2ToL1Message.empty(),
|
|
285
|
+
MAX_L2_TO_L1_MSGS_PER_CALL,
|
|
286
|
+
`Too many L2 to L1 messages. Got ${result.l2ToL1Messages.length} with max being ${MAX_L2_TO_L1_MSGS_PER_CALL}`,
|
|
287
|
+
),
|
|
288
|
+
startSideEffectCounter: result.startSideEffectCounter,
|
|
289
|
+
endSideEffectCounter: result.endSideEffectCounter,
|
|
290
|
+
returnsHash: computeVarArgsHash(result.returnValues),
|
|
291
|
+
noteHashReadRequests: padArrayEnd(
|
|
292
|
+
result.noteHashReadRequests,
|
|
293
|
+
TreeLeafReadRequest.empty(),
|
|
294
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,
|
|
295
|
+
`Too many note hash read requests. Got ${result.noteHashReadRequests.length} with max being ${MAX_NOTE_HASH_READ_REQUESTS_PER_CALL}`,
|
|
296
|
+
),
|
|
297
|
+
nullifierReadRequests: padArrayEnd(
|
|
298
|
+
result.nullifierReadRequests,
|
|
299
|
+
ReadRequest.empty(),
|
|
300
|
+
MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
|
|
301
|
+
`Too many nullifier read requests. Got ${result.nullifierReadRequests.length} with max being ${MAX_NULLIFIER_READ_REQUESTS_PER_CALL}`,
|
|
302
|
+
),
|
|
303
|
+
nullifierNonExistentReadRequests: padArrayEnd(
|
|
304
|
+
result.nullifierNonExistentReadRequests,
|
|
305
|
+
ReadRequest.empty(),
|
|
306
|
+
MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
|
|
307
|
+
`Too many nullifier non-existent read requests. Got ${result.nullifierNonExistentReadRequests.length} with max being ${MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL}`,
|
|
308
|
+
),
|
|
309
|
+
l1ToL2MsgReadRequests: padArrayEnd(
|
|
310
|
+
result.l1ToL2MsgReadRequests,
|
|
311
|
+
TreeLeafReadRequest.empty(),
|
|
312
|
+
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL,
|
|
313
|
+
`Too many L1 to L2 message read requests. Got ${result.l1ToL2MsgReadRequests.length} with max being ${MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL}`,
|
|
314
|
+
),
|
|
315
|
+
contractStorageReads: padArrayEnd(
|
|
316
|
+
result.contractStorageReads,
|
|
317
|
+
ContractStorageRead.empty(),
|
|
318
|
+
MAX_PUBLIC_DATA_READS_PER_CALL,
|
|
319
|
+
`Too many public data reads. Got ${result.contractStorageReads.length} with max being ${MAX_PUBLIC_DATA_READS_PER_CALL}`,
|
|
320
|
+
),
|
|
321
|
+
contractStorageUpdateRequests: padArrayEnd(
|
|
322
|
+
result.contractStorageUpdateRequests,
|
|
323
|
+
ContractStorageUpdateRequest.empty(),
|
|
324
|
+
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
|
|
325
|
+
`Too many public data update requests. Got ${result.contractStorageUpdateRequests.length} with max being ${MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL}`,
|
|
326
|
+
),
|
|
327
|
+
publicCallRequests: padArrayEnd(
|
|
328
|
+
result.publicCallRequests,
|
|
329
|
+
PublicInnerCallRequest.empty(),
|
|
330
|
+
MAX_ENQUEUED_CALLS_PER_CALL,
|
|
331
|
+
`Too many public call requests. Got ${result.publicCallRequests.length} with max being ${MAX_ENQUEUED_CALLS_PER_CALL}`,
|
|
332
|
+
),
|
|
333
|
+
unencryptedLogsHashes: padArrayEnd(
|
|
334
|
+
result.unencryptedLogsHashes,
|
|
335
|
+
LogHash.empty(),
|
|
336
|
+
MAX_UNENCRYPTED_LOGS_PER_CALL,
|
|
337
|
+
`Too many unencrypted logs. Got ${result.unencryptedLogsHashes.length} with max being ${MAX_UNENCRYPTED_LOGS_PER_CALL}`,
|
|
338
|
+
),
|
|
339
|
+
historicalHeader: header,
|
|
340
|
+
globalVariables: globalVariables,
|
|
341
|
+
startGasLeft: Gas.from(result.startGasLeft),
|
|
342
|
+
endGasLeft: Gas.from(result.endGasLeft),
|
|
343
|
+
transactionFee: result.transactionFee,
|
|
344
|
+
// TODO(@just-mitch): need better mapping from simulator to revert code.
|
|
345
|
+
revertCode: result.reverted ? RevertCode.APP_LOGIC_REVERTED : RevertCode.OK,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type PublicExecutionRequest, type Tx, TxExecutionPhase } from '@aztec/circuit-types';
|
|
2
|
+
import { type PublicCallRequest } from '@aztec/circuits.js';
|
|
3
|
+
|
|
4
|
+
export function getExecutionRequestsByPhase(tx: Tx, phase: TxExecutionPhase): PublicExecutionRequest[] {
|
|
5
|
+
switch (phase) {
|
|
6
|
+
case TxExecutionPhase.SETUP:
|
|
7
|
+
return tx.getNonRevertiblePublicExecutionRequests();
|
|
8
|
+
case TxExecutionPhase.APP_LOGIC:
|
|
9
|
+
return tx.getRevertiblePublicExecutionRequests();
|
|
10
|
+
case TxExecutionPhase.TEARDOWN: {
|
|
11
|
+
const request = tx.getPublicTeardownExecutionRequest();
|
|
12
|
+
return request ? [request] : [];
|
|
13
|
+
}
|
|
14
|
+
default:
|
|
15
|
+
throw new Error(`Unknown phase: ${phase}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getCallRequestsByPhase(tx: Tx, phase: TxExecutionPhase): PublicCallRequest[] {
|
|
20
|
+
switch (phase) {
|
|
21
|
+
case TxExecutionPhase.SETUP:
|
|
22
|
+
return tx.data.getNonRevertiblePublicCallRequests();
|
|
23
|
+
case TxExecutionPhase.APP_LOGIC:
|
|
24
|
+
return tx.data.getRevertiblePublicCallRequests();
|
|
25
|
+
case TxExecutionPhase.TEARDOWN: {
|
|
26
|
+
const request = tx.data.getTeardownPublicCallRequest();
|
|
27
|
+
return request ? [request] : [];
|
|
28
|
+
}
|
|
29
|
+
default:
|
|
30
|
+
throw new Error(`Unknown phase: ${phase}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/test/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { L1Actor, L1ToL2Message, L2Actor } from '@aztec/circuit-types';
|
|
2
|
-
import { type AztecAddress, EthAddress,
|
|
2
|
+
import { type AztecAddress, EthAddress, Fr } from '@aztec/circuits.js';
|
|
3
3
|
import { computeSecretHash } from '@aztec/circuits.js/hash';
|
|
4
4
|
import { sha256ToField } from '@aztec/foundation/crypto';
|
|
5
5
|
|
|
@@ -16,6 +16,7 @@ export const buildL1ToL2Message = (
|
|
|
16
16
|
contentPreimage: Fr[],
|
|
17
17
|
targetContract: AztecAddress,
|
|
18
18
|
secret: Fr,
|
|
19
|
+
msgIndex: Fr | number,
|
|
19
20
|
) => {
|
|
20
21
|
// Write the selector into a buffer.
|
|
21
22
|
const selectorBuf = Buffer.from(selector, 'hex');
|
|
@@ -23,5 +24,11 @@ export const buildL1ToL2Message = (
|
|
|
23
24
|
const content = sha256ToField([selectorBuf, ...contentPreimage]);
|
|
24
25
|
const secretHash = computeSecretHash(secret);
|
|
25
26
|
|
|
26
|
-
return new L1ToL2Message(
|
|
27
|
+
return new L1ToL2Message(
|
|
28
|
+
new L1Actor(EthAddress.random(), 1),
|
|
29
|
+
new L2Actor(targetContract, 1),
|
|
30
|
+
content,
|
|
31
|
+
secretHash,
|
|
32
|
+
new Fr(msgIndex),
|
|
33
|
+
);
|
|
27
34
|
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { type AvmProvingRequest, NestedProcessReturnValues, type PublicExecutionRequest, PublicKernelPhase, type SimulationError, type Tx, UnencryptedFunctionL2Logs } from '@aztec/circuit-types';
|
|
2
|
-
import { Fr, Gas, type GlobalVariables, type Header, type PublicCallRequest, type PublicKernelCircuitPublicInputs, VMCircuitPublicInputs } from '@aztec/circuits.js';
|
|
3
|
-
import { type MerkleTreeReadOperations } from '@aztec/world-state';
|
|
4
|
-
import { type PublicExecutor } from './executor.js';
|
|
5
|
-
import { type PublicKernelCircuitSimulator } from './public_kernel_circuit_simulator.js';
|
|
6
|
-
export type EnqueuedCallResult = {
|
|
7
|
-
/** Inputs to be used for proving */
|
|
8
|
-
avmProvingRequest: AvmProvingRequest;
|
|
9
|
-
/** The public kernel output at the end of the enqueued call */
|
|
10
|
-
kernelOutput: VMCircuitPublicInputs;
|
|
11
|
-
/** Unencrypted logs generated during the execution of this enqueued call */
|
|
12
|
-
newUnencryptedLogs: UnencryptedFunctionL2Logs;
|
|
13
|
-
/** Return values of simulating complete callstack */
|
|
14
|
-
returnValues: NestedProcessReturnValues;
|
|
15
|
-
/** Gas used during the execution this enqueued call */
|
|
16
|
-
gasUsed: Gas;
|
|
17
|
-
/** Revert reason, if any */
|
|
18
|
-
revertReason?: SimulationError;
|
|
19
|
-
};
|
|
20
|
-
export declare class EnqueuedCallSimulator {
|
|
21
|
-
private db;
|
|
22
|
-
private publicExecutor;
|
|
23
|
-
private publicKernelSimulator;
|
|
24
|
-
private globalVariables;
|
|
25
|
-
private historicalHeader;
|
|
26
|
-
private log;
|
|
27
|
-
constructor(db: MerkleTreeReadOperations, publicExecutor: PublicExecutor, publicKernelSimulator: PublicKernelCircuitSimulator, globalVariables: GlobalVariables, historicalHeader: Header);
|
|
28
|
-
simulate(callRequest: PublicCallRequest, executionRequest: PublicExecutionRequest, tx: Tx, previousPublicKernelOutput: PublicKernelCircuitPublicInputs, availableGas: Gas, transactionFee: Fr, phase: PublicKernelPhase): Promise<EnqueuedCallResult>;
|
|
29
|
-
private combineNestedExecutionResults;
|
|
30
|
-
/** Returns all pending private and public nullifiers. */
|
|
31
|
-
private getSiloedPendingNullifiers;
|
|
32
|
-
private runKernelCircuit;
|
|
33
|
-
/**
|
|
34
|
-
* Calculates the PublicCircuitOutput for this execution result along with its proof,
|
|
35
|
-
* and assembles a PublicCallData object from it.
|
|
36
|
-
* @param result - The execution result.
|
|
37
|
-
* @returns A corresponding PublicCallData object.
|
|
38
|
-
*/
|
|
39
|
-
private getPublicCallData;
|
|
40
|
-
private getPublicCircuitPublicInputs;
|
|
41
|
-
private getBytecodeHash;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=enqueued_call_simulator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enqueued_call_simulator.d.ts","sourceRoot":"","sources":["../../src/public/enqueued_call_simulator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,yBAAyB,EAEzB,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,EAAE,EACP,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,EAAE,EACF,GAAG,EACH,KAAK,eAAe,EACpB,KAAK,MAAM,EAsBX,KAAK,iBAAiB,EAGtB,KAAK,+BAA+B,EAQpC,qBAAqB,EAItB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGnE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AASzF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oCAAoC;IACpC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,+DAA+D;IAC/D,YAAY,EAAE,qBAAqB,CAAC;IACpC,4EAA4E;IAC5E,kBAAkB,EAAE,yBAAyB,CAAC;IAC9C,qDAAqD;IACrD,YAAY,EAAE,yBAAyB,CAAC;IACxC,uDAAuD;IACvD,OAAO,EAAE,GAAG,CAAC;IACb,4BAA4B;IAC5B,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,CAAC;AAEF,qBAAa,qBAAqB;IAG9B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,qBAAqB;IAC7B,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,gBAAgB;IAN1B,OAAO,CAAC,GAAG,CAAc;gBAEf,EAAE,EAAE,wBAAwB,EAC5B,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,4BAA4B,EACnD,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,MAAM;IAK5B,QAAQ,CACZ,WAAW,EAAE,iBAAiB,EAC9B,gBAAgB,EAAE,sBAAsB,EACxC,EAAE,EAAE,EAAE,EACN,0BAA0B,EAAE,+BAA+B,EAC3D,YAAY,EAAE,GAAG,EACjB,cAAc,EAAE,EAAE,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC;YA8DhB,6BAA6B;IAkE3C,yDAAyD;IACzD,OAAO,CAAC,0BAA0B;YAIpB,gBAAgB;IAY9B;;;;;OAKG;YACW,iBAAiB;YAMjB,4BAA4B;IAuF1C,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { MerkleTreeId, NestedProcessReturnValues, ProvingRequestType, PublicKernelPhase, UnencryptedFunctionL2Logs, } from '@aztec/circuit-types';
|
|
2
|
-
import { AvmCircuitInputs, AztecAddress, ContractStorageRead, ContractStorageUpdateRequest, Fr, Gas, L2ToL1Message, LogHash, MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_L2_GAS_PER_ENQUEUED_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NOTE_HASHES_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_PUBLIC_DATA_READS_PER_CALL, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL, NESTED_RECURSIVE_PROOF_LENGTH, NoteHash, Nullifier, PublicAccumulatedData, PublicAccumulatedDataArrayLengths, PublicCallData, PublicCircuitPublicInputs, PublicInnerCallRequest, PublicKernelInnerCircuitPrivateInputs, PublicKernelInnerData, PublicValidationRequestArrayLengths, PublicValidationRequests, ReadRequest, RevertCode, TreeLeafReadRequest, VMCircuitPublicInputs, VerificationKeyData, makeEmptyProof, makeEmptyRecursiveProof, } from '@aztec/circuits.js';
|
|
3
|
-
import { computeVarArgsHash } from '@aztec/circuits.js/hash';
|
|
4
|
-
import { makeTuple } from '@aztec/foundation/array';
|
|
5
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
|
-
import { accumulatePublicReturnValues, collectExecutionResults } from './execution.js';
|
|
8
|
-
function makeAvmProvingRequest(inputs, result) {
|
|
9
|
-
return {
|
|
10
|
-
type: ProvingRequestType.PUBLIC_VM,
|
|
11
|
-
inputs: new AvmCircuitInputs(result.functionName, result.calldata, inputs, result.avmCircuitHints),
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export class EnqueuedCallSimulator {
|
|
15
|
-
constructor(db, publicExecutor, publicKernelSimulator, globalVariables, historicalHeader) {
|
|
16
|
-
this.db = db;
|
|
17
|
-
this.publicExecutor = publicExecutor;
|
|
18
|
-
this.publicKernelSimulator = publicKernelSimulator;
|
|
19
|
-
this.globalVariables = globalVariables;
|
|
20
|
-
this.historicalHeader = historicalHeader;
|
|
21
|
-
this.log = createDebugLogger(`aztec:sequencer`);
|
|
22
|
-
}
|
|
23
|
-
async simulate(callRequest, executionRequest, tx, previousPublicKernelOutput, availableGas, transactionFee, phase) {
|
|
24
|
-
// Gas allocated to an enqueued call can be different from the available gas
|
|
25
|
-
// if there is more gas available than the max allocation per enqueued call.
|
|
26
|
-
const allocatedGas = new Gas(
|
|
27
|
-
/*daGas=*/ availableGas.daGas,
|
|
28
|
-
/*l2Gas=*/ Math.min(availableGas.l2Gas, MAX_L2_GAS_PER_ENQUEUED_CALL));
|
|
29
|
-
const pendingNullifiers = this.getSiloedPendingNullifiers(previousPublicKernelOutput);
|
|
30
|
-
const startSideEffectCounter = previousPublicKernelOutput.endSideEffectCounter + 1;
|
|
31
|
-
const prevAccumulatedData = phase === PublicKernelPhase.SETUP
|
|
32
|
-
? previousPublicKernelOutput.endNonRevertibleData
|
|
33
|
-
: previousPublicKernelOutput.end;
|
|
34
|
-
const previousValidationRequestArrayLengths = PublicValidationRequestArrayLengths.new(previousPublicKernelOutput.validationRequests);
|
|
35
|
-
const previousAccumulatedDataArrayLengths = PublicAccumulatedDataArrayLengths.new(prevAccumulatedData);
|
|
36
|
-
// If this is the first enqueued call in public, constants will be empty
|
|
37
|
-
// because private kernel does not expose them.
|
|
38
|
-
const constants = previousPublicKernelOutput.constants.clone();
|
|
39
|
-
constants.globalVariables = this.globalVariables;
|
|
40
|
-
const result = await this.publicExecutor.simulate(executionRequest, constants, allocatedGas, tx.data.constants.txContext, pendingNullifiers, transactionFee, startSideEffectCounter, previousValidationRequestArrayLengths, previousAccumulatedDataArrayLengths);
|
|
41
|
-
const callStack = makeTuple(MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, PublicInnerCallRequest.empty);
|
|
42
|
-
callStack[0].item.contractAddress = callRequest.callContext.contractAddress;
|
|
43
|
-
callStack[0].item.callContext = callRequest.callContext;
|
|
44
|
-
callStack[0].item.argsHash = callRequest.argsHash;
|
|
45
|
-
const accumulatedData = PublicAccumulatedData.empty();
|
|
46
|
-
accumulatedData.publicCallStack[0] = callRequest;
|
|
47
|
-
const startVMCircuitOutput = new VMCircuitPublicInputs(previousPublicKernelOutput.constants, callRequest, callStack, previousValidationRequestArrayLengths, PublicValidationRequests.empty(), previousAccumulatedDataArrayLengths, accumulatedData, startSideEffectCounter, startSideEffectCounter, allocatedGas, result.transactionFee, result.reverted);
|
|
48
|
-
return await this.combineNestedExecutionResults(result, startVMCircuitOutput);
|
|
49
|
-
}
|
|
50
|
-
async combineNestedExecutionResults(topResult, startVMCircuitOutput) {
|
|
51
|
-
const executionResults = collectExecutionResults(topResult);
|
|
52
|
-
let avmProvingRequest;
|
|
53
|
-
let gasUsed = Gas.empty();
|
|
54
|
-
let revertReason;
|
|
55
|
-
let kernelOutput = startVMCircuitOutput;
|
|
56
|
-
for (const result of executionResults) {
|
|
57
|
-
// Accumulate gas used in this enqueued call.
|
|
58
|
-
gasUsed = gasUsed.add(Gas.from(result.startGasLeft).sub(Gas.from(result.endGasLeft)));
|
|
59
|
-
const { contractAddress, functionSelector } = result.executionRequest.callContext;
|
|
60
|
-
// Sanity check for a current upstream assumption.
|
|
61
|
-
// Consumers of the result seem to expect "reverted <=> revertReason !== undefined".
|
|
62
|
-
if (result.reverted && !result.revertReason) {
|
|
63
|
-
throw new Error(`Simulation of ${contractAddress}:${functionSelector}(${result.functionName}) reverted with no reason.`);
|
|
64
|
-
}
|
|
65
|
-
// Simulate the public kernel circuit.
|
|
66
|
-
this.log.debug(`Running public kernel inner circuit for ${contractAddress}:${functionSelector}(${result.functionName})`);
|
|
67
|
-
const callData = await this.getPublicCallData(result);
|
|
68
|
-
const { inputs, output } = await this.runKernelCircuit(kernelOutput, callData);
|
|
69
|
-
kernelOutput = output;
|
|
70
|
-
// Capture the inputs for later proving in the AVM and kernel.
|
|
71
|
-
avmProvingRequest = makeAvmProvingRequest(inputs.publicCall.publicInputs, result);
|
|
72
|
-
// Safely return the revert reason and the kernel output (which has had its revertible side effects dropped)
|
|
73
|
-
// TODO(@leila) we shouldn't drop everything when it reverts. The tail kernel needs the data to prove that it's reverted for the correct reason.
|
|
74
|
-
if (result.reverted) {
|
|
75
|
-
this.log.debug(`Reverting on ${contractAddress}:${functionSelector}(${result.functionName}) with reason: ${result.revertReason}`);
|
|
76
|
-
// TODO(@spalladino): Check gasUsed is correct. The AVM should take care of setting gasLeft to zero upon a revert.
|
|
77
|
-
return {
|
|
78
|
-
avmProvingRequest,
|
|
79
|
-
kernelOutput,
|
|
80
|
-
newUnencryptedLogs: UnencryptedFunctionL2Logs.empty(),
|
|
81
|
-
returnValues: NestedProcessReturnValues.empty(),
|
|
82
|
-
gasUsed,
|
|
83
|
-
revertReason: result.revertReason,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
avmProvingRequest: avmProvingRequest,
|
|
89
|
-
kernelOutput,
|
|
90
|
-
newUnencryptedLogs: topResult.allUnencryptedLogs,
|
|
91
|
-
returnValues: accumulatePublicReturnValues(topResult),
|
|
92
|
-
gasUsed,
|
|
93
|
-
revertReason,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
/** Returns all pending private and public nullifiers. */
|
|
97
|
-
getSiloedPendingNullifiers(ko) {
|
|
98
|
-
return [...ko.end.nullifiers, ...ko.endNonRevertibleData.nullifiers].filter(n => !n.isEmpty());
|
|
99
|
-
}
|
|
100
|
-
async runKernelCircuit(previousOutput, callData) {
|
|
101
|
-
// The proof is not used in simulation
|
|
102
|
-
const proof = makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH);
|
|
103
|
-
const vk = VerificationKeyData.makeFakeHonk();
|
|
104
|
-
const previousKernel = new PublicKernelInnerData(previousOutput, proof, vk);
|
|
105
|
-
const inputs = new PublicKernelInnerCircuitPrivateInputs(previousKernel, callData);
|
|
106
|
-
return { inputs, output: await this.publicKernelSimulator.publicKernelCircuitInner(inputs) };
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Calculates the PublicCircuitOutput for this execution result along with its proof,
|
|
110
|
-
* and assembles a PublicCallData object from it.
|
|
111
|
-
* @param result - The execution result.
|
|
112
|
-
* @returns A corresponding PublicCallData object.
|
|
113
|
-
*/
|
|
114
|
-
async getPublicCallData(result) {
|
|
115
|
-
const bytecodeHash = await this.getBytecodeHash(result);
|
|
116
|
-
const publicInputs = await this.getPublicCircuitPublicInputs(result);
|
|
117
|
-
return new PublicCallData(publicInputs, makeEmptyProof(), bytecodeHash);
|
|
118
|
-
}
|
|
119
|
-
async getPublicCircuitPublicInputs(result) {
|
|
120
|
-
const publicDataTreeInfo = await this.db.getTreeInfo(MerkleTreeId.PUBLIC_DATA_TREE);
|
|
121
|
-
this.historicalHeader.state.partial.publicDataTree.root = Fr.fromBuffer(publicDataTreeInfo.root);
|
|
122
|
-
return PublicCircuitPublicInputs.from({
|
|
123
|
-
callContext: result.executionRequest.callContext,
|
|
124
|
-
proverAddress: AztecAddress.ZERO,
|
|
125
|
-
argsHash: computeVarArgsHash(result.executionRequest.args),
|
|
126
|
-
noteHashes: padArrayEnd(result.noteHashes, NoteHash.empty(), MAX_NOTE_HASHES_PER_CALL, `Too many note hashes. Got ${result.noteHashes.length} with max being ${MAX_NOTE_HASHES_PER_CALL}`),
|
|
127
|
-
nullifiers: padArrayEnd(result.nullifiers, Nullifier.empty(), MAX_NULLIFIERS_PER_CALL, `Too many nullifiers. Got ${result.nullifiers.length} with max being ${MAX_NULLIFIERS_PER_CALL}`),
|
|
128
|
-
l2ToL1Msgs: padArrayEnd(result.l2ToL1Messages, L2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_CALL, `Too many L2 to L1 messages. Got ${result.l2ToL1Messages.length} with max being ${MAX_L2_TO_L1_MSGS_PER_CALL}`),
|
|
129
|
-
startSideEffectCounter: result.startSideEffectCounter,
|
|
130
|
-
endSideEffectCounter: result.endSideEffectCounter,
|
|
131
|
-
returnsHash: computeVarArgsHash(result.returnValues),
|
|
132
|
-
noteHashReadRequests: padArrayEnd(result.noteHashReadRequests, TreeLeafReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, `Too many note hash read requests. Got ${result.noteHashReadRequests.length} with max being ${MAX_NOTE_HASH_READ_REQUESTS_PER_CALL}`),
|
|
133
|
-
nullifierReadRequests: padArrayEnd(result.nullifierReadRequests, ReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_CALL, `Too many nullifier read requests. Got ${result.nullifierReadRequests.length} with max being ${MAX_NULLIFIER_READ_REQUESTS_PER_CALL}`),
|
|
134
|
-
nullifierNonExistentReadRequests: padArrayEnd(result.nullifierNonExistentReadRequests, ReadRequest.empty(), MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL, `Too many nullifier non-existent read requests. Got ${result.nullifierNonExistentReadRequests.length} with max being ${MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL}`),
|
|
135
|
-
l1ToL2MsgReadRequests: padArrayEnd(result.l1ToL2MsgReadRequests, TreeLeafReadRequest.empty(), MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, `Too many L1 to L2 message read requests. Got ${result.l1ToL2MsgReadRequests.length} with max being ${MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL}`),
|
|
136
|
-
contractStorageReads: padArrayEnd(result.contractStorageReads, ContractStorageRead.empty(), MAX_PUBLIC_DATA_READS_PER_CALL, `Too many public data reads. Got ${result.contractStorageReads.length} with max being ${MAX_PUBLIC_DATA_READS_PER_CALL}`),
|
|
137
|
-
contractStorageUpdateRequests: padArrayEnd(result.contractStorageUpdateRequests, ContractStorageUpdateRequest.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, `Too many public data update requests. Got ${result.contractStorageUpdateRequests.length} with max being ${MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL}`),
|
|
138
|
-
publicCallRequests: padArrayEnd(result.publicCallRequests, PublicInnerCallRequest.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, `Too many public call requests. Got ${result.publicCallRequests.length} with max being ${MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL}`),
|
|
139
|
-
unencryptedLogsHashes: padArrayEnd(result.unencryptedLogsHashes, LogHash.empty(), MAX_UNENCRYPTED_LOGS_PER_CALL, `Too many unencrypted logs. Got ${result.unencryptedLogsHashes.length} with max being ${MAX_UNENCRYPTED_LOGS_PER_CALL}`),
|
|
140
|
-
historicalHeader: this.historicalHeader,
|
|
141
|
-
globalVariables: this.globalVariables,
|
|
142
|
-
startGasLeft: Gas.from(result.startGasLeft),
|
|
143
|
-
endGasLeft: Gas.from(result.endGasLeft),
|
|
144
|
-
transactionFee: result.transactionFee,
|
|
145
|
-
// TODO(@just-mitch): need better mapping from simulator to revert code.
|
|
146
|
-
revertCode: result.reverted ? RevertCode.APP_LOGIC_REVERTED : RevertCode.OK,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
getBytecodeHash(_result) {
|
|
150
|
-
// TODO: Determine how to calculate bytecode hash. Circuits just check it isn't zero for now.
|
|
151
|
-
// See https://github.com/AztecProtocol/aztec3-packages/issues/378
|
|
152
|
-
const bytecodeHash = new Fr(1n);
|
|
153
|
-
return Promise.resolve(bytecodeHash);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZWRfY2FsbF9zaW11bGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL2VucXVldWVkX2NhbGxfc2ltdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1oseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUVsQixpQkFBaUIsRUFHakIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBQ0YsR0FBRyxFQUdILGFBQWEsRUFDYixPQUFPLEVBQ1AsdUNBQXVDLEVBQ3ZDLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLG9DQUFvQyxFQUNwQyx1QkFBdUIsRUFDdkIsaURBQWlELEVBQ2pELG9DQUFvQyxFQUNwQyxxQ0FBcUMsRUFDckMsbUNBQW1DLEVBQ25DLDhCQUE4QixFQUM5Qix3Q0FBd0MsRUFDeEMsNkJBQTZCLEVBQzdCLDZCQUE2QixFQUM3QixRQUFRLEVBQ1IsU0FBUyxFQUNULHFCQUFxQixFQUNyQixpQ0FBaUMsRUFDakMsY0FBYyxFQUVkLHlCQUF5QixFQUN6QixzQkFBc0IsRUFFdEIscUNBQXFDLEVBQ3JDLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEVBQ3hCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHVCQUF1QixHQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FB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
|