@aztec/simulator 0.72.1 → 0.74.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/README.md +1 -1
- package/dest/avm/avm_simulator.d.ts +0 -1
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +4 -19
- package/dest/avm/avm_tree.d.ts +9 -8
- package/dest/avm/avm_tree.d.ts.map +1 -1
- package/dest/avm/avm_tree.js +35 -30
- package/dest/avm/fixtures/avm_simulation_tester.d.ts +21 -0
- package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +1 -0
- package/dest/avm/fixtures/avm_simulation_tester.js +73 -0
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +35 -0
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -0
- package/dest/avm/fixtures/base_avm_simulation_tester.js +76 -0
- package/dest/avm/fixtures/index.d.ts +10 -2
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +45 -5
- package/dest/avm/fixtures/simple_contract_data_source.d.ts +31 -0
- package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/avm/fixtures/simple_contract_data_source.js +75 -0
- package/dest/avm/journal/journal.d.ts +3 -3
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +24 -21
- package/dest/avm/opcodes/accrued_substate.js +2 -2
- package/dest/avm/opcodes/hashing.js +2 -2
- package/dest/avm/test_utils.d.ts +1 -1
- package/dest/avm/test_utils.d.ts.map +1 -1
- package/dest/avm/test_utils.js +4 -3
- package/dest/client/client_execution_context.d.ts +1 -1
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +21 -18
- package/dest/client/execution_note_cache.d.ts +3 -3
- package/dest/client/execution_note_cache.d.ts.map +1 -1
- package/dest/client/execution_note_cache.js +10 -10
- package/dest/client/pick_notes.js +5 -5
- package/dest/client/simulator.js +4 -4
- package/dest/client/view_data_oracle.js +2 -2
- package/dest/common/hashed_values_cache.d.ts +1 -1
- package/dest/common/hashed_values_cache.d.ts.map +1 -1
- package/dest/common/hashed_values_cache.js +5 -5
- package/dest/providers/acvm_wasm.d.ts +2 -0
- package/dest/providers/acvm_wasm.d.ts.map +1 -1
- package/dest/providers/acvm_wasm.js +15 -2
- package/dest/public/execution.d.ts +1 -1
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +3 -3
- package/dest/public/fee_payment.d.ts +2 -2
- package/dest/public/fee_payment.d.ts.map +1 -1
- package/dest/public/fee_payment.js +3 -3
- package/dest/public/fixtures/index.d.ts +2 -37
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +3 -250
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +21 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
- package/dest/public/fixtures/public_tx_simulation_tester.js +88 -0
- package/dest/public/fixtures/utils.d.ts +17 -0
- package/dest/public/fixtures/utils.d.ts.map +1 -0
- package/dest/public/fixtures/utils.js +66 -0
- package/dest/public/index.d.ts +1 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +2 -2
- package/dest/public/public_db_sources.d.ts +2 -1
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +27 -21
- package/dest/public/public_processor.d.ts +1 -1
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +19 -18
- package/dest/public/public_tx_context.d.ts +5 -5
- package/dest/public/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_context.js +43 -17
- package/dest/public/public_tx_simulator.js +7 -7
- package/dest/public/{enqueued_call_side_effect_trace.d.ts → side_effect_trace.d.ts} +6 -26
- package/dest/public/side_effect_trace.d.ts.map +1 -0
- package/dest/public/side_effect_trace.js +316 -0
- package/dest/public/side_effect_trace_interface.d.ts +2 -19
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/test/utils.d.ts +1 -1
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +3 -3
- package/package.json +9 -9
- package/src/avm/avm_simulator.ts +3 -27
- package/src/avm/avm_tree.ts +39 -37
- package/src/avm/fixtures/avm_simulation_tester.ts +104 -0
- package/src/avm/fixtures/base_avm_simulation_tester.ts +104 -0
- package/src/avm/fixtures/index.ts +74 -6
- package/src/avm/fixtures/simple_contract_data_source.ts +98 -0
- package/src/avm/journal/journal.ts +24 -21
- package/src/avm/opcodes/accrued_substate.ts +1 -1
- package/src/avm/opcodes/hashing.ts +1 -1
- package/src/avm/test_utils.ts +3 -4
- package/src/client/client_execution_context.ts +27 -21
- package/src/client/execution_note_cache.ts +19 -14
- package/src/client/pick_notes.ts +4 -4
- package/src/client/simulator.ts +3 -3
- package/src/client/view_data_oracle.ts +1 -1
- package/src/common/hashed_values_cache.ts +4 -4
- package/src/providers/acvm_wasm.ts +13 -2
- package/src/public/execution.ts +3 -3
- package/src/public/fee_payment.ts +2 -2
- package/src/public/fixtures/index.ts +2 -387
- package/src/public/fixtures/public_tx_simulation_tester.ts +173 -0
- package/src/public/fixtures/utils.ts +110 -0
- package/src/public/index.ts +1 -1
- package/src/public/public_db_sources.ts +31 -20
- package/src/public/public_processor.ts +25 -18
- package/src/public/public_tx_context.ts +86 -27
- package/src/public/public_tx_simulator.ts +6 -6
- package/src/public/{enqueued_call_side_effect_trace.ts → side_effect_trace.ts} +8 -49
- package/src/public/side_effect_trace_interface.ts +1 -22
- package/src/test/utils.ts +2 -2
- package/dest/public/enqueued_call_side_effect_trace.d.ts.map +0 -1
- package/dest/public/enqueued_call_side_effect_trace.js +0 -350
- package/dest/public/transitional_adapters.d.ts +0 -4
- package/dest/public/transitional_adapters.d.ts.map +0 -1
- package/dest/public/transitional_adapters.js +0 -29
- package/src/public/transitional_adapters.ts +0 -113
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { AvmAccumulatedData, AvmAppendTreeHint, AvmCircuitPublicInputs, AvmContractBytecodeHints, AvmContractInstanceHint, AvmEnqueuedCallHint, AvmExecutionHints, AvmNullifierReadTreeHint, AvmNullifierWriteTreeHint, AvmPublicDataReadTreeHint, AvmPublicDataWriteTreeHint, EthAddress, L1_TO_L2_MSG_TREE_HEIGHT, L2ToL1Message, MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NoteHash, Nullifier, NullifierLeafPreimage, PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PUBLIC_DATA_TREE_HEIGHT, PUBLIC_LOG_DATA_SIZE_IN_FIELDS, PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicDataTreeLeafPreimage, PublicDataUpdateRequest, PublicDataWrite, PublicLog, ScopedL2ToL1Message, SerializableContractInstance, } from '@aztec/circuits.js';
|
|
2
|
+
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
3
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
6
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { strict as assert } from 'assert';
|
|
8
|
+
import { SideEffectLimitReachedError } from './side_effect_errors.js';
|
|
9
|
+
import { UniqueClassIds } from './unique_class_ids.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(publicDataWrites, protocolPublicDataWrites, noteHashes, nullifiers, l2ToL1Msgs, publicLogs) {
|
|
16
|
+
this.publicDataWrites = publicDataWrites;
|
|
17
|
+
this.protocolPublicDataWrites = protocolPublicDataWrites;
|
|
18
|
+
this.noteHashes = noteHashes;
|
|
19
|
+
this.nullifiers = nullifiers;
|
|
20
|
+
this.l2ToL1Msgs = l2ToL1Msgs;
|
|
21
|
+
this.publicLogs = publicLogs;
|
|
22
|
+
}
|
|
23
|
+
static empty() {
|
|
24
|
+
return new this(0, 0, 0, 0, 0, 0);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Trace side effects for an enqueued public call's execution.
|
|
29
|
+
*/
|
|
30
|
+
export class SideEffectTrace {
|
|
31
|
+
constructor(
|
|
32
|
+
/** The counter of this trace's first side effect. */
|
|
33
|
+
startSideEffectCounter = 0,
|
|
34
|
+
/** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
|
|
35
|
+
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
36
|
+
*/
|
|
37
|
+
previousSideEffectArrayLengths = SideEffectArrayLengths.empty(),
|
|
38
|
+
/** We need to track the set of class IDs used for bytecode retrieval to deduplicate and enforce limits. */
|
|
39
|
+
gotBytecodeFromClassIds = new UniqueClassIds()) {
|
|
40
|
+
this.startSideEffectCounter = startSideEffectCounter;
|
|
41
|
+
this.previousSideEffectArrayLengths = previousSideEffectArrayLengths;
|
|
42
|
+
this.gotBytecodeFromClassIds = gotBytecodeFromClassIds;
|
|
43
|
+
this.log = createLogger('simulator:side_effect_trace');
|
|
44
|
+
this.enqueuedCalls = [];
|
|
45
|
+
this.publicDataWrites = [];
|
|
46
|
+
this.protocolPublicDataWritesLength = 0;
|
|
47
|
+
this.userPublicDataWritesLength = 0;
|
|
48
|
+
this.noteHashes = [];
|
|
49
|
+
this.nullifiers = [];
|
|
50
|
+
this.l2ToL1Messages = [];
|
|
51
|
+
this.publicLogs = [];
|
|
52
|
+
/** Make sure a forked trace is never merged twice. */
|
|
53
|
+
this.alreadyMergedIntoParent = false;
|
|
54
|
+
this.log.debug(`Creating trace instance with startSideEffectCounter: ${startSideEffectCounter}`);
|
|
55
|
+
this.sideEffectCounter = startSideEffectCounter;
|
|
56
|
+
this.avmCircuitHints = AvmExecutionHints.empty();
|
|
57
|
+
}
|
|
58
|
+
fork() {
|
|
59
|
+
return new SideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength, this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length), this.gotBytecodeFromClassIds.fork());
|
|
60
|
+
}
|
|
61
|
+
merge(forkedTrace, reverted = false) {
|
|
62
|
+
// sanity check to avoid merging the same forked trace twice
|
|
63
|
+
assert(!forkedTrace.alreadyMergedIntoParent, 'Bug! Cannot merge a forked trace that has already been merged into its parent!');
|
|
64
|
+
forkedTrace.alreadyMergedIntoParent = true;
|
|
65
|
+
this.sideEffectCounter = forkedTrace.sideEffectCounter;
|
|
66
|
+
this.enqueuedCalls.push(...forkedTrace.enqueuedCalls);
|
|
67
|
+
if (!reverted) {
|
|
68
|
+
this.publicDataWrites.push(...forkedTrace.publicDataWrites);
|
|
69
|
+
this.noteHashes.push(...forkedTrace.noteHashes);
|
|
70
|
+
this.nullifiers.push(...forkedTrace.nullifiers);
|
|
71
|
+
this.l2ToL1Messages.push(...forkedTrace.l2ToL1Messages);
|
|
72
|
+
this.publicLogs.push(...forkedTrace.publicLogs);
|
|
73
|
+
}
|
|
74
|
+
this.mergeHints(forkedTrace);
|
|
75
|
+
}
|
|
76
|
+
mergeHints(forkedTrace) {
|
|
77
|
+
this.gotBytecodeFromClassIds.acceptAndMerge(forkedTrace.gotBytecodeFromClassIds);
|
|
78
|
+
this.avmCircuitHints.enqueuedCalls.items.push(...forkedTrace.avmCircuitHints.enqueuedCalls.items);
|
|
79
|
+
this.avmCircuitHints.contractInstances.items.push(...forkedTrace.avmCircuitHints.contractInstances.items);
|
|
80
|
+
// merge in contract bytecode hints
|
|
81
|
+
// UniqueClassIds should prevent duplication
|
|
82
|
+
for (const [contractClassId, bytecodeHint] of forkedTrace.avmCircuitHints.contractBytecodeHints) {
|
|
83
|
+
assert(!this.avmCircuitHints.contractBytecodeHints.has(contractClassId), 'Bug preventing duplication of contract bytecode hints');
|
|
84
|
+
this.avmCircuitHints.contractBytecodeHints.set(contractClassId, bytecodeHint);
|
|
85
|
+
}
|
|
86
|
+
this.avmCircuitHints.publicDataReads.items.push(...forkedTrace.avmCircuitHints.publicDataReads.items);
|
|
87
|
+
this.avmCircuitHints.publicDataWrites.items.push(...forkedTrace.avmCircuitHints.publicDataWrites.items);
|
|
88
|
+
this.avmCircuitHints.nullifierReads.items.push(...forkedTrace.avmCircuitHints.nullifierReads.items);
|
|
89
|
+
this.avmCircuitHints.nullifierWrites.items.push(...forkedTrace.avmCircuitHints.nullifierWrites.items);
|
|
90
|
+
this.avmCircuitHints.noteHashReads.items.push(...forkedTrace.avmCircuitHints.noteHashReads.items);
|
|
91
|
+
this.avmCircuitHints.noteHashWrites.items.push(...forkedTrace.avmCircuitHints.noteHashWrites.items);
|
|
92
|
+
this.avmCircuitHints.l1ToL2MessageReads.items.push(...forkedTrace.avmCircuitHints.l1ToL2MessageReads.items);
|
|
93
|
+
}
|
|
94
|
+
getCounter() {
|
|
95
|
+
return this.sideEffectCounter;
|
|
96
|
+
}
|
|
97
|
+
incrementSideEffectCounter() {
|
|
98
|
+
this.sideEffectCounter++;
|
|
99
|
+
}
|
|
100
|
+
getNoteHashCount() {
|
|
101
|
+
return this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length;
|
|
102
|
+
}
|
|
103
|
+
tracePublicStorageRead(contractAddress, slot, value, leafPreimage = PublicDataTreeLeafPreimage.empty(), leafIndex = Fr.zero(), path = emptyPublicDataPath()) {
|
|
104
|
+
this.avmCircuitHints.publicDataReads.items.push(new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, path));
|
|
105
|
+
this.log.debug(`Tracing storage read (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter})`);
|
|
106
|
+
this.incrementSideEffectCounter();
|
|
107
|
+
}
|
|
108
|
+
async tracePublicStorageWrite(contractAddress, slot, value, protocolWrite, lowLeafPreimage = PublicDataTreeLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyPublicDataPath(), newLeafPreimage = PublicDataTreeLeafPreimage.empty(), insertionPath = emptyPublicDataPath()) {
|
|
109
|
+
if (protocolWrite) {
|
|
110
|
+
if (this.protocolPublicDataWritesLength + this.previousSideEffectArrayLengths.protocolPublicDataWrites >=
|
|
111
|
+
PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) {
|
|
112
|
+
throw new SideEffectLimitReachedError('protocol public data (contract storage) write', PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
113
|
+
}
|
|
114
|
+
this.protocolPublicDataWritesLength++;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (this.userPublicDataWritesLength + this.previousSideEffectArrayLengths.publicDataWrites >=
|
|
118
|
+
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) {
|
|
119
|
+
throw new SideEffectLimitReachedError('public data (contract storage) write', MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
120
|
+
}
|
|
121
|
+
this.userPublicDataWritesLength++;
|
|
122
|
+
}
|
|
123
|
+
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
124
|
+
this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
|
|
125
|
+
// New hinting
|
|
126
|
+
const readHint = new AvmPublicDataReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
127
|
+
this.avmCircuitHints.publicDataWrites.items.push(new AvmPublicDataWriteTreeHint(readHint, newLeafPreimage, insertionPath));
|
|
128
|
+
this.log.debug(`Traced public data write (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter}, isProtocol:${protocolWrite})`);
|
|
129
|
+
this.incrementSideEffectCounter();
|
|
130
|
+
}
|
|
131
|
+
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
132
|
+
traceNoteHashCheck(_contractAddress, noteHash, leafIndex, _exists, path = emptyNoteHashPath()) {
|
|
133
|
+
// New Hinting
|
|
134
|
+
this.avmCircuitHints.noteHashReads.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
135
|
+
// NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes)
|
|
136
|
+
}
|
|
137
|
+
traceNewNoteHash(noteHash, leafIndex = Fr.zero(), path = emptyNoteHashPath()) {
|
|
138
|
+
if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
|
|
139
|
+
throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX);
|
|
140
|
+
}
|
|
141
|
+
this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter));
|
|
142
|
+
this.log.debug(`NEW_NOTE_HASH cnt: ${this.sideEffectCounter}`);
|
|
143
|
+
this.avmCircuitHints.noteHashWrites.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
144
|
+
this.incrementSideEffectCounter();
|
|
145
|
+
}
|
|
146
|
+
traceNullifierCheck(_siloedNullifier, _exists, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath()) {
|
|
147
|
+
this.avmCircuitHints.nullifierReads.items.push(new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath));
|
|
148
|
+
this.log.debug(`NULLIFIER_EXISTS cnt: ${this.sideEffectCounter}`);
|
|
149
|
+
this.incrementSideEffectCounter();
|
|
150
|
+
}
|
|
151
|
+
traceNewNullifier(siloedNullifier, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath(), insertionPath = emptyNullifierPath()) {
|
|
152
|
+
if (this.nullifiers.length + this.previousSideEffectArrayLengths.nullifiers >= MAX_NULLIFIERS_PER_TX) {
|
|
153
|
+
throw new SideEffectLimitReachedError('nullifier', MAX_NULLIFIERS_PER_TX);
|
|
154
|
+
}
|
|
155
|
+
this.nullifiers.push(new Nullifier(siloedNullifier, this.sideEffectCounter, /*noteHash=*/ Fr.ZERO));
|
|
156
|
+
const lowLeafReadHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
157
|
+
this.avmCircuitHints.nullifierWrites.items.push(new AvmNullifierWriteTreeHint(lowLeafReadHint, insertionPath));
|
|
158
|
+
this.log.debug(`NEW_NULLIFIER cnt: ${this.sideEffectCounter}`);
|
|
159
|
+
this.incrementSideEffectCounter();
|
|
160
|
+
}
|
|
161
|
+
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
162
|
+
traceL1ToL2MessageCheck(_contractAddress, msgHash, msgLeafIndex, _exists, path = emptyL1ToL2MessagePath()) {
|
|
163
|
+
this.avmCircuitHints.l1ToL2MessageReads.items.push(new AvmAppendTreeHint(msgLeafIndex, msgHash, path));
|
|
164
|
+
}
|
|
165
|
+
traceNewL2ToL1Message(contractAddress, recipient, content) {
|
|
166
|
+
if (this.l2ToL1Messages.length + this.previousSideEffectArrayLengths.l2ToL1Msgs >= MAX_L2_TO_L1_MSGS_PER_TX) {
|
|
167
|
+
throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX);
|
|
168
|
+
}
|
|
169
|
+
const recipientAddress = EthAddress.fromField(recipient);
|
|
170
|
+
this.l2ToL1Messages.push(new L2ToL1Message(recipientAddress, content, this.sideEffectCounter).scope(contractAddress));
|
|
171
|
+
this.log.debug(`NEW_L2_TO_L1_MSG cnt: ${this.sideEffectCounter}`);
|
|
172
|
+
this.incrementSideEffectCounter();
|
|
173
|
+
}
|
|
174
|
+
tracePublicLog(contractAddress, log) {
|
|
175
|
+
if (this.publicLogs.length + this.previousSideEffectArrayLengths.publicLogs >= MAX_PUBLIC_LOGS_PER_TX) {
|
|
176
|
+
throw new SideEffectLimitReachedError('public log', MAX_PUBLIC_LOGS_PER_TX);
|
|
177
|
+
}
|
|
178
|
+
if (log.length > PUBLIC_LOG_DATA_SIZE_IN_FIELDS) {
|
|
179
|
+
throw new Error(`Emitted public log is too large, max: ${PUBLIC_LOG_DATA_SIZE_IN_FIELDS}, passed: ${log.length}`);
|
|
180
|
+
}
|
|
181
|
+
const publicLog = new PublicLog(contractAddress, padArrayEnd(log, Fr.ZERO, PUBLIC_LOG_DATA_SIZE_IN_FIELDS));
|
|
182
|
+
this.publicLogs.push(publicLog);
|
|
183
|
+
this.log.debug(`NEW_PUBLIC_LOG cnt: ${this.sideEffectCounter}`);
|
|
184
|
+
this.incrementSideEffectCounter();
|
|
185
|
+
}
|
|
186
|
+
traceGetContractInstance(contractAddress, exists, instance = SerializableContractInstance.default(), lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath()) {
|
|
187
|
+
const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
188
|
+
this.avmCircuitHints.contractInstances.items.push(new AvmContractInstanceHint(contractAddress, exists, instance.salt, instance.deployer, instance.contractClassId, instance.initializationHash, instance.publicKeys, membershipHint));
|
|
189
|
+
this.log.debug(`CONTRACT_INSTANCE cnt: ${this.sideEffectCounter}`);
|
|
190
|
+
this.incrementSideEffectCounter();
|
|
191
|
+
}
|
|
192
|
+
// This tracing function gets called everytime we start simulation/execution.
|
|
193
|
+
// This happens both when starting a new top-level trace and the start of every forked trace
|
|
194
|
+
// We use this to collect the AvmContractBytecodeHints
|
|
195
|
+
traceGetBytecode(contractAddress, exists, bytecode = Buffer.alloc(0), contractInstance = SerializableContractInstance.default(), contractClass = {
|
|
196
|
+
artifactHash: Fr.zero(),
|
|
197
|
+
privateFunctionsRoot: Fr.zero(),
|
|
198
|
+
publicBytecodeCommitment: Fr.zero(),
|
|
199
|
+
}, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath()) {
|
|
200
|
+
// FIXME: The way we are hinting contract bytecodes is fundamentally broken.
|
|
201
|
+
// We are mapping contract class ID to a bytecode hint
|
|
202
|
+
// But a bytecode hint is tied to a contract INSTANCE.
|
|
203
|
+
// What if you encounter another contract instance with the same class ID?
|
|
204
|
+
// We can't hint that instance too since there is already an entry in the hints set that class ID.
|
|
205
|
+
// But without that instance hinted, the circuit can't prove that the called contract address
|
|
206
|
+
// actually corresponds to any class ID.
|
|
207
|
+
const membershipHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
208
|
+
const instance = new AvmContractInstanceHint(contractAddress, exists, contractInstance.salt, contractInstance.deployer, contractInstance.contractClassId, contractInstance.initializationHash, contractInstance.publicKeys, membershipHint);
|
|
209
|
+
// Always hint the contract instance separately from the bytecode hint.
|
|
210
|
+
// Since the bytecode hints are keyed by class ID, we need to hint the instance separately
|
|
211
|
+
// since there might be multiple instances hinted for the same class ID.
|
|
212
|
+
this.avmCircuitHints.contractInstances.items.push(instance);
|
|
213
|
+
this.log.debug(`Tracing contract instance for bytecode retrieval: exists=${exists}, instance=${jsonStringify(contractInstance)}`);
|
|
214
|
+
if (!exists) {
|
|
215
|
+
// this ensures there are no duplicates
|
|
216
|
+
this.log.debug(`Contract address ${contractAddress} does not exist. Not tracing bytecode & class ID.`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// We already hinted this bytecode. No need to
|
|
220
|
+
// Don't we still need to hint if the class ID already exists?
|
|
221
|
+
// Because the circuit needs to prove that the called contract address corresponds to the class ID.
|
|
222
|
+
// To do so, the circuit needs to know the class ID in the
|
|
223
|
+
if (this.gotBytecodeFromClassIds.has(contractInstance.contractClassId.toString())) {
|
|
224
|
+
// this ensures there are no duplicates
|
|
225
|
+
this.log.debug(`Contract class id ${contractInstance.contractClassId.toString()} already exists in previous hints`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// If we could actually allow contract calls after the limit was reached, we would hint even if we have
|
|
229
|
+
// surpassed the limit of unique class IDs (still trace the failed bytecode retrieval)
|
|
230
|
+
// because the circuit needs to know the class ID to know when the limit is hit.
|
|
231
|
+
// BUT, the issue with this approach is that the sequencer could lie and say "this call was to a new class ID",
|
|
232
|
+
// and the circuit cannot prove that it's not true without deriving the class ID from bytecode,
|
|
233
|
+
// proving that it corresponds to the called contract address, and proving that the class ID wasn't already
|
|
234
|
+
// present/used. That would require more bytecode hashing which is exactly what this limit exists to avoid.
|
|
235
|
+
if (this.gotBytecodeFromClassIds.size() >= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS) {
|
|
236
|
+
this.log.debug(`Bytecode retrieval failure for contract class ID ${contractInstance.contractClassId.toString()} (limit reached)`);
|
|
237
|
+
throw new SideEffectLimitReachedError('contract calls to unique class IDs', MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS);
|
|
238
|
+
}
|
|
239
|
+
this.log.debug(`Tracing bytecode & contract class for bytecode retrieval: class=${jsonStringify(contractClass)}`);
|
|
240
|
+
this.avmCircuitHints.contractBytecodeHints.set(contractInstance.contractClassId.toString(), new AvmContractBytecodeHints(bytecode, instance, contractClass));
|
|
241
|
+
// After adding the bytecode hint, mark the classId as retrieved to avoid duplication.
|
|
242
|
+
// The above map alone isn't sufficient because we need to check the parent trace's (and its parent) as well.
|
|
243
|
+
this.gotBytecodeFromClassIds.add(contractInstance.contractClassId.toString());
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Trace an enqueued call.
|
|
247
|
+
* Accept some results from a finished call's trace into this one.
|
|
248
|
+
*/
|
|
249
|
+
traceEnqueuedCall(
|
|
250
|
+
/** The call request from private that enqueued this call. */
|
|
251
|
+
publicCallRequest,
|
|
252
|
+
/** The call's calldata */
|
|
253
|
+
calldata,
|
|
254
|
+
/** Did the call revert? */
|
|
255
|
+
_reverted) {
|
|
256
|
+
this.log.debug(`Tracing enqueued call`);
|
|
257
|
+
// TODO(4805): check if some threshold is reached for max enqueued or nested calls (to unique contracts?)
|
|
258
|
+
this.enqueuedCalls.push(publicCallRequest);
|
|
259
|
+
this.avmCircuitHints.enqueuedCalls.items.push(new AvmEnqueuedCallHint(publicCallRequest.contractAddress, calldata));
|
|
260
|
+
}
|
|
261
|
+
getSideEffects() {
|
|
262
|
+
return {
|
|
263
|
+
enqueuedCalls: this.enqueuedCalls,
|
|
264
|
+
publicDataWrites: this.publicDataWrites,
|
|
265
|
+
noteHashes: this.noteHashes,
|
|
266
|
+
nullifiers: this.nullifiers,
|
|
267
|
+
l2ToL1Msgs: this.l2ToL1Messages,
|
|
268
|
+
publicLogs: this.publicLogs,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
toAvmCircuitPublicInputs(
|
|
272
|
+
/** Globals. */
|
|
273
|
+
globalVariables,
|
|
274
|
+
/** Start tree snapshots. */
|
|
275
|
+
startTreeSnapshots,
|
|
276
|
+
/** Gas used at start of TX. */
|
|
277
|
+
startGasUsed,
|
|
278
|
+
/** How much gas was available for this public execution. */
|
|
279
|
+
gasLimits,
|
|
280
|
+
/** Address of the fee payer. */
|
|
281
|
+
feePayer,
|
|
282
|
+
/** Call requests for setup phase. */
|
|
283
|
+
publicSetupCallRequests,
|
|
284
|
+
/** Call requests for app logic phase. */
|
|
285
|
+
publicAppLogicCallRequests,
|
|
286
|
+
/** Call request for teardown phase. */
|
|
287
|
+
publicTeardownCallRequest,
|
|
288
|
+
/** End tree snapshots. */
|
|
289
|
+
endTreeSnapshots,
|
|
290
|
+
/**
|
|
291
|
+
* Gas used by the whole transaction, assuming entire teardown limit is used.
|
|
292
|
+
* This is the gas used when computing transaction fee.
|
|
293
|
+
*/
|
|
294
|
+
endGasUsed,
|
|
295
|
+
/** Transaction fee. */
|
|
296
|
+
transactionFee,
|
|
297
|
+
/** The call's results */
|
|
298
|
+
reverted) {
|
|
299
|
+
return new AvmCircuitPublicInputs(globalVariables, startTreeSnapshots, startGasUsed, gasLimits, feePayer, padArrayEnd(publicSetupCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), padArrayEnd(publicAppLogicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), publicTeardownCallRequest,
|
|
300
|
+
/*previousNonRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
301
|
+
/*previousRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
302
|
+
/*previousNonRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(),
|
|
303
|
+
/*previousRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(), endTreeSnapshots, endGasUsed,
|
|
304
|
+
/*accumulatedData=*/ this.getAvmAccumulatedData(), transactionFee, reverted);
|
|
305
|
+
}
|
|
306
|
+
getPublicLogs() {
|
|
307
|
+
return this.publicLogs;
|
|
308
|
+
}
|
|
309
|
+
getAvmCircuitHints() {
|
|
310
|
+
return this.avmCircuitHints;
|
|
311
|
+
}
|
|
312
|
+
getAvmAccumulatedData() {
|
|
313
|
+
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.publicLogs, PublicLog.empty(), MAX_PUBLIC_LOGS_PER_TX), padArrayEnd(this.publicDataWrites.map(w => new PublicDataWrite(w.leafSlot, w.newValue)), PublicDataWrite.empty(), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZV9lZmZlY3RfdHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL3NpZGVfZWZmZWN0X3RyYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBRzFCLFVBQVUsRUFJVix3QkFBd0IsRUFDeEIsYUFBYSxFQUNiLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw2Q0FBNkMsRUFDN0Msc0NBQXNDLEVBQ3RDLHNCQUFzQixFQUN0Qiw0Q0FBNEMsRUFDNUMscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixRQUFRLEVBQ1IsU0FBUyxFQUNULHFCQUFxQixFQUNyQiwyQ0FBMkMsRUFDM0MsdUJBQXVCLEVBQ3ZCLDhCQUE4QixFQUM5QiwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBQ3ZDLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLGVBQWUsRUFDZixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLDRCQUE0QixHQUU3QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsTUFBTSxJQUFJLE1B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
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import { type ContractClassIdPreimage, type
|
|
3
|
+
import { type ContractClassIdPreimage, type NullifierLeafPreimage, type PublicCallRequest, type PublicDataTreeLeafPreimage, type PublicLog, type SerializableContractInstance } from '@aztec/circuits.js';
|
|
4
4
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
5
5
|
import { type Fr } from '@aztec/foundation/fields';
|
|
6
|
-
import { type AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
|
|
7
|
-
import { type AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
8
|
-
import { type EnqueuedPublicCallExecutionResultWithSideEffects, type PublicFunctionCallResult } from './execution.js';
|
|
9
6
|
export interface PublicSideEffectTraceInterface {
|
|
10
7
|
fork(): PublicSideEffectTraceInterface;
|
|
11
8
|
merge(nestedTrace: PublicSideEffectTraceInterface, reverted?: boolean): void;
|
|
12
9
|
getCounter(): number;
|
|
13
10
|
tracePublicStorageRead(contractAddress: AztecAddress, slot: Fr, value: Fr, leafPreimage?: PublicDataTreeLeafPreimage, leafIndex?: Fr, path?: Fr[]): void;
|
|
14
11
|
tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, // This is the storage slot not the computed leaf slot
|
|
15
|
-
value: Fr, protocolWrite: boolean, lowLeafPreimage?: PublicDataTreeLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[], newLeafPreimage?: PublicDataTreeLeafPreimage, insertionPath?: Fr[]): void
|
|
12
|
+
value: Fr, protocolWrite: boolean, lowLeafPreimage?: PublicDataTreeLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[], newLeafPreimage?: PublicDataTreeLeafPreimage, insertionPath?: Fr[]): Promise<void>;
|
|
16
13
|
traceNoteHashCheck(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, exists: boolean, path?: Fr[]): void;
|
|
17
14
|
traceNewNoteHash(uniqueNoteHash: Fr, leafIndex?: Fr, path?: Fr[]): void;
|
|
18
15
|
getNoteHashCount(): number;
|
|
@@ -30,20 +27,6 @@ export interface PublicSideEffectTraceInterface {
|
|
|
30
27
|
calldata: Fr[],
|
|
31
28
|
/** Did the call revert? */
|
|
32
29
|
reverted: boolean): void;
|
|
33
|
-
toPublicEnqueuedCallExecutionResult(
|
|
34
|
-
/** The call's results */
|
|
35
|
-
avmCallResults: AvmFinalizedCallResult): EnqueuedPublicCallExecutionResultWithSideEffects;
|
|
36
|
-
toPublicFunctionCallResult(
|
|
37
|
-
/** The execution environment of the nested call. */
|
|
38
|
-
avmEnvironment: AvmExecutionEnvironment,
|
|
39
|
-
/** How much gas was available for this public execution. */
|
|
40
|
-
startGasLeft: Gas,
|
|
41
|
-
/** Bytecode used for this execution. */
|
|
42
|
-
bytecode: Buffer,
|
|
43
|
-
/** The call's results */
|
|
44
|
-
avmCallResults: AvmFinalizedCallResult,
|
|
45
|
-
/** Function name for logging */
|
|
46
|
-
functionName: string): PublicFunctionCallResult;
|
|
47
30
|
getPublicLogs(): PublicLog[];
|
|
48
31
|
}
|
|
49
32
|
//# sourceMappingURL=side_effect_trace_interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,
|
|
1
|
+
{"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":"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"}
|
package/dest/test/utils.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ import { type AztecAddress, Fr } from '@aztec/circuits.js';
|
|
|
8
8
|
* @param secret - The secret to unlock the message.
|
|
9
9
|
* @returns The L1 to L2 message.
|
|
10
10
|
*/
|
|
11
|
-
export declare const buildL1ToL2Message: (selector: string, contentPreimage: Fr[], targetContract: AztecAddress, secret: Fr, msgIndex: Fr | number) => L1ToL2Message
|
|
11
|
+
export declare const buildL1ToL2Message: (selector: string, contentPreimage: Fr[], targetContract: AztecAddress, secret: Fr, msgIndex: Fr | number) => Promise<L1ToL2Message>;
|
|
12
12
|
//# sourceMappingURL=utils.d.ts.map
|
package/dest/test/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAW,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAc,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAIvE;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,aACnB,MAAM,mBACC,EAAE,EAAE,kBACL,YAAY,UACpB,EAAE,YACA,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAW,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAc,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAIvE;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,aACnB,MAAM,mBACC,EAAE,EAAE,kBACL,YAAY,UACpB,EAAE,YACA,EAAE,GAAG,MAAM,2BAetB,CAAC"}
|
package/dest/test/utils.js
CHANGED
|
@@ -10,11 +10,11 @@ import { sha256ToField } from '@aztec/foundation/crypto';
|
|
|
10
10
|
* @param secret - The secret to unlock the message.
|
|
11
11
|
* @returns The L1 to L2 message.
|
|
12
12
|
*/
|
|
13
|
-
export const buildL1ToL2Message = (selector, contentPreimage, targetContract, secret, msgIndex) => {
|
|
13
|
+
export const buildL1ToL2Message = async (selector, contentPreimage, targetContract, secret, msgIndex) => {
|
|
14
14
|
// Write the selector into a buffer.
|
|
15
15
|
const selectorBuf = Buffer.from(selector, 'hex');
|
|
16
16
|
const content = sha256ToField([selectorBuf, ...contentPreimage]);
|
|
17
|
-
const secretHash = computeSecretHash(secret);
|
|
17
|
+
const secretHash = await computeSecretHash(secret);
|
|
18
18
|
return new L1ToL2Message(new L1Actor(EthAddress.random(), 1), new L2Actor(targetContract, 1), content, secretHash, new Fr(msgIndex));
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQXFCLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFekQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDckMsUUFBZ0IsRUFDaEIsZUFBcUIsRUFDckIsY0FBNEIsRUFDNUIsTUFBVSxFQUNWLFFBQXFCLEVBQ3JCLEVBQUU7SUFDRixvQ0FBb0M7SUFDcEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFakQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5ELE9BQU8sSUFBSSxhQUFhLENBQ3RCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDbkMsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUM5QixPQUFPLEVBQ1AsVUFBVSxFQUNWLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.74.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./common": "./dest/common.js",
|
|
@@ -60,14 +60,14 @@
|
|
|
60
60
|
]
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@aztec/circuit-types": "0.
|
|
64
|
-
"@aztec/circuits.js": "0.
|
|
65
|
-
"@aztec/foundation": "0.
|
|
66
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
67
|
-
"@aztec/protocol-contracts": "0.
|
|
68
|
-
"@aztec/telemetry-client": "0.
|
|
69
|
-
"@aztec/types": "0.
|
|
70
|
-
"@aztec/world-state": "0.
|
|
63
|
+
"@aztec/circuit-types": "0.74.0",
|
|
64
|
+
"@aztec/circuits.js": "0.74.0",
|
|
65
|
+
"@aztec/foundation": "0.74.0",
|
|
66
|
+
"@aztec/noir-protocol-circuits-types": "0.74.0",
|
|
67
|
+
"@aztec/protocol-contracts": "0.74.0",
|
|
68
|
+
"@aztec/telemetry-client": "0.74.0",
|
|
69
|
+
"@aztec/types": "0.74.0",
|
|
70
|
+
"@aztec/world-state": "0.74.0",
|
|
71
71
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
72
72
|
"@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
|
|
73
73
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -28,20 +28,14 @@ type OpcodeTally = {
|
|
|
28
28
|
count: number;
|
|
29
29
|
gas: Gas;
|
|
30
30
|
};
|
|
31
|
-
type PcTally = {
|
|
32
|
-
opcode: string;
|
|
33
|
-
count: number;
|
|
34
|
-
gas: Gas;
|
|
35
|
-
};
|
|
36
31
|
|
|
37
32
|
export class AvmSimulator {
|
|
38
33
|
private log: Logger;
|
|
39
34
|
private bytecode: Buffer | undefined;
|
|
40
35
|
private opcodeTallies: Map<string, OpcodeTally> = new Map();
|
|
41
|
-
private pcTallies: Map<number, PcTally> = new Map();
|
|
42
36
|
|
|
43
37
|
private tallyPrintFunction = () => {};
|
|
44
|
-
private tallyInstructionFunction = (
|
|
38
|
+
private tallyInstructionFunction = (_b: string, _c: Gas) => {};
|
|
45
39
|
|
|
46
40
|
// Test Purposes only: Logger will not have the proper function name. Use this constructor for testing purposes
|
|
47
41
|
// only. Otherwise, use build() below.
|
|
@@ -145,7 +139,6 @@ export class AvmSimulator {
|
|
|
145
139
|
while (!machineState.getHalted()) {
|
|
146
140
|
const [instruction, bytesRead] = decodeInstructionFromBytecode(bytecode, machineState.pc, this.instructionSet);
|
|
147
141
|
const instrStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
|
|
148
|
-
const instrPc = machineState.pc; // Save PC before executing instruction (for profiling)
|
|
149
142
|
|
|
150
143
|
this.log.trace(
|
|
151
144
|
`[PC:${machineState.pc}] [IC:${instrCounter++}] ${instruction.toString()} (gasLeft l2=${
|
|
@@ -168,7 +161,7 @@ export class AvmSimulator {
|
|
|
168
161
|
l2Gas: instrStartGas.l2Gas - machineState.l2GasLeft,
|
|
169
162
|
daGas: instrStartGas.daGas - machineState.daGasLeft,
|
|
170
163
|
};
|
|
171
|
-
this.tallyInstructionFunction(
|
|
164
|
+
this.tallyInstructionFunction(instruction.constructor.name, gasUsed);
|
|
172
165
|
|
|
173
166
|
if (machineState.pc >= bytecode.length) {
|
|
174
167
|
this.log.warn('Passed end of program');
|
|
@@ -239,18 +232,12 @@ export class AvmSimulator {
|
|
|
239
232
|
);
|
|
240
233
|
}
|
|
241
234
|
|
|
242
|
-
private tallyInstruction(
|
|
235
|
+
private tallyInstruction(opcode: string, gasUsed: Gas) {
|
|
243
236
|
const opcodeTally = this.opcodeTallies.get(opcode) || ({ count: 0, gas: { l2Gas: 0, daGas: 0 } } as OpcodeTally);
|
|
244
237
|
opcodeTally.count++;
|
|
245
238
|
opcodeTally.gas.l2Gas += gasUsed.l2Gas;
|
|
246
239
|
opcodeTally.gas.daGas += gasUsed.daGas;
|
|
247
240
|
this.opcodeTallies.set(opcode, opcodeTally);
|
|
248
|
-
|
|
249
|
-
const pcTally = this.pcTallies.get(pc) || ({ opcode: opcode, count: 0, gas: { l2Gas: 0, daGas: 0 } } as PcTally);
|
|
250
|
-
pcTally.count++;
|
|
251
|
-
pcTally.gas.l2Gas += gasUsed.l2Gas;
|
|
252
|
-
pcTally.gas.daGas += gasUsed.daGas;
|
|
253
|
-
this.pcTallies.set(pc, pcTally);
|
|
254
241
|
}
|
|
255
242
|
|
|
256
243
|
private printOpcodeTallies() {
|
|
@@ -261,16 +248,5 @@ export class AvmSimulator {
|
|
|
261
248
|
// NOTE: don't care to clutter the logs with DA gas for now
|
|
262
249
|
this.log.debug(`${opcode} executed ${tally.count} times consuming a total of ${tally.gas.l2Gas} L2 gas`);
|
|
263
250
|
}
|
|
264
|
-
|
|
265
|
-
this.log.debug(`Printing tallies per PC sorted by #times each PC was executed...`);
|
|
266
|
-
const sortedPcs = Array.from(this.pcTallies.entries())
|
|
267
|
-
.sort((a, b) => b[1].count - a[1].count)
|
|
268
|
-
.filter((_, i) => i < 20);
|
|
269
|
-
for (const [pc, tally] of sortedPcs) {
|
|
270
|
-
// NOTE: don't care to clutter the logs with DA gas for now
|
|
271
|
-
this.log.debug(
|
|
272
|
-
`PC:${pc} containing opcode ${tally.opcode} executed ${tally.count} times consuming a total of ${tally.gas.l2Gas} L2 gas`,
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
251
|
}
|
|
276
252
|
}
|