@aztec/simulator 0.71.0 → 0.73.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/acvm/oracle/oracle.d.ts +0 -1
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +1 -5
- package/dest/acvm/oracle/typed_oracle.d.ts +0 -1
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +1 -4
- 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/errors.d.ts +6 -0
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +10 -1
- 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 +74 -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 +6 -2
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +28 -14
- 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 +5 -6
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +28 -26
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +4 -3
- package/dest/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/avm/opcodes/conversion.js +10 -7
- package/dest/avm/opcodes/ec_add.js +2 -2
- package/dest/avm/opcodes/hashing.js +2 -2
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -1
- package/dest/avm/opcodes/multi_scalar_mul.js +9 -7
- 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 +2 -6
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +23 -26
- 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 +8 -26
- 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 -247
- 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 +89 -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 +4 -5
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +28 -28
- 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 +44 -18
- package/dest/public/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator.js +9 -12
- package/dest/public/{enqueued_call_side_effect_trace.d.ts → side_effect_trace.d.ts} +12 -15
- package/dest/public/side_effect_trace.d.ts.map +1 -0
- package/dest/public/side_effect_trace.js +350 -0
- package/dest/public/side_effect_trace_interface.d.ts +4 -5
- 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 +10 -10
- package/src/acvm/oracle/oracle.ts +0 -5
- package/src/acvm/oracle/typed_oracle.ts +0 -4
- package/src/avm/avm_simulator.ts +3 -27
- package/src/avm/avm_tree.ts +39 -37
- package/src/avm/errors.ts +10 -0
- package/src/avm/fixtures/avm_simulation_tester.ts +105 -0
- package/src/avm/fixtures/base_avm_simulation_tester.ts +104 -0
- package/src/avm/fixtures/index.ts +46 -17
- package/src/avm/fixtures/simple_contract_data_source.ts +98 -0
- package/src/avm/journal/journal.ts +28 -26
- package/src/avm/opcodes/accrued_substate.ts +3 -2
- package/src/avm/opcodes/conversion.ts +15 -6
- package/src/avm/opcodes/ec_add.ts +1 -1
- package/src/avm/opcodes/hashing.ts +1 -1
- package/src/avm/opcodes/multi_scalar_mul.ts +8 -6
- package/src/avm/test_utils.ts +3 -4
- package/src/client/client_execution_context.ts +29 -30
- 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 +10 -34
- package/src/public/fee_payment.ts +2 -2
- package/src/public/fixtures/index.ts +2 -381
- package/src/public/fixtures/public_tx_simulation_tester.ts +174 -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 +32 -30
- package/src/public/public_tx_context.ts +87 -28
- package/src/public/public_tx_simulator.ts +7 -14
- package/src/public/{enqueued_call_side_effect_trace.ts → side_effect_trace.ts} +29 -41
- package/src/public/side_effect_trace_interface.ts +4 -4
- 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 -357
- 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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { NestedProcessReturnValues, TxExecutionPhase,
|
|
2
|
+
import { NestedProcessReturnValues, TxExecutionPhase, } from '@aztec/circuit-types';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { Timer } from '@aztec/foundation/timer';
|
|
5
5
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
@@ -35,7 +35,7 @@ let PublicTxSimulator = (() => {
|
|
|
35
35
|
* @returns The result of the transaction's public execution.
|
|
36
36
|
*/
|
|
37
37
|
async simulate(tx) {
|
|
38
|
-
const txHash = tx.getTxHash();
|
|
38
|
+
const txHash = await tx.getTxHash();
|
|
39
39
|
this.log.debug(`Simulating ${tx.enqueuedPublicFunctionCalls.length} public calls for tx ${txHash}`, { txHash });
|
|
40
40
|
const context = await PublicTxContext.create(this.db, this.worldStateDB, tx, this.globalVariables, this.doMerkleOperations);
|
|
41
41
|
// add new contracts to the contracts db so that their functions may be found and called
|
|
@@ -70,20 +70,17 @@ let PublicTxSimulator = (() => {
|
|
|
70
70
|
context.halt();
|
|
71
71
|
await this.payFee(context);
|
|
72
72
|
const endStateReference = await this.db.getStateReference();
|
|
73
|
-
const avmProvingRequest = context.generateProvingRequest(endStateReference);
|
|
74
|
-
const avmCircuitPublicInputs = avmProvingRequest.inputs.output;
|
|
73
|
+
const avmProvingRequest = await context.generateProvingRequest(endStateReference);
|
|
75
74
|
const revertCode = context.getFinalRevertCode();
|
|
76
75
|
if (!revertCode.isOK()) {
|
|
77
76
|
// TODO(#6464): Should we allow emitting contracts in the private setup phase?
|
|
78
77
|
// if so, this is removing contracts deployed in private setup
|
|
79
78
|
// You can't submit contracts in public, so this is only relevant for private-created side effects
|
|
80
79
|
// FIXME: we shouldn't need to directly modify worldStateDb here!
|
|
81
|
-
await this.worldStateDB.removeNewContracts(tx);
|
|
80
|
+
await this.worldStateDB.removeNewContracts(tx, true);
|
|
82
81
|
// FIXME(dbanks12): should not be changing immutable tx
|
|
83
|
-
tx.filterRevertedLogs(tx.data.forPublic.nonRevertibleAccumulatedData
|
|
82
|
+
tx.filterRevertedLogs(tx.data.forPublic.nonRevertibleAccumulatedData);
|
|
84
83
|
}
|
|
85
|
-
// FIXME(dbanks12): should not be changing immutable tx
|
|
86
|
-
tx.unencryptedLogs.addFunctionLogs([new UnencryptedFunctionL2Logs(context.trace.getUnencryptedLogs())]);
|
|
87
84
|
return {
|
|
88
85
|
avmProvingRequest,
|
|
89
86
|
gasUsed: {
|
|
@@ -263,7 +260,7 @@ let PublicTxSimulator = (() => {
|
|
|
263
260
|
}
|
|
264
261
|
for (const noteHash of context.nonRevertibleAccumulatedDataFromPrivate.noteHashes) {
|
|
265
262
|
if (!noteHash.isEmpty()) {
|
|
266
|
-
stateManager.writeUniqueNoteHash(noteHash);
|
|
263
|
+
await stateManager.writeUniqueNoteHash(noteHash);
|
|
267
264
|
}
|
|
268
265
|
}
|
|
269
266
|
}
|
|
@@ -286,7 +283,7 @@ let PublicTxSimulator = (() => {
|
|
|
286
283
|
for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes) {
|
|
287
284
|
if (!noteHash.isEmpty()) {
|
|
288
285
|
// Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can.
|
|
289
|
-
stateManager.writeSiloedNoteHash(noteHash);
|
|
286
|
+
await stateManager.writeSiloedNoteHash(noteHash);
|
|
290
287
|
}
|
|
291
288
|
}
|
|
292
289
|
}
|
|
@@ -297,7 +294,7 @@ let PublicTxSimulator = (() => {
|
|
|
297
294
|
return;
|
|
298
295
|
}
|
|
299
296
|
const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
|
|
300
|
-
const balanceSlot = computeFeePayerBalanceStorageSlot(context.feePayer);
|
|
297
|
+
const balanceSlot = await computeFeePayerBalanceStorageSlot(context.feePayer);
|
|
301
298
|
this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${context.feePayer}`);
|
|
302
299
|
const stateManager = context.state.getActiveStateManager();
|
|
303
300
|
let currentBalance = await stateManager.readStorage(feeJuiceAddress, balanceSlot);
|
|
@@ -333,4 +330,4 @@ let PublicTxSimulator = (() => {
|
|
|
333
330
|
_a;
|
|
334
331
|
})();
|
|
335
332
|
export { PublicTxSimulator };
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3R4X3NpbXVsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvcHVibGljX3R4X3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUlMLHlCQUF5QixFQUl6QixnQkFBZ0IsRUFDaEIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFxQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2SCxPQUFPLEVBQUUsTUFBTSxJQUFJLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcxQyxPQUFPLEVBQW1DLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7SUFvQjVDLGlCQUFpQjs7Ozs7c0JBQWpCLGlCQUFpQjtZQUs1QixZQUNVLEVBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLHFCQUE4QixLQUFLLEVBQ25DLG9CQUE2QixJQUFJLEVBQ3pDLGtCQUFtQyxrQkFBa0IsRUFBRTtnQkFML0MsT0FBRSxJQU5ELG1EQUFpQixFQU1sQixFQUFFLEVBQTBCO2dC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
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3R4X3NpbXVsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvcHVibGljX3R4X3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUlMLHlCQUF5QixFQUl6QixnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQXFDLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZILE9BQU8sRUFBRSxNQUFNLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRzFDLE9BQU8sRUFBbUMsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztJQW9CNUMsaUJBQWlCOzs7OztzQkFBakIsaUJBQWlCO1lBSzVCLFlBQ1UsRUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsZUFBZ0MsRUFDaEMscUJBQThCLEtBQUssRUFDbkMsb0JBQTZCLElBQUksRUFDekMsa0JBQW1DLGtCQUFrQixFQUFFO2dCQUwvQyxPQUFFLElBTkQsbURBQWlCLEVBTWxCLEVBQUUsRUFBMEI7Z0JBQzVCLGlCQUFZLEdB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
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import {
|
|
4
|
-
import { AvmCircuitPublicInputs, AvmExecutionHints, type AztecAddress, type ContractClassIdPreimage, Gas, type GasSettings, type GlobalVariables, NoteHash, Nullifier, NullifierLeafPreimage, PublicCallRequest, PublicDataTreeLeafPreimage, PublicDataUpdateRequest, ScopedL2ToL1Message, ScopedLogHash, SerializableContractInstance, type TreeSnapshots } from '@aztec/circuits.js';
|
|
3
|
+
import { AvmCircuitPublicInputs, AvmExecutionHints, type AztecAddress, type ContractClassIdPreimage, Gas, type GasSettings, type GlobalVariables, NoteHash, Nullifier, NullifierLeafPreimage, PublicCallRequest, PublicDataTreeLeafPreimage, PublicDataUpdateRequest, PublicLog, ScopedL2ToL1Message, SerializableContractInstance, type TreeSnapshots } from '@aztec/circuits.js';
|
|
5
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
6
5
|
import { type AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
|
|
7
6
|
import { type AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
@@ -19,8 +18,7 @@ export type SideEffects = {
|
|
|
19
18
|
noteHashes: NoteHash[];
|
|
20
19
|
nullifiers: Nullifier[];
|
|
21
20
|
l2ToL1Msgs: ScopedL2ToL1Message[];
|
|
22
|
-
|
|
23
|
-
unencryptedLogsHashes: ScopedLogHash[];
|
|
21
|
+
publicLogs: PublicLog[];
|
|
24
22
|
};
|
|
25
23
|
export declare class SideEffectArrayLengths {
|
|
26
24
|
readonly publicDataWrites: number;
|
|
@@ -28,14 +26,14 @@ export declare class SideEffectArrayLengths {
|
|
|
28
26
|
readonly noteHashes: number;
|
|
29
27
|
readonly nullifiers: number;
|
|
30
28
|
readonly l2ToL1Msgs: number;
|
|
31
|
-
readonly
|
|
32
|
-
constructor(publicDataWrites: number, protocolPublicDataWrites: number, noteHashes: number, nullifiers: number, l2ToL1Msgs: number,
|
|
29
|
+
readonly publicLogs: number;
|
|
30
|
+
constructor(publicDataWrites: number, protocolPublicDataWrites: number, noteHashes: number, nullifiers: number, l2ToL1Msgs: number, publicLogs: number);
|
|
33
31
|
static empty(): SideEffectArrayLengths;
|
|
34
32
|
}
|
|
35
33
|
/**
|
|
36
|
-
* Trace side effects for an
|
|
34
|
+
* Trace side effects for an enqueued public call's execution.
|
|
37
35
|
*/
|
|
38
|
-
export declare class
|
|
36
|
+
export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
39
37
|
/** The counter of this trace's first side effect. */
|
|
40
38
|
readonly startSideEffectCounter: number;
|
|
41
39
|
/** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
|
|
@@ -54,8 +52,7 @@ export declare class PublicEnqueuedCallSideEffectTrace implements PublicSideEffe
|
|
|
54
52
|
private noteHashes;
|
|
55
53
|
private nullifiers;
|
|
56
54
|
private l2ToL1Messages;
|
|
57
|
-
private
|
|
58
|
-
private unencryptedLogsHashes;
|
|
55
|
+
private publicLogs;
|
|
59
56
|
private avmCircuitHints;
|
|
60
57
|
/** Make sure a forked trace is never merged twice. */
|
|
61
58
|
private alreadyMergedIntoParent;
|
|
@@ -68,21 +65,21 @@ export declare class PublicEnqueuedCallSideEffectTrace implements PublicSideEffe
|
|
|
68
65
|
previousSideEffectArrayLengths?: SideEffectArrayLengths,
|
|
69
66
|
/** We need to track the set of class IDs used for bytecode retrieval to deduplicate and enforce limits. */
|
|
70
67
|
gotBytecodeFromClassIds?: UniqueClassIds);
|
|
71
|
-
fork():
|
|
68
|
+
fork(): SideEffectTrace;
|
|
72
69
|
merge(forkedTrace: this, reverted?: boolean): void;
|
|
73
70
|
private mergeHints;
|
|
74
71
|
getCounter(): number;
|
|
75
72
|
private incrementSideEffectCounter;
|
|
76
73
|
getNoteHashCount(): number;
|
|
77
74
|
tracePublicStorageRead(contractAddress: AztecAddress, slot: Fr, value: Fr, leafPreimage?: PublicDataTreeLeafPreimage, leafIndex?: Fr, path?: Fr[]): void;
|
|
78
|
-
tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite: boolean, lowLeafPreimage?: PublicDataTreeLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[], newLeafPreimage?: PublicDataTreeLeafPreimage, insertionPath?: Fr[]): void
|
|
75
|
+
tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite: boolean, lowLeafPreimage?: PublicDataTreeLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[], newLeafPreimage?: PublicDataTreeLeafPreimage, insertionPath?: Fr[]): Promise<void>;
|
|
79
76
|
traceNoteHashCheck(_contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, _exists: boolean, path?: Fr[]): void;
|
|
80
77
|
traceNewNoteHash(noteHash: Fr, leafIndex?: Fr, path?: Fr[]): void;
|
|
81
78
|
traceNullifierCheck(_siloedNullifier: Fr, _exists: boolean, lowLeafPreimage?: NullifierLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[]): void;
|
|
82
79
|
traceNewNullifier(siloedNullifier: Fr, lowLeafPreimage?: NullifierLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[], insertionPath?: Fr[]): void;
|
|
83
80
|
traceL1ToL2MessageCheck(_contractAddress: AztecAddress, msgHash: Fr, msgLeafIndex: Fr, _exists: boolean, path?: Fr[]): void;
|
|
84
81
|
traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
|
|
85
|
-
|
|
82
|
+
tracePublicLog(contractAddress: AztecAddress, log: Fr[]): void;
|
|
86
83
|
traceGetContractInstance(contractAddress: AztecAddress, exists: boolean, instance?: SerializableContractInstance, lowLeafPreimage?: NullifierLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[]): void;
|
|
87
84
|
traceGetBytecode(contractAddress: AztecAddress, exists: boolean, bytecode?: Buffer, contractInstance?: SerializableContractInstance, contractClass?: ContractClassIdPreimage, lowLeafPreimage?: NullifierLeafPreimage, lowLeafIndex?: Fr, lowLeafPath?: Fr[]): void;
|
|
88
85
|
/**
|
|
@@ -142,8 +139,8 @@ export declare class PublicEnqueuedCallSideEffectTrace implements PublicSideEffe
|
|
|
142
139
|
_avmCallResults: AvmFinalizedCallResult,
|
|
143
140
|
/** Function name for logging */
|
|
144
141
|
_functionName?: string): PublicFunctionCallResult;
|
|
145
|
-
|
|
142
|
+
getPublicLogs(): PublicLog[];
|
|
146
143
|
getAvmCircuitHints(): AvmExecutionHints;
|
|
147
144
|
private getAvmAccumulatedData;
|
|
148
145
|
}
|
|
149
|
-
//# sourceMappingURL=
|
|
146
|
+
//# sourceMappingURL=side_effect_trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { AvmAccumulatedData, AvmAppendTreeHint, AvmCircuitPublicInputs, AvmContractBytecodeHints, AvmContractInstanceHint, AvmEnqueuedCallHint, AvmExecutionHints, AvmNullifierReadTreeHint, AvmNullifierWriteTreeHint, AvmPublicDataReadTreeHint, AvmPublicDataWriteTreeHint, EthAddress, Gas, 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
|
+
/**
|
|
272
|
+
* Get the results of public execution.
|
|
273
|
+
*/
|
|
274
|
+
toPublicEnqueuedCallExecutionResult(
|
|
275
|
+
/** The call's results */
|
|
276
|
+
avmCallResults) {
|
|
277
|
+
return {
|
|
278
|
+
endGasLeft: Gas.from(avmCallResults.gasLeft),
|
|
279
|
+
endSideEffectCounter: new Fr(this.sideEffectCounter),
|
|
280
|
+
returnValues: avmCallResults.output,
|
|
281
|
+
reverted: avmCallResults.reverted,
|
|
282
|
+
revertReason: avmCallResults.revertReason,
|
|
283
|
+
sideEffects: {
|
|
284
|
+
publicDataWrites: this.publicDataWrites,
|
|
285
|
+
noteHashes: this.noteHashes,
|
|
286
|
+
nullifiers: this.nullifiers,
|
|
287
|
+
l2ToL1Messages: this.l2ToL1Messages,
|
|
288
|
+
publicLogs: this.publicLogs,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
toAvmCircuitPublicInputs(
|
|
293
|
+
/** Globals. */
|
|
294
|
+
globalVariables,
|
|
295
|
+
/** Start tree snapshots. */
|
|
296
|
+
startTreeSnapshots,
|
|
297
|
+
/** Gas used at start of TX. */
|
|
298
|
+
startGasUsed,
|
|
299
|
+
/** How much gas was available for this public execution. */
|
|
300
|
+
gasLimits,
|
|
301
|
+
/** Address of the fee payer. */
|
|
302
|
+
feePayer,
|
|
303
|
+
/** Call requests for setup phase. */
|
|
304
|
+
publicSetupCallRequests,
|
|
305
|
+
/** Call requests for app logic phase. */
|
|
306
|
+
publicAppLogicCallRequests,
|
|
307
|
+
/** Call request for teardown phase. */
|
|
308
|
+
publicTeardownCallRequest,
|
|
309
|
+
/** End tree snapshots. */
|
|
310
|
+
endTreeSnapshots,
|
|
311
|
+
/**
|
|
312
|
+
* Gas used by the whole transaction, assuming entire teardown limit is used.
|
|
313
|
+
* This is the gas used when computing transaction fee.
|
|
314
|
+
*/
|
|
315
|
+
endGasUsed,
|
|
316
|
+
/** Transaction fee. */
|
|
317
|
+
transactionFee,
|
|
318
|
+
/** The call's results */
|
|
319
|
+
reverted) {
|
|
320
|
+
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,
|
|
321
|
+
/*previousNonRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
322
|
+
/*previousRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
|
|
323
|
+
/*previousNonRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(),
|
|
324
|
+
/*previousRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(), endTreeSnapshots, endGasUsed,
|
|
325
|
+
/*accumulatedData=*/ this.getAvmAccumulatedData(), transactionFee, reverted);
|
|
326
|
+
}
|
|
327
|
+
toPublicFunctionCallResult(
|
|
328
|
+
/** The execution environment of the nested call. */
|
|
329
|
+
_avmEnvironment,
|
|
330
|
+
/** How much gas was available for this public execution. */
|
|
331
|
+
_startGasLeft,
|
|
332
|
+
/** Bytecode used for this execution. */
|
|
333
|
+
_bytecode,
|
|
334
|
+
/** The call's results */
|
|
335
|
+
_avmCallResults,
|
|
336
|
+
/** Function name for logging */
|
|
337
|
+
_functionName = 'unknown') {
|
|
338
|
+
throw new Error('Not implemented');
|
|
339
|
+
}
|
|
340
|
+
getPublicLogs() {
|
|
341
|
+
return this.publicLogs;
|
|
342
|
+
}
|
|
343
|
+
getAvmCircuitHints() {
|
|
344
|
+
return this.avmCircuitHints;
|
|
345
|
+
}
|
|
346
|
+
getAvmAccumulatedData() {
|
|
347
|
+
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));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZV9lZmZlY3RfdHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL3NpZGVfZWZmZWN0X3RyYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBRzFCLFVBQVUsRUFDVixHQUFHLEVBR0gsd0JBQXdCLEVBQ3hCLGFBQWEsRUFDYix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsNkNBQTZDLEVBQzdDLHNDQUFzQyxFQUN0QyxzQkFBc0IsRUFDdEIsNENBQTRDLEVBQzVDLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsUUFBUSxFQUNSLFNBQVMsRUFDVCxxQkFBcUIsRUFDckIsMkNBQTJDLEVBQzNDLHVCQUF1QixFQUN2Qiw4QkFBOEIsRUFDOUIsMkJBQTJCLEVBQzNCLHVDQUF1QyxFQUN2QyxpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YsU0FBUyxFQUNULG1CQUFtQixFQUNuQiw0QkFBNEIsR0FFN0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLE1B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
|