@aztec/simulator 0.62.0 → 0.63.1
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 -4
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +10 -11
- package/dest/acvm/oracle/typed_oracle.d.ts +5 -5
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +8 -8
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +2 -1
- 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 +21 -6
- 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/client/client_execution_context.d.ts +7 -11
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +18 -20
- package/dest/client/db_oracle.d.ts +17 -10
- 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 +12 -5
- 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/package.json +12 -9
- package/src/acvm/acvm.ts +3 -94
- package/src/acvm/oracle/oracle.ts +9 -14
- package/src/acvm/oracle/typed_oracle.ts +8 -8
- package/src/avm/avm_gas.ts +1 -0
- 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 +24 -5
- 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/client/client_execution_context.ts +22 -23
- package/src/client/db_oracle.ts +22 -11
- 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 +12 -4
- 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/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
|
@@ -1,11 +1,33 @@
|
|
|
1
|
-
import { UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
-
import { AvmContractBytecodeHints, AvmContractInstanceHint, AvmExecutionHints, AvmExternalCallHint, AvmKeyValueHint,
|
|
3
|
-
import {
|
|
4
|
-
import { makeTuple } from '@aztec/foundation/array';
|
|
1
|
+
import { UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
+
import { AvmAccumulatedData, AvmAppendTreeHint, AvmCircuitPublicInputs, AvmContractBytecodeHints, AvmContractInstanceHint, AvmEnqueuedCallHint, AvmExecutionHints, AvmExternalCallHint, AvmKeyValueHint, AvmNullifierReadTreeHint, AvmNullifierWriteTreeHint, AvmPublicDataReadTreeHint, AvmPublicDataWriteTreeHint, EthAddress, Gas, L1_TO_L2_MSG_TREE_HEIGHT, L2ToL1Message, LogHash, MAX_ENQUEUED_CALLS_PER_TX, MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_UNENCRYPTED_LOGS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NoteHash, Nullifier, NullifierLeafPreimage, PUBLIC_DATA_TREE_HEIGHT, PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicDataRead, PublicDataTreeLeafPreimage, PublicDataUpdateRequest, PublicDataWrite, ReadRequest, ScopedL2ToL1Message, ScopedLogHash, SerializableContractInstance, TreeLeafReadRequest, } from '@aztec/circuits.js';
|
|
3
|
+
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/circuits.js/hash';
|
|
5
4
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
5
|
import { Fr } from '@aztec/foundation/fields';
|
|
7
6
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { assert } from 'console';
|
|
8
|
+
import { createSimulationError } from '../common/errors.js';
|
|
8
9
|
import { SideEffectLimitReachedError } from './side_effect_errors.js';
|
|
10
|
+
const emptyPublicDataPath = () => new Array(PUBLIC_DATA_TREE_HEIGHT).fill(Fr.zero());
|
|
11
|
+
const emptyNoteHashPath = () => new Array(NOTE_HASH_TREE_HEIGHT).fill(Fr.zero());
|
|
12
|
+
const emptyNullifierPath = () => new Array(NULLIFIER_TREE_HEIGHT).fill(Fr.zero());
|
|
13
|
+
const emptyL1ToL2MessagePath = () => new Array(L1_TO_L2_MSG_TREE_HEIGHT).fill(Fr.zero());
|
|
14
|
+
export class SideEffectArrayLengths {
|
|
15
|
+
constructor(publicDataReads, publicDataWrites, noteHashReadRequests, noteHashes, nullifierReadRequests, nullifierNonExistentReadRequests, nullifiers, l1ToL2MsgReadRequests, l2ToL1Msgs, unencryptedLogs) {
|
|
16
|
+
this.publicDataReads = publicDataReads;
|
|
17
|
+
this.publicDataWrites = publicDataWrites;
|
|
18
|
+
this.noteHashReadRequests = noteHashReadRequests;
|
|
19
|
+
this.noteHashes = noteHashes;
|
|
20
|
+
this.nullifierReadRequests = nullifierReadRequests;
|
|
21
|
+
this.nullifierNonExistentReadRequests = nullifierNonExistentReadRequests;
|
|
22
|
+
this.nullifiers = nullifiers;
|
|
23
|
+
this.l1ToL2MsgReadRequests = l1ToL2MsgReadRequests;
|
|
24
|
+
this.l2ToL1Msgs = l2ToL1Msgs;
|
|
25
|
+
this.unencryptedLogs = unencryptedLogs;
|
|
26
|
+
}
|
|
27
|
+
static empty() {
|
|
28
|
+
return new this(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
9
31
|
/**
|
|
10
32
|
* Trace side effects for an entire enqueued call.
|
|
11
33
|
*/
|
|
@@ -16,30 +38,52 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
16
38
|
/** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
|
|
17
39
|
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
18
40
|
*/
|
|
19
|
-
|
|
41
|
+
previousSideEffectArrayLengths = SideEffectArrayLengths.empty()) {
|
|
20
42
|
this.startSideEffectCounter = startSideEffectCounter;
|
|
21
|
-
this.
|
|
22
|
-
this.previousAccumulatedDataArrayLengths = previousAccumulatedDataArrayLengths;
|
|
43
|
+
this.previousSideEffectArrayLengths = previousSideEffectArrayLengths;
|
|
23
44
|
this.log = createDebugLogger('aztec:public_enqueued_call_side_effect_trace');
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
this.contractStorageUpdateRequests = [];
|
|
45
|
+
this.enqueuedCalls = [];
|
|
46
|
+
this.publicDataReads = [];
|
|
47
|
+
this.publicDataWrites = [];
|
|
28
48
|
this.noteHashReadRequests = [];
|
|
29
49
|
this.noteHashes = [];
|
|
30
50
|
this.nullifierReadRequests = [];
|
|
31
51
|
this.nullifierNonExistentReadRequests = [];
|
|
32
52
|
this.nullifiers = [];
|
|
33
53
|
this.l1ToL2MsgReadRequests = [];
|
|
34
|
-
this.
|
|
54
|
+
this.l2ToL1Messages = [];
|
|
35
55
|
this.unencryptedLogs = [];
|
|
36
56
|
this.unencryptedLogsHashes = [];
|
|
57
|
+
/** Make sure a forked trace is never merged twice. */
|
|
58
|
+
this.alreadyMergedIntoParent = false;
|
|
59
|
+
this.log.debug(`Creating trace instance with startSideEffectCounter: ${startSideEffectCounter}`);
|
|
37
60
|
this.sideEffectCounter = startSideEffectCounter;
|
|
38
61
|
this.avmCircuitHints = AvmExecutionHints.empty();
|
|
39
62
|
}
|
|
40
63
|
fork() {
|
|
41
|
-
return new PublicEnqueuedCallSideEffectTrace(this.sideEffectCounter, new
|
|
42
|
-
this.nullifierNonExistentReadRequests.length, this.
|
|
64
|
+
return new PublicEnqueuedCallSideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataReads + this.publicDataReads.length, this.previousSideEffectArrayLengths.publicDataWrites + this.publicDataWrites.length, this.previousSideEffectArrayLengths.noteHashReadRequests + this.noteHashReadRequests.length, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifierReadRequests + this.nullifierReadRequests.length, this.previousSideEffectArrayLengths.nullifierNonExistentReadRequests +
|
|
65
|
+
this.nullifierNonExistentReadRequests.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l1ToL2MsgReadRequests + this.l1ToL2MsgReadRequests.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.unencryptedLogs + this.unencryptedLogs.length));
|
|
66
|
+
}
|
|
67
|
+
merge(forkedTrace, reverted = false) {
|
|
68
|
+
// sanity check to avoid merging the same forked trace twice
|
|
69
|
+
assert(!this.alreadyMergedIntoParent, 'Cannot merge a forked trace that has already been merged into its parent!');
|
|
70
|
+
forkedTrace.alreadyMergedIntoParent = true;
|
|
71
|
+
// TODO(dbanks12): accept & merge forked trace's hints!
|
|
72
|
+
this.sideEffectCounter = forkedTrace.sideEffectCounter;
|
|
73
|
+
this.enqueuedCalls.push(...forkedTrace.enqueuedCalls);
|
|
74
|
+
if (!reverted) {
|
|
75
|
+
this.publicDataReads.push(...forkedTrace.publicDataReads);
|
|
76
|
+
this.publicDataWrites.push(...forkedTrace.publicDataWrites);
|
|
77
|
+
this.noteHashReadRequests.push(...forkedTrace.noteHashReadRequests);
|
|
78
|
+
this.noteHashes.push(...forkedTrace.noteHashes);
|
|
79
|
+
this.nullifierReadRequests.push(...forkedTrace.nullifierReadRequests);
|
|
80
|
+
this.nullifierNonExistentReadRequests.push(...forkedTrace.nullifierNonExistentReadRequests);
|
|
81
|
+
this.nullifiers.push(...forkedTrace.nullifiers);
|
|
82
|
+
this.l1ToL2MsgReadRequests.push(...forkedTrace.l1ToL2MsgReadRequests);
|
|
83
|
+
this.l2ToL1Messages.push(...forkedTrace.l2ToL1Messages);
|
|
84
|
+
this.unencryptedLogs.push(...forkedTrace.unencryptedLogs);
|
|
85
|
+
this.unencryptedLogsHashes.push(...forkedTrace.unencryptedLogsHashes);
|
|
86
|
+
}
|
|
43
87
|
}
|
|
44
88
|
getCounter() {
|
|
45
89
|
return this.sideEffectCounter;
|
|
@@ -47,49 +91,72 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
47
91
|
incrementSideEffectCounter() {
|
|
48
92
|
this.sideEffectCounter++;
|
|
49
93
|
}
|
|
50
|
-
tracePublicStorageRead(contractAddress, slot, value,
|
|
94
|
+
tracePublicStorageRead(contractAddress, slot, value, leafPreimage = PublicDataTreeLeafPreimage.empty(), leafIndex = Fr.zero(), path = emptyPublicDataPath()) {
|
|
95
|
+
if (!leafIndex.equals(Fr.zero())) {
|
|
96
|
+
// if we have real merkle hint content, make sure the value matches the the provided preimage
|
|
97
|
+
assert(leafPreimage.value.equals(value), 'Value mismatch when tracing in public data write');
|
|
98
|
+
}
|
|
51
99
|
// NOTE: exists and cached are unused for now but may be used for optimizations or kernel hints later
|
|
52
|
-
if (this.
|
|
100
|
+
if (this.publicDataReads.length + this.previousSideEffectArrayLengths.publicDataReads >=
|
|
53
101
|
MAX_PUBLIC_DATA_READS_PER_TX) {
|
|
54
|
-
throw new SideEffectLimitReachedError('contract storage read', MAX_PUBLIC_DATA_READS_PER_TX);
|
|
102
|
+
throw new SideEffectLimitReachedError('public data (contract storage) read', MAX_PUBLIC_DATA_READS_PER_TX);
|
|
55
103
|
}
|
|
56
|
-
|
|
104
|
+
const leafSlot = computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
105
|
+
this.publicDataReads.push(new PublicDataRead(leafSlot, value, this.sideEffectCounter));
|
|
57
106
|
this.avmCircuitHints.storageValues.items.push(new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ value));
|
|
107
|
+
this.avmCircuitHints.storageReadRequest.items.push(new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, path));
|
|
58
108
|
this.log.debug(`SLOAD cnt: ${this.sideEffectCounter} val: ${value} slot: ${slot}`);
|
|
59
109
|
this.incrementSideEffectCounter();
|
|
60
110
|
}
|
|
61
|
-
tracePublicStorageWrite(contractAddress, slot, value) {
|
|
62
|
-
if (
|
|
111
|
+
tracePublicStorageWrite(contractAddress, slot, value, lowLeafPreimage = PublicDataTreeLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyPublicDataPath(), newLeafPreimage = PublicDataTreeLeafPreimage.empty(), insertionPath = emptyPublicDataPath()) {
|
|
112
|
+
if (!lowLeafIndex.equals(Fr.zero())) {
|
|
113
|
+
// if we have real merkle hint content, make sure the value matches the the provided preimage
|
|
114
|
+
assert(newLeafPreimage.value.equals(value), 'Value mismatch when tracing in public data read');
|
|
115
|
+
}
|
|
116
|
+
if (this.publicDataWrites.length + this.previousSideEffectArrayLengths.publicDataWrites >=
|
|
63
117
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) {
|
|
64
|
-
throw new SideEffectLimitReachedError('contract storage write', MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
118
|
+
throw new SideEffectLimitReachedError('public data (contract storage) write', MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
65
119
|
}
|
|
66
|
-
|
|
67
|
-
this.
|
|
120
|
+
const leafSlot = computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
121
|
+
this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
|
|
122
|
+
// New hinting
|
|
123
|
+
const readHint = new AvmPublicDataReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
124
|
+
this.avmCircuitHints.storageUpdateRequest.items.push(new AvmPublicDataWriteTreeHint(readHint, newLeafPreimage, insertionPath));
|
|
125
|
+
this.log.debug(`Traced public data write (address=${contractAddress}, slot=${slot}, leafSlot=${leafSlot}): value=${value} (counter=${this.sideEffectCounter})`);
|
|
68
126
|
this.incrementSideEffectCounter();
|
|
69
127
|
}
|
|
70
128
|
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
71
|
-
traceNoteHashCheck(_contractAddress, noteHash, leafIndex, exists) {
|
|
129
|
+
traceNoteHashCheck(_contractAddress, noteHash, leafIndex, exists, path = emptyNoteHashPath()) {
|
|
72
130
|
// NOTE: contractAddress is unused because noteHash is an already-siloed leaf
|
|
73
|
-
if (this.noteHashReadRequests.length + this.
|
|
131
|
+
if (this.noteHashReadRequests.length + this.previousSideEffectArrayLengths.noteHashReadRequests >=
|
|
74
132
|
MAX_NOTE_HASH_READ_REQUESTS_PER_TX) {
|
|
75
133
|
throw new SideEffectLimitReachedError('note hash read request', MAX_NOTE_HASH_READ_REQUESTS_PER_TX);
|
|
76
134
|
}
|
|
135
|
+
// note hash is already siloed here
|
|
77
136
|
this.noteHashReadRequests.push(new TreeLeafReadRequest(noteHash, leafIndex));
|
|
78
137
|
this.avmCircuitHints.noteHashExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(leafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO));
|
|
138
|
+
// New Hinting
|
|
139
|
+
this.avmCircuitHints.noteHashReadRequest.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
79
140
|
// NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes)
|
|
80
141
|
}
|
|
81
|
-
traceNewNoteHash(contractAddress, noteHash) {
|
|
82
|
-
if (this.noteHashes.length + this.
|
|
142
|
+
traceNewNoteHash(contractAddress, noteHash, leafIndex, path = emptyNoteHashPath()) {
|
|
143
|
+
if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
|
|
83
144
|
throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX);
|
|
84
145
|
}
|
|
85
|
-
|
|
146
|
+
// TODO(dbanks12): make unique and silo instead of scoping
|
|
147
|
+
//const siloedNoteHash = siloNoteHash(contractAddress, noteHash);
|
|
148
|
+
this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter).scope(contractAddress));
|
|
86
149
|
this.log.debug(`NEW_NOTE_HASH cnt: ${this.sideEffectCounter}`);
|
|
150
|
+
this.avmCircuitHints.noteHashWriteRequest.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
87
151
|
this.incrementSideEffectCounter();
|
|
88
152
|
}
|
|
89
|
-
traceNullifierCheck(contractAddress, nullifier,
|
|
153
|
+
traceNullifierCheck(contractAddress, nullifier, exists, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath()) {
|
|
90
154
|
// NOTE: isPending and leafIndex are unused for now but may be used for optimizations or kernel hints later
|
|
91
155
|
this.enforceLimitOnNullifierChecks();
|
|
92
|
-
|
|
156
|
+
// TODO(dbanks12): use siloed nullifier instead of scoped once public kernel stops siloing
|
|
157
|
+
// and once VM public inputs are meant to contain siloed nullifiers.
|
|
158
|
+
//const siloedNullifier = siloNullifier(contractAddress, nullifier);
|
|
159
|
+
const readRequest = new ReadRequest(nullifier, this.sideEffectCounter).scope(contractAddress);
|
|
93
160
|
if (exists) {
|
|
94
161
|
this.nullifierReadRequests.push(readRequest);
|
|
95
162
|
}
|
|
@@ -97,47 +164,55 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
97
164
|
this.nullifierNonExistentReadRequests.push(readRequest);
|
|
98
165
|
}
|
|
99
166
|
this.avmCircuitHints.nullifierExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ new Fr(exists ? 1 : 0)));
|
|
167
|
+
// New Hints
|
|
168
|
+
this.avmCircuitHints.nullifierReadRequest.items.push(new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath));
|
|
100
169
|
this.log.debug(`NULLIFIER_EXISTS cnt: ${this.sideEffectCounter}`);
|
|
101
170
|
this.incrementSideEffectCounter();
|
|
102
171
|
}
|
|
103
|
-
traceNewNullifier(contractAddress, nullifier) {
|
|
104
|
-
if (this.nullifiers.length + this.
|
|
172
|
+
traceNewNullifier(contractAddress, nullifier, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath(), insertionPath = emptyNullifierPath()) {
|
|
173
|
+
if (this.nullifiers.length + this.previousSideEffectArrayLengths.nullifiers >= MAX_NULLIFIERS_PER_TX) {
|
|
105
174
|
throw new SideEffectLimitReachedError('nullifier', MAX_NULLIFIERS_PER_TX);
|
|
106
175
|
}
|
|
107
|
-
|
|
176
|
+
const siloedNullifier = siloNullifier(contractAddress, nullifier);
|
|
177
|
+
this.nullifiers.push(new Nullifier(siloedNullifier, this.sideEffectCounter, /*noteHash=*/ Fr.ZERO));
|
|
178
|
+
// New hinting
|
|
179
|
+
const lowLeafReadHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
180
|
+
this.avmCircuitHints.nullifierWriteHints.items.push(new AvmNullifierWriteTreeHint(lowLeafReadHint, insertionPath));
|
|
108
181
|
this.log.debug(`NEW_NULLIFIER cnt: ${this.sideEffectCounter}`);
|
|
109
182
|
this.incrementSideEffectCounter();
|
|
110
183
|
}
|
|
111
184
|
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
112
|
-
traceL1ToL2MessageCheck(_contractAddress, msgHash, msgLeafIndex, exists) {
|
|
185
|
+
traceL1ToL2MessageCheck(_contractAddress, msgHash, msgLeafIndex, exists, path = emptyL1ToL2MessagePath()) {
|
|
113
186
|
// NOTE: contractAddress is unused because msgHash is an already-siloed leaf
|
|
114
|
-
if (this.l1ToL2MsgReadRequests.length + this.
|
|
187
|
+
if (this.l1ToL2MsgReadRequests.length + this.previousSideEffectArrayLengths.l1ToL2MsgReadRequests >=
|
|
115
188
|
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX) {
|
|
116
189
|
throw new SideEffectLimitReachedError('l1 to l2 message read request', MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX);
|
|
117
190
|
}
|
|
118
191
|
this.l1ToL2MsgReadRequests.push(new TreeLeafReadRequest(msgHash, msgLeafIndex));
|
|
119
192
|
this.avmCircuitHints.l1ToL2MessageExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(msgLeafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO));
|
|
193
|
+
// New Hinting
|
|
194
|
+
this.avmCircuitHints.l1ToL2MessageReadRequest.items.push(new AvmAppendTreeHint(msgLeafIndex, msgHash, path));
|
|
120
195
|
}
|
|
121
196
|
traceNewL2ToL1Message(contractAddress, recipient, content) {
|
|
122
|
-
if (this.
|
|
197
|
+
if (this.l2ToL1Messages.length + this.previousSideEffectArrayLengths.l2ToL1Msgs >= MAX_L2_TO_L1_MSGS_PER_TX) {
|
|
123
198
|
throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX);
|
|
124
199
|
}
|
|
125
200
|
const recipientAddress = EthAddress.fromField(recipient);
|
|
126
|
-
this.
|
|
201
|
+
this.l2ToL1Messages.push(new L2ToL1Message(recipientAddress, content, this.sideEffectCounter).scope(contractAddress));
|
|
127
202
|
this.log.debug(`NEW_L2_TO_L1_MSG cnt: ${this.sideEffectCounter}`);
|
|
128
203
|
this.incrementSideEffectCounter();
|
|
129
204
|
}
|
|
130
205
|
traceUnencryptedLog(contractAddress, log) {
|
|
131
|
-
if (this.unencryptedLogs.length + this.
|
|
206
|
+
if (this.unencryptedLogs.length + this.previousSideEffectArrayLengths.unencryptedLogs >=
|
|
132
207
|
MAX_UNENCRYPTED_LOGS_PER_TX) {
|
|
133
208
|
throw new SideEffectLimitReachedError('unencrypted log', MAX_UNENCRYPTED_LOGS_PER_TX);
|
|
134
209
|
}
|
|
135
|
-
const ulog = new UnencryptedL2Log(
|
|
210
|
+
const ulog = new UnencryptedL2Log(contractAddress, Buffer.concat(log.map(f => f.toBuffer())));
|
|
136
211
|
const basicLogHash = Fr.fromBuffer(ulog.hash());
|
|
137
212
|
this.unencryptedLogs.push(ulog);
|
|
138
213
|
// This length is for charging DA and is checked on-chain - has to be length of log preimage + 4 bytes.
|
|
139
214
|
// The .length call also has a +4 but that is unrelated
|
|
140
|
-
this.unencryptedLogsHashes.push(new LogHash(basicLogHash, this.sideEffectCounter, new Fr(ulog.length + 4)).scope(
|
|
215
|
+
this.unencryptedLogsHashes.push(new LogHash(basicLogHash, this.sideEffectCounter, new Fr(ulog.length + 4)).scope(contractAddress));
|
|
141
216
|
this.log.debug(`NEW_UNENCRYPTED_LOG cnt: ${this.sideEffectCounter}`);
|
|
142
217
|
this.incrementSideEffectCounter();
|
|
143
218
|
}
|
|
@@ -148,7 +223,7 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
148
223
|
this.incrementSideEffectCounter();
|
|
149
224
|
}
|
|
150
225
|
// This tracing function gets called everytime we start simulation/execution.
|
|
151
|
-
// This happens both when starting a new top-level trace and the start of every
|
|
226
|
+
// This happens both when starting a new top-level trace and the start of every forked trace
|
|
152
227
|
// We use this to collect the AvmContractBytecodeHints
|
|
153
228
|
traceGetBytecode(contractAddress, exists, bytecode = Buffer.alloc(0), contractInstance = SerializableContractInstance.default(), contractClass = {
|
|
154
229
|
artifactHash: Fr.zero(),
|
|
@@ -166,7 +241,7 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
166
241
|
*/
|
|
167
242
|
traceNestedCall(
|
|
168
243
|
/** The trace of the nested call. */
|
|
169
|
-
|
|
244
|
+
_nestedCallTrace,
|
|
170
245
|
/** The execution environment of the nested call. */
|
|
171
246
|
nestedEnvironment,
|
|
172
247
|
/** How much gas was available for this public execution. */
|
|
@@ -179,94 +254,119 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
179
254
|
avmCallResults,
|
|
180
255
|
/** Function name for logging */
|
|
181
256
|
_functionName = 'unknown') {
|
|
257
|
+
// TODO(4805): check if some threshold is reached for max nested calls (to unique contracts?)
|
|
258
|
+
//
|
|
182
259
|
// Store end side effect counter before it gets updated by absorbing nested call trace
|
|
183
260
|
const endSideEffectCounter = new Fr(this.sideEffectCounter);
|
|
184
|
-
// TODO(4805): check if some threshold is reached for max nested calls (to unique contracts?)
|
|
185
|
-
// TODO(dbanks12): should emit a nullifier read request. There should be two thresholds.
|
|
186
|
-
// one for max unique contract calls, and another based on max nullifier reads.
|
|
187
|
-
// Since this trace function happens _after_ a nested call, such threshold limits must take
|
|
188
|
-
// place in another trace function that occurs _before_ a nested call.
|
|
189
|
-
if (avmCallResults.reverted) {
|
|
190
|
-
this.absorbRevertedNestedTrace(nestedCallTrace);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
this.absorbSuccessfulNestedTrace(nestedCallTrace);
|
|
194
|
-
}
|
|
195
261
|
const gasUsed = new Gas(startGasLeft.daGas - endGasLeft.daGas, startGasLeft.l2Gas - endGasLeft.l2Gas);
|
|
196
262
|
this.avmCircuitHints.externalCalls.items.push(new AvmExternalCallHint(
|
|
197
263
|
/*success=*/ new Fr(avmCallResults.reverted ? 0 : 1), avmCallResults.output, gasUsed, endSideEffectCounter, nestedEnvironment.address));
|
|
198
264
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
this.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
// All read requests, and any writes (storage & nullifiers) that
|
|
215
|
-
// require complex validation in public kernel (with end lifetimes)
|
|
216
|
-
// must be absorbed even on revert.
|
|
217
|
-
// TODO(dbanks12): What should happen to side effect counter on revert?
|
|
218
|
-
this.sideEffectCounter = nestedTrace.sideEffectCounter;
|
|
219
|
-
this.contractStorageReads.push(...nestedTrace.contractStorageReads);
|
|
220
|
-
this.contractStorageUpdateRequests.push(...nestedTrace.contractStorageUpdateRequests);
|
|
221
|
-
this.noteHashReadRequests.push(...nestedTrace.noteHashReadRequests);
|
|
222
|
-
// new noteHashes are tossed on revert
|
|
223
|
-
this.nullifierReadRequests.push(...nestedTrace.nullifierReadRequests);
|
|
224
|
-
this.nullifierNonExistentReadRequests.push(...nestedTrace.nullifierNonExistentReadRequests);
|
|
225
|
-
this.nullifiers.push(...nestedTrace.nullifiers);
|
|
226
|
-
this.l1ToL2MsgReadRequests.push(...nestedTrace.l1ToL2MsgReadRequests);
|
|
227
|
-
// new l2-to-l1 messages are tossed on revert
|
|
228
|
-
// new unencrypted logs are tossed on revert
|
|
265
|
+
/**
|
|
266
|
+
* Trace an enqueued call.
|
|
267
|
+
* Accept some results from a finished call's trace into this one.
|
|
268
|
+
*/
|
|
269
|
+
traceEnqueuedCall(
|
|
270
|
+
/** The call request from private that enqueued this call. */
|
|
271
|
+
publicCallRequest,
|
|
272
|
+
/** The call's calldata */
|
|
273
|
+
calldata,
|
|
274
|
+
/** Did the call revert? */
|
|
275
|
+
_reverted) {
|
|
276
|
+
this.log.debug(`Tracing enqueued call`);
|
|
277
|
+
// TODO(4805): check if some threshold is reached for max enqueued or nested calls (to unique contracts?)
|
|
278
|
+
this.enqueuedCalls.push(publicCallRequest);
|
|
279
|
+
this.avmCircuitHints.enqueuedCalls.items.push(new AvmEnqueuedCallHint(publicCallRequest.contractAddress, calldata));
|
|
229
280
|
}
|
|
230
281
|
getSideEffects() {
|
|
231
282
|
return {
|
|
232
|
-
|
|
233
|
-
|
|
283
|
+
enqueuedCalls: this.enqueuedCalls,
|
|
284
|
+
publicDataReads: this.publicDataReads,
|
|
285
|
+
publicDataWrites: this.publicDataWrites,
|
|
234
286
|
noteHashReadRequests: this.noteHashReadRequests,
|
|
235
287
|
noteHashes: this.noteHashes,
|
|
236
288
|
nullifierReadRequests: this.nullifierReadRequests,
|
|
237
289
|
nullifierNonExistentReadRequests: this.nullifierNonExistentReadRequests,
|
|
238
290
|
nullifiers: this.nullifiers,
|
|
239
291
|
l1ToL2MsgReadRequests: this.l1ToL2MsgReadRequests,
|
|
240
|
-
l2ToL1Msgs: this.
|
|
292
|
+
l2ToL1Msgs: this.l2ToL1Messages,
|
|
241
293
|
unencryptedLogs: this.unencryptedLogs,
|
|
242
294
|
unencryptedLogsHashes: this.unencryptedLogsHashes,
|
|
243
295
|
};
|
|
244
296
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
avmEnvironment,
|
|
250
|
-
/** How much gas was available for this public execution. */
|
|
251
|
-
startGasLeft,
|
|
297
|
+
/**
|
|
298
|
+
* Get the results of public execution.
|
|
299
|
+
*/
|
|
300
|
+
toPublicEnqueuedCallExecutionResult(
|
|
252
301
|
/** How much gas was left after this public execution. */
|
|
253
302
|
endGasLeft,
|
|
254
303
|
/** The call's results */
|
|
255
304
|
avmCallResults) {
|
|
256
|
-
return
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
305
|
+
return {
|
|
306
|
+
endGasLeft,
|
|
307
|
+
endSideEffectCounter: new Fr(this.sideEffectCounter),
|
|
308
|
+
returnValues: avmCallResults.output,
|
|
309
|
+
reverted: avmCallResults.reverted,
|
|
310
|
+
revertReason: avmCallResults.revertReason
|
|
311
|
+
? createSimulationError(avmCallResults.revertReason, avmCallResults.output)
|
|
312
|
+
: undefined,
|
|
313
|
+
sideEffects: {
|
|
314
|
+
publicDataWrites: this.publicDataWrites,
|
|
315
|
+
noteHashes: this.noteHashes,
|
|
316
|
+
nullifiers: this.nullifiers,
|
|
317
|
+
l2ToL1Messages: this.l2ToL1Messages,
|
|
318
|
+
unencryptedLogsHashes: this.unencryptedLogsHashes, // Scoped?
|
|
319
|
+
unencryptedLogs: new UnencryptedFunctionL2Logs(this.unencryptedLogs),
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
toAvmCircuitPublicInputs(
|
|
324
|
+
/** Globals. */
|
|
325
|
+
globalVariables,
|
|
326
|
+
/** Start tree snapshots. */
|
|
327
|
+
startTreeSnapshots,
|
|
328
|
+
/** Gas used at start of TX. */
|
|
329
|
+
startGasUsed,
|
|
330
|
+
/** How much gas was available for this public execution. */
|
|
331
|
+
gasLimits,
|
|
332
|
+
/** Call requests for setup phase. */
|
|
333
|
+
publicSetupCallRequests,
|
|
334
|
+
/** Call requests for app logic phase. */
|
|
335
|
+
publicAppLogicCallRequests,
|
|
336
|
+
/** Call request for teardown phase. */
|
|
337
|
+
publicTeardownCallRequest,
|
|
338
|
+
/** End tree snapshots. */
|
|
339
|
+
endTreeSnapshots,
|
|
340
|
+
/**
|
|
341
|
+
* Gas used by the whole transaction, assuming entire teardown limit is used.
|
|
342
|
+
* This is the gas used when computing transaction fee.
|
|
343
|
+
*/
|
|
344
|
+
endGasUsed,
|
|
345
|
+
/** Transaction fee. */
|
|
346
|
+
transactionFee,
|
|
347
|
+
/** The call's results */
|
|
348
|
+
reverted) {
|
|
349
|
+
return new AvmCircuitPublicInputs(globalVariables, startTreeSnapshots, startGasUsed, gasLimits, padArrayEnd(publicSetupCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), padArrayEnd(publicAppLogicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), publicTeardownCallRequest,
|
|
350
|
+
/*previousNonRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
351
|
+
/*previousRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
352
|
+
/*previousNonRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(),
|
|
353
|
+
/*previousRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(), endTreeSnapshots, endGasUsed,
|
|
354
|
+
/*accumulatedData=*/ this.getAvmAccumulatedData(), transactionFee, reverted);
|
|
355
|
+
}
|
|
356
|
+
toPublicFunctionCallResult(
|
|
357
|
+
/** The execution environment of the nested call. */
|
|
358
|
+
_avmEnvironment,
|
|
359
|
+
/** How much gas was available for this public execution. */
|
|
360
|
+
_startGasLeft,
|
|
361
|
+
/** How much gas was left after this public execution. */
|
|
362
|
+
_endGasLeft,
|
|
363
|
+
/** Bytecode used for this execution. */
|
|
364
|
+
_bytecode,
|
|
365
|
+
/** The call's results */
|
|
366
|
+
_avmCallResults,
|
|
367
|
+
/** Function name for logging */
|
|
368
|
+
_functionName = 'unknown') {
|
|
369
|
+
throw new Error('Not implemented');
|
|
270
370
|
}
|
|
271
371
|
getUnencryptedLogs() {
|
|
272
372
|
return this.unencryptedLogs;
|
|
@@ -274,22 +374,8 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
274
374
|
getAvmCircuitHints() {
|
|
275
375
|
return this.avmCircuitHints;
|
|
276
376
|
}
|
|
277
|
-
|
|
278
|
-
return new
|
|
279
|
-
padArrayEnd(this.noteHashReadRequests, TreeLeafReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_TX), padArrayEnd(this.nullifierReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_TX), padArrayEnd(this.nullifierNonExistentReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX), padArrayEnd(this.l1ToL2MsgReadRequests, TreeLeafReadRequest.empty(), MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX),
|
|
280
|
-
// TODO(dbanks12): this is only necessary until VMCircuitPublicInputs uses unsiloed storage slots and pairs storage accesses with contract address
|
|
281
|
-
padArrayEnd(this.contractStorageReads.map(r => new PublicDataRead(r.storageSlot, r.currentValue, r.counter)), PublicDataRead.empty(), MAX_PUBLIC_DATA_READS_PER_TX));
|
|
282
|
-
}
|
|
283
|
-
getAccumulatedData(gasUsed) {
|
|
284
|
-
return new PublicAccumulatedData(padArrayEnd(this.noteHashes, ScopedNoteHash.empty(), MAX_NOTE_HASHES_PER_TX),
|
|
285
|
-
// TODO(dbanks12): should be able to use ScopedNullifier here
|
|
286
|
-
padArrayEnd(this.nullifiers.map(n => new Nullifier(n.nullifier.value, n.nullifier.counter, n.nullifier.noteHash)), Nullifier.empty(), MAX_NULLIFIERS_PER_TX), padArrayEnd(this.l2ToL1Msgs, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
|
|
287
|
-
/*noteEncryptedLogsHashes=*/ makeTuple(MAX_NOTE_ENCRYPTED_LOGS_PER_TX, LogHash.empty),
|
|
288
|
-
/*encryptedLogsHashes=*/ makeTuple(MAX_ENCRYPTED_LOGS_PER_TX, ScopedLogHash.empty), padArrayEnd(this.unencryptedLogsHashes, ScopedLogHash.empty(), MAX_UNENCRYPTED_LOGS_PER_TX),
|
|
289
|
-
// TODO(dbanks12): this is only necessary until VMCircuitPublicInputs uses unsiloed storage slots and pairs storage accesses with contract address
|
|
290
|
-
padArrayEnd(this.contractStorageUpdateRequests.map(w => new PublicDataUpdateRequest(w.storageSlot, w.newValue, w.counter)), PublicDataUpdateRequest.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX),
|
|
291
|
-
/*publicCallStack=*/ makeTuple(MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, PublicCallRequest.empty),
|
|
292
|
-
/*gasUsed=*/ gasUsed);
|
|
377
|
+
getAvmAccumulatedData() {
|
|
378
|
+
return new AvmAccumulatedData(padArrayEnd(this.noteHashes.map(n => n.value), Fr.zero(), MAX_NOTE_HASHES_PER_TX), padArrayEnd(this.nullifiers.map(n => n.value), Fr.zero(), MAX_NULLIFIERS_PER_TX), padArrayEnd(this.l2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX), padArrayEnd(this.unencryptedLogsHashes, ScopedLogHash.empty(), MAX_UNENCRYPTED_LOGS_PER_TX), padArrayEnd(this.publicDataWrites.map(w => new PublicDataWrite(w.leafSlot, w.newValue)), PublicDataWrite.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX));
|
|
293
379
|
}
|
|
294
380
|
enforceLimitOnNullifierChecks(errorMsgOrigin = '') {
|
|
295
381
|
// NOTE: Why error if _either_ limit was reached? If user code emits either an existent or non-existent
|
|
@@ -298,27 +384,15 @@ export class PublicEnqueuedCallSideEffectTrace {
|
|
|
298
384
|
// sequencer from lying and saying "this nullifier exists, but MAX_NULLIFIER_RRS has been reached, so I'm
|
|
299
385
|
// going to skip the read request and just revert instead" when the nullifier actually doesn't exist
|
|
300
386
|
// (or vice versa). So, if either maximum has been reached, any nullifier-reading operation must error.
|
|
301
|
-
if (this.nullifierReadRequests.length + this.
|
|
387
|
+
if (this.nullifierReadRequests.length + this.previousSideEffectArrayLengths.nullifierReadRequests >=
|
|
302
388
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX) {
|
|
303
389
|
throw new SideEffectLimitReachedError(`nullifier read request ${errorMsgOrigin}`, MAX_NULLIFIER_READ_REQUESTS_PER_TX);
|
|
304
390
|
}
|
|
305
391
|
if (this.nullifierNonExistentReadRequests.length +
|
|
306
|
-
this.
|
|
392
|
+
this.previousSideEffectArrayLengths.nullifierNonExistentReadRequests >=
|
|
307
393
|
MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX) {
|
|
308
394
|
throw new SideEffectLimitReachedError(`nullifier non-existent read request ${errorMsgOrigin}`, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX);
|
|
309
395
|
}
|
|
310
396
|
}
|
|
311
397
|
}
|
|
312
|
-
/**
|
|
313
|
-
* Helper function to create a public execution request from an AVM execution environment
|
|
314
|
-
*/
|
|
315
|
-
function createPublicCallRequest(avmEnvironment) {
|
|
316
|
-
const callContext = CallContext.from({
|
|
317
|
-
msgSender: avmEnvironment.sender,
|
|
318
|
-
contractAddress: avmEnvironment.address,
|
|
319
|
-
functionSelector: avmEnvironment.functionSelector,
|
|
320
|
-
isStaticCall: avmEnvironment.isStaticCall,
|
|
321
|
-
});
|
|
322
|
-
return new PublicCallRequest(callContext, computeVarArgsHash(avmEnvironment.calldata), /*counter=*/ 0);
|
|
323
|
-
}
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZWRfY2FsbF9zaWRlX2VmZmVjdF90cmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvZW5xdWV1ZWRfY2FsbF9zaWRlX2VmZmVjdF90cmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixZQUFZLEVBQ1osV0FBVyxFQUdYLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsVUFBVSxFQUNWLEdBQUcsRUFDSCxhQUFhLEVBQ2IsT0FBTyxFQUNQLHlCQUF5QixFQUN6QixxQ0FBcUMsRUFDckMsd0JBQXdCLEVBQ3hCLDhCQUE4QixFQUM5QixzQkFBc0IsRUFDdEIsa0NBQWtDLEVBQ2xDLHFCQUFxQixFQUNyQiwrQ0FBK0MsRUFDL0Msa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyw0QkFBNEIsRUFDNUIsc0NBQXNDLEVBQ3RDLDJCQUEyQixFQUMzQixRQUFRLEVBQ1IsU0FBUyxFQUNULHFCQUFxQixFQUNyQixpQ0FBaUMsRUFDakMsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLG1DQUFtQyxFQUNuQyx3QkFBd0IsRUFDeEIsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGNBQWMsRUFFZCxpQkFBaUIsRUFDakIsNEJBQTRCLEVBQzVCLG1CQUFtQixFQUNuQixxQkFBcUIsR0FDdEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxN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
|
|
398
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZWRfY2FsbF9zaWRlX2VmZmVjdF90cmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvZW5xdWV1ZWRfY2FsbF9zaWRlX2VmZmVjdF90cmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBRzFCLFVBQVUsRUFDVixHQUFHLEVBR0gsd0JBQXdCLEVBQ3hCLGFBQWEsRUFDYixPQUFPLEVBQ1AseUJBQXlCLEVBQ3pCLHFDQUFxQyxFQUNyQyx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLGtDQUFrQyxFQUNsQyxxQkFBcUIsRUFDckIsK0NBQStDLEVBQy9DLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsc0NBQXNDLEVBQ3RDLDJCQUEyQixFQUMzQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBQ3ZDLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixhQUFhLEVBR2IsNEJBQTRCLEVBQzVCLG1CQUFtQixHQUVwQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RixPQUFPLEVBQUUs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
|