@aztec/simulator 0.41.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/acvm/acvm.d.ts +2 -2
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +3 -3
- package/dest/acvm/oracle/oracle.d.ts +7 -4
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +32 -12
- package/dest/acvm/oracle/typed_oracle.d.ts +6 -3
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +15 -6
- package/dest/acvm/serialize.js +2 -2
- package/dest/avm/avm_gas.d.ts +1 -5
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +69 -73
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +2 -4
- package/dest/avm/avm_simulator.d.ts +5 -0
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +8 -1
- package/dest/avm/fixtures/index.d.ts +6 -0
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +18 -1
- package/dest/avm/index.d.ts +2 -0
- package/dest/avm/index.d.ts.map +1 -0
- package/dest/avm/index.js +2 -0
- package/dest/avm/journal/host_storage.d.ts +1 -1
- package/dest/avm/journal/host_storage.d.ts.map +1 -1
- package/dest/avm/journal/journal.d.ts +5 -3
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +23 -14
- package/dest/avm/journal/trace.d.ts +3 -1
- package/dest/avm/journal/trace.d.ts.map +1 -1
- package/dest/avm/journal/trace.js +8 -1
- package/dest/avm/journal/trace_types.d.ts +5 -0
- package/dest/avm/journal/trace_types.d.ts.map +1 -1
- package/dest/avm/journal/trace_types.js +1 -5
- package/dest/avm/opcodes/accrued_substate.d.ts +2 -2
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +36 -21
- package/dest/avm/opcodes/arithmetic.d.ts +1 -7
- package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/avm/opcodes/arithmetic.js +12 -20
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +11 -8
- package/dest/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/avm/opcodes/comparators.js +7 -5
- package/dest/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/avm/opcodes/contract.js +20 -24
- package/dest/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/avm/opcodes/control_flow.js +4 -2
- package/dest/avm/opcodes/conversion.js +2 -2
- package/dest/avm/opcodes/ec_add.d.ts +19 -0
- package/dest/avm/opcodes/ec_add.d.ts.map +1 -0
- package/dest/avm/opcodes/ec_add.js +78 -0
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +11 -5
- package/dest/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/avm/opcodes/hashing.js +10 -2
- package/dest/avm/opcodes/instruction.d.ts +1 -1
- package/dest/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction.js +6 -4
- package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction_impl.js +4 -2
- package/dest/avm/opcodes/memory.d.ts +1 -5
- package/dest/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/avm/opcodes/memory.js +14 -18
- package/dest/avm/opcodes/multi_scalar_mul.d.ts +16 -0
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -0
- package/dest/avm/opcodes/multi_scalar_mul.js +95 -0
- package/dest/avm/opcodes/storage.d.ts +1 -6
- package/dest/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/avm/opcodes/storage.js +11 -14
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +6 -2
- package/dest/avm/serialization/instruction_serialization.d.ts +3 -1
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +4 -2
- package/dest/client/client_execution_context.d.ts +24 -20
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +52 -55
- package/dest/client/db_oracle.d.ts +7 -1
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/execution_note_cache.d.ts +0 -17
- package/dest/client/execution_note_cache.d.ts.map +1 -1
- package/dest/client/execution_note_cache.js +1 -24
- package/dest/client/execution_result.d.ts +8 -4
- package/dest/client/execution_result.d.ts.map +1 -1
- package/dest/client/execution_result.js +16 -6
- package/dest/client/private_execution.d.ts +2 -3
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +20 -9
- package/dest/client/simulator.d.ts +2 -17
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +24 -33
- package/dest/client/unconstrained_execution.d.ts +2 -3
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +5 -7
- package/dest/client/view_data_oracle.d.ts +2 -0
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +7 -1
- package/dest/index.d.ts +3 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +4 -2
- package/dest/mocks/fixtures.d.ts +14 -10
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +22 -16
- package/dest/{simulator → providers}/acvm_native.d.ts.map +1 -1
- package/dest/{simulator → providers}/acvm_native.js +13 -14
- package/dest/providers/acvm_wasm.d.ts.map +1 -0
- package/dest/providers/acvm_wasm.js +15 -0
- package/dest/providers/index.d.ts.map +1 -0
- package/dest/{simulator → providers}/index.js +1 -1
- package/dest/{simulator → providers}/simulation_provider.d.ts.map +1 -1
- package/dest/{simulator → providers}/simulation_provider.js +1 -1
- package/dest/public/abstract_phase_manager.d.ts +53 -53
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +146 -153
- package/dest/public/app_logic_phase_manager.d.ts +8 -9
- package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
- package/dest/public/app_logic_phase_manager.js +15 -15
- package/dest/public/{db.d.ts → db_interfaces.d.ts} +4 -3
- package/dest/public/db_interfaces.d.ts.map +1 -0
- package/dest/public/db_interfaces.js +2 -0
- package/dest/public/execution.d.ts +16 -23
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -51
- package/dest/public/executor.d.ts +4 -31
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +40 -283
- package/dest/public/fee_payment.d.ts +11 -0
- package/dest/public/fee_payment.d.ts.map +1 -0
- package/dest/public/fee_payment.js +24 -0
- package/dest/public/hints_builder.d.ts +2 -1
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +6 -2
- package/dest/public/index.d.ts +8 -6
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +9 -7
- package/dest/public/phase_manager_factory.d.ts +4 -4
- package/dest/public/phase_manager_factory.d.ts.map +1 -1
- package/dest/public/phase_manager_factory.js +5 -5
- package/dest/public/{public_executor.d.ts → public_db_sources.d.ts} +6 -3
- package/dest/public/public_db_sources.d.ts.map +1 -0
- package/dest/public/public_db_sources.js +244 -0
- package/dest/public/public_kernel.js +14 -14
- package/dest/public/public_processor.d.ts +6 -4
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +48 -30
- package/dest/public/setup_phase_manager.d.ts +8 -10
- package/dest/public/setup_phase_manager.d.ts.map +1 -1
- package/dest/public/setup_phase_manager.js +12 -21
- package/dest/public/tail_phase_manager.d.ts +7 -13
- package/dest/public/tail_phase_manager.d.ts.map +1 -1
- package/dest/public/tail_phase_manager.js +17 -37
- package/dest/public/teardown_phase_manager.d.ts +8 -10
- package/dest/public/teardown_phase_manager.d.ts.map +1 -1
- package/dest/public/teardown_phase_manager.js +16 -22
- package/dest/public/transitional_adaptors.d.ts +2 -2
- package/dest/public/transitional_adaptors.d.ts.map +1 -1
- package/dest/public/transitional_adaptors.js +14 -6
- package/package.json +12 -9
- package/src/acvm/acvm.ts +0 -3
- package/src/acvm/oracle/oracle.ts +68 -16
- package/src/acvm/oracle/typed_oracle.ts +31 -6
- package/src/acvm/serialize.ts +1 -1
- package/src/avm/avm_gas.ts +68 -73
- package/src/avm/avm_memory_types.ts +1 -3
- package/src/avm/avm_simulator.ts +9 -0
- package/src/avm/fixtures/index.ts +24 -0
- package/src/avm/index.ts +1 -0
- package/src/avm/journal/host_storage.ts +1 -1
- package/src/avm/journal/journal.ts +32 -22
- package/src/avm/journal/trace.ts +9 -0
- package/src/avm/journal/trace_types.ts +4 -0
- package/src/avm/opcodes/accrued_substate.ts +53 -20
- package/src/avm/opcodes/arithmetic.ts +18 -22
- package/src/avm/opcodes/bitwise.ts +13 -8
- package/src/avm/opcodes/comparators.ts +9 -4
- package/src/avm/opcodes/contract.ts +22 -26
- package/src/avm/opcodes/control_flow.ts +3 -1
- package/src/avm/opcodes/conversion.ts +1 -1
- package/src/avm/opcodes/ec_add.ts +92 -0
- package/src/avm/opcodes/external_calls.ts +11 -3
- package/src/avm/opcodes/hashing.ts +11 -1
- package/src/avm/opcodes/instruction.ts +5 -3
- package/src/avm/opcodes/instruction_impl.ts +4 -1
- package/src/avm/opcodes/memory.ts +19 -19
- package/src/avm/opcodes/multi_scalar_mul.ts +114 -0
- package/src/avm/opcodes/storage.ts +10 -17
- package/src/avm/serialization/bytecode_serialization.ts +5 -1
- package/src/avm/serialization/instruction_serialization.ts +2 -0
- package/src/client/client_execution_context.ts +76 -60
- package/src/client/db_oracle.ts +8 -1
- package/src/client/execution_note_cache.ts +0 -28
- package/src/client/execution_result.ts +21 -7
- package/src/client/private_execution.ts +36 -21
- package/src/client/simulator.ts +25 -35
- package/src/client/unconstrained_execution.ts +9 -12
- package/src/client/view_data_oracle.ts +8 -0
- package/src/index.ts +3 -1
- package/src/mocks/fixtures.ts +30 -32
- package/src/{simulator → providers}/acvm_native.ts +21 -19
- package/src/{simulator → providers}/acvm_wasm.ts +2 -16
- package/src/public/abstract_phase_manager.ts +209 -258
- package/src/public/app_logic_phase_manager.ts +24 -40
- package/src/public/{db.ts → db_interfaces.ts} +4 -2
- package/src/public/execution.ts +15 -77
- package/src/public/executor.ts +61 -399
- package/src/public/fee_payment.ts +26 -0
- package/src/public/hints_builder.ts +6 -0
- package/src/public/index.ts +8 -12
- package/src/public/phase_manager_factory.ts +7 -7
- package/src/public/{public_executor.ts → public_db_sources.ts} +65 -9
- package/src/public/public_kernel.ts +24 -24
- package/src/public/public_processor.ts +81 -40
- package/src/public/setup_phase_manager.ts +21 -46
- package/src/public/tail_phase_manager.ts +19 -67
- package/src/public/teardown_phase_manager.ts +23 -42
- package/src/public/transitional_adaptors.ts +41 -5
- package/dest/public/db.d.ts.map +0 -1
- package/dest/public/db.js +0 -2
- package/dest/public/public_execution_context.d.ts +0 -121
- package/dest/public/public_execution_context.d.ts.map +0 -1
- package/dest/public/public_execution_context.js +0 -214
- package/dest/public/public_executor.d.ts.map +0 -1
- package/dest/public/public_executor.js +0 -197
- package/dest/public/state_actions.d.ts +0 -39
- package/dest/public/state_actions.d.ts.map +0 -1
- package/dest/public/state_actions.js +0 -80
- package/dest/public/utils.d.ts +0 -8
- package/dest/public/utils.d.ts.map +0 -1
- package/dest/public/utils.js +0 -31
- package/dest/simulator/acvm_wasm.d.ts.map +0 -1
- package/dest/simulator/acvm_wasm.js +0 -22
- package/dest/simulator/index.d.ts.map +0 -1
- package/src/public/public_execution_context.ts +0 -289
- package/src/public/state_actions.ts +0 -102
- package/src/public/utils.ts +0 -33
- /package/dest/{simulator → providers}/acvm_native.d.ts +0 -0
- /package/dest/{simulator → providers}/acvm_wasm.d.ts +0 -0
- /package/dest/{simulator → providers}/index.d.ts +0 -0
- /package/dest/{simulator → providers}/simulation_provider.d.ts +0 -0
- /package/src/{simulator → providers}/index.ts +0 -0
- /package/src/{simulator → providers}/simulation_provider.ts +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
+
import { KeyValidationRequest } from '@aztec/circuits.js';
|
|
2
3
|
import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
|
|
3
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
5
|
import { Fr, Point } from '@aztec/foundation/fields';
|
|
@@ -40,12 +41,18 @@ export class Oracle {
|
|
|
40
41
|
return unpacked.map(toACVMField);
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
async
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
async getBlockNumber(): Promise<ACVMField> {
|
|
45
|
+
return toACVMField(await this.typedOracle.getBlockNumber());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async getContractAddress(): Promise<ACVMField> {
|
|
49
|
+
return toACVMField(await this.typedOracle.getContractAddress());
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
53
|
+
const { pkM, skApp } = await this.typedOracle.getKeyValidationRequest(fromACVMField(pkMHash));
|
|
47
54
|
|
|
48
|
-
return [toACVMField(
|
|
55
|
+
return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(skApp)];
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
async getContractInstance([address]: ACVMField[]) {
|
|
@@ -282,32 +289,77 @@ export class Oracle {
|
|
|
282
289
|
return newValues.map(toACVMField);
|
|
283
290
|
}
|
|
284
291
|
|
|
285
|
-
|
|
292
|
+
emitEncryptedEventLog(
|
|
293
|
+
[contractAddress]: ACVMField[],
|
|
294
|
+
[randomness]: ACVMField[],
|
|
295
|
+
encryptedEvent: ACVMField[],
|
|
296
|
+
[counter]: ACVMField[],
|
|
297
|
+
): void {
|
|
286
298
|
// Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
|
|
287
|
-
const processedInput = Buffer.from(
|
|
288
|
-
this.typedOracle.
|
|
299
|
+
const processedInput = Buffer.from(encryptedEvent.map(fromACVMField).map(f => f.toNumber()));
|
|
300
|
+
this.typedOracle.emitEncryptedEventLog(
|
|
301
|
+
AztecAddress.fromString(contractAddress),
|
|
302
|
+
Fr.fromString(randomness),
|
|
303
|
+
processedInput,
|
|
304
|
+
+counter,
|
|
305
|
+
);
|
|
289
306
|
}
|
|
290
307
|
|
|
291
|
-
emitEncryptedNoteLog([
|
|
308
|
+
emitEncryptedNoteLog([noteHashCounter]: ACVMField[], encryptedNote: ACVMField[], [counter]: ACVMField[]): void {
|
|
292
309
|
// Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
|
|
293
310
|
const processedInput = Buffer.from(encryptedNote.map(fromACVMField).map(f => f.toNumber()));
|
|
294
|
-
this.typedOracle.emitEncryptedNoteLog(
|
|
311
|
+
this.typedOracle.emitEncryptedNoteLog(+noteHashCounter, processedInput, +counter);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
computeEncryptedEventLog(
|
|
315
|
+
[contractAddress]: ACVMField[],
|
|
316
|
+
[randomness]: ACVMField[],
|
|
317
|
+
[eventTypeId]: ACVMField[],
|
|
318
|
+
[ovskApp]: ACVMField[],
|
|
319
|
+
[ovpkMX]: ACVMField[],
|
|
320
|
+
[ovpkMY]: ACVMField[],
|
|
321
|
+
[ivpkMX]: ACVMField[],
|
|
322
|
+
[ivpkMY]: ACVMField[],
|
|
323
|
+
preimage: ACVMField[],
|
|
324
|
+
): ACVMField[] {
|
|
325
|
+
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
|
|
326
|
+
const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
|
|
327
|
+
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
|
|
328
|
+
const encLog = this.typedOracle.computeEncryptedEventLog(
|
|
329
|
+
AztecAddress.fromString(contractAddress),
|
|
330
|
+
Fr.fromString(randomness),
|
|
331
|
+
Fr.fromString(eventTypeId),
|
|
332
|
+
ovKeys,
|
|
333
|
+
ivpkM,
|
|
334
|
+
preimage.map(fromACVMField),
|
|
335
|
+
);
|
|
336
|
+
const bytes: ACVMField[] = [];
|
|
337
|
+
encLog.forEach(v => {
|
|
338
|
+
bytes.push(toACVMField(v));
|
|
339
|
+
});
|
|
340
|
+
return bytes;
|
|
295
341
|
}
|
|
296
342
|
|
|
297
|
-
|
|
343
|
+
computeEncryptedNoteLog(
|
|
298
344
|
[contractAddress]: ACVMField[],
|
|
299
345
|
[storageSlot]: ACVMField[],
|
|
300
346
|
[noteTypeId]: ACVMField[],
|
|
301
|
-
[
|
|
302
|
-
[
|
|
347
|
+
[ovskApp]: ACVMField[],
|
|
348
|
+
[ovpkMX]: ACVMField[],
|
|
349
|
+
[ovpkMY]: ACVMField[],
|
|
350
|
+
[ivpkMX]: ACVMField[],
|
|
351
|
+
[ivpkMY]: ACVMField[],
|
|
303
352
|
preimage: ACVMField[],
|
|
304
353
|
): ACVMField[] {
|
|
305
|
-
const
|
|
306
|
-
const
|
|
354
|
+
const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
|
|
355
|
+
const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
|
|
356
|
+
const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
|
|
357
|
+
const encLog = this.typedOracle.computeEncryptedNoteLog(
|
|
307
358
|
AztecAddress.fromString(contractAddress),
|
|
308
359
|
Fr.fromString(storageSlot),
|
|
309
360
|
Fr.fromString(noteTypeId),
|
|
310
|
-
|
|
361
|
+
ovKeys,
|
|
362
|
+
ivpkM,
|
|
311
363
|
preimage.map(fromACVMField),
|
|
312
364
|
);
|
|
313
365
|
const bytes: ACVMField[] = [];
|
|
@@ -82,6 +82,14 @@ export abstract class TypedOracle {
|
|
|
82
82
|
throw new OracleMethodNotAvailableError('unpackReturns');
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
getBlockNumber(): Promise<number> {
|
|
86
|
+
throw new OracleMethodNotAvailableError('getBlockNumber');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
getContractAddress(): Promise<AztecAddress> {
|
|
90
|
+
throw new OracleMethodNotAvailableError('getContractAddress');
|
|
91
|
+
}
|
|
92
|
+
|
|
85
93
|
getKeyValidationRequest(_pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
86
94
|
throw new OracleMethodNotAvailableError('getKeyValidationRequest');
|
|
87
95
|
}
|
|
@@ -176,22 +184,39 @@ export abstract class TypedOracle {
|
|
|
176
184
|
throw new OracleMethodNotAvailableError('storageWrite');
|
|
177
185
|
}
|
|
178
186
|
|
|
179
|
-
|
|
180
|
-
|
|
187
|
+
emitEncryptedEventLog(
|
|
188
|
+
_contractAddress: AztecAddress,
|
|
189
|
+
_randomness: Fr,
|
|
190
|
+
_encryptedEvent: Buffer,
|
|
191
|
+
_counter: number,
|
|
192
|
+
): void {
|
|
193
|
+
throw new OracleMethodNotAvailableError('emitEncryptedEventLog');
|
|
181
194
|
}
|
|
182
195
|
|
|
183
|
-
emitEncryptedNoteLog(
|
|
196
|
+
emitEncryptedNoteLog(_noteHashCounter: number, _encryptedNote: Buffer, _counter: number): void {
|
|
184
197
|
throw new OracleMethodNotAvailableError('emitEncryptedNoteLog');
|
|
185
198
|
}
|
|
186
199
|
|
|
187
|
-
|
|
200
|
+
computeEncryptedEventLog(
|
|
201
|
+
_contractAddress: AztecAddress,
|
|
202
|
+
_randomness: Fr,
|
|
203
|
+
_eventTypeId: Fr,
|
|
204
|
+
_ovKeys: KeyValidationRequest,
|
|
205
|
+
_ivpkM: PublicKey,
|
|
206
|
+
_preimage: Fr[],
|
|
207
|
+
): Buffer {
|
|
208
|
+
throw new OracleMethodNotAvailableError('computeEncryptedEventLog');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
computeEncryptedNoteLog(
|
|
188
212
|
_contractAddress: AztecAddress,
|
|
189
213
|
_storageSlot: Fr,
|
|
190
214
|
_noteTypeId: Fr,
|
|
191
|
-
|
|
215
|
+
_ovKeys: KeyValidationRequest,
|
|
216
|
+
_ivpkM: PublicKey,
|
|
192
217
|
_preimage: Fr[],
|
|
193
218
|
): Buffer {
|
|
194
|
-
throw new OracleMethodNotAvailableError('
|
|
219
|
+
throw new OracleMethodNotAvailableError('computeEncryptedNoteLog');
|
|
195
220
|
}
|
|
196
221
|
|
|
197
222
|
emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
|
package/src/acvm/serialize.ts
CHANGED
|
@@ -55,7 +55,7 @@ export function toACVMField(
|
|
|
55
55
|
export function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): ACVMField[] {
|
|
56
56
|
const fields = [
|
|
57
57
|
item.contractAddress.toField(),
|
|
58
|
-
|
|
58
|
+
item.functionSelector.toField(),
|
|
59
59
|
...item.callContext.toFields(),
|
|
60
60
|
item.getArgsHash(),
|
|
61
61
|
];
|
package/src/avm/avm_gas.ts
CHANGED
|
@@ -49,93 +49,88 @@ export const EmptyGas: Gas = {
|
|
|
49
49
|
/** Dimensions of gas usage: L1, L2, and DA. */
|
|
50
50
|
export const GasDimensions = ['l2Gas', 'daGas'] as const;
|
|
51
51
|
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
/** Temporary default gas cost. We should eventually remove all usage of this variable in favor of actual gas for each opcode. */
|
|
56
|
-
const TemporaryDefaultGasCost = { l2Gas: 10, daGas: 0 };
|
|
52
|
+
/** Default gas cost for an opcode. */
|
|
53
|
+
const DefaultBaseGasCost: Gas = { l2Gas: 10, daGas: 0 };
|
|
57
54
|
|
|
58
55
|
/** Base gas costs for each instruction. Additional gas cost may be added on top due to memory or storage accesses, etc. */
|
|
59
|
-
|
|
60
|
-
[Opcode.ADD]:
|
|
61
|
-
[Opcode.SUB]:
|
|
62
|
-
[Opcode.MUL]:
|
|
63
|
-
[Opcode.DIV]:
|
|
64
|
-
[Opcode.FDIV]:
|
|
65
|
-
[Opcode.EQ]:
|
|
66
|
-
[Opcode.LT]:
|
|
67
|
-
[Opcode.LTE]:
|
|
68
|
-
[Opcode.AND]:
|
|
69
|
-
[Opcode.OR]:
|
|
70
|
-
[Opcode.XOR]:
|
|
71
|
-
[Opcode.NOT]:
|
|
72
|
-
[Opcode.SHL]:
|
|
73
|
-
[Opcode.SHR]:
|
|
74
|
-
[Opcode.CAST]:
|
|
56
|
+
const BaseGasCosts: Record<Opcode, Gas> = {
|
|
57
|
+
[Opcode.ADD]: DefaultBaseGasCost,
|
|
58
|
+
[Opcode.SUB]: DefaultBaseGasCost,
|
|
59
|
+
[Opcode.MUL]: DefaultBaseGasCost,
|
|
60
|
+
[Opcode.DIV]: DefaultBaseGasCost,
|
|
61
|
+
[Opcode.FDIV]: DefaultBaseGasCost,
|
|
62
|
+
[Opcode.EQ]: DefaultBaseGasCost,
|
|
63
|
+
[Opcode.LT]: DefaultBaseGasCost,
|
|
64
|
+
[Opcode.LTE]: DefaultBaseGasCost,
|
|
65
|
+
[Opcode.AND]: DefaultBaseGasCost,
|
|
66
|
+
[Opcode.OR]: DefaultBaseGasCost,
|
|
67
|
+
[Opcode.XOR]: DefaultBaseGasCost,
|
|
68
|
+
[Opcode.NOT]: DefaultBaseGasCost,
|
|
69
|
+
[Opcode.SHL]: DefaultBaseGasCost,
|
|
70
|
+
[Opcode.SHR]: DefaultBaseGasCost,
|
|
71
|
+
[Opcode.CAST]: DefaultBaseGasCost,
|
|
75
72
|
// Execution environment
|
|
76
|
-
[Opcode.ADDRESS]:
|
|
77
|
-
[Opcode.STORAGEADDRESS]:
|
|
78
|
-
[Opcode.SENDER]:
|
|
79
|
-
[Opcode.FEEPERL2GAS]:
|
|
80
|
-
[Opcode.FEEPERDAGAS]:
|
|
81
|
-
[Opcode.TRANSACTIONFEE]:
|
|
82
|
-
[Opcode.CONTRACTCALLDEPTH]:
|
|
83
|
-
[Opcode.CHAINID]:
|
|
84
|
-
[Opcode.VERSION]:
|
|
85
|
-
[Opcode.BLOCKNUMBER]:
|
|
86
|
-
[Opcode.TIMESTAMP]:
|
|
87
|
-
[Opcode.COINBASE]:
|
|
88
|
-
[Opcode.BLOCKL2GASLIMIT]:
|
|
89
|
-
[Opcode.BLOCKDAGASLIMIT]:
|
|
90
|
-
[Opcode.CALLDATACOPY]:
|
|
73
|
+
[Opcode.ADDRESS]: DefaultBaseGasCost,
|
|
74
|
+
[Opcode.STORAGEADDRESS]: DefaultBaseGasCost,
|
|
75
|
+
[Opcode.SENDER]: DefaultBaseGasCost,
|
|
76
|
+
[Opcode.FEEPERL2GAS]: DefaultBaseGasCost,
|
|
77
|
+
[Opcode.FEEPERDAGAS]: DefaultBaseGasCost,
|
|
78
|
+
[Opcode.TRANSACTIONFEE]: DefaultBaseGasCost,
|
|
79
|
+
[Opcode.CONTRACTCALLDEPTH]: DefaultBaseGasCost,
|
|
80
|
+
[Opcode.CHAINID]: DefaultBaseGasCost,
|
|
81
|
+
[Opcode.VERSION]: DefaultBaseGasCost,
|
|
82
|
+
[Opcode.BLOCKNUMBER]: DefaultBaseGasCost,
|
|
83
|
+
[Opcode.TIMESTAMP]: DefaultBaseGasCost,
|
|
84
|
+
[Opcode.COINBASE]: DefaultBaseGasCost,
|
|
85
|
+
[Opcode.BLOCKL2GASLIMIT]: DefaultBaseGasCost,
|
|
86
|
+
[Opcode.BLOCKDAGASLIMIT]: DefaultBaseGasCost,
|
|
87
|
+
[Opcode.CALLDATACOPY]: DefaultBaseGasCost,
|
|
91
88
|
// Gas
|
|
92
|
-
[Opcode.L2GASLEFT]:
|
|
93
|
-
[Opcode.DAGASLEFT]:
|
|
89
|
+
[Opcode.L2GASLEFT]: DefaultBaseGasCost,
|
|
90
|
+
[Opcode.DAGASLEFT]: DefaultBaseGasCost,
|
|
94
91
|
// Control flow
|
|
95
|
-
[Opcode.JUMP]:
|
|
96
|
-
[Opcode.JUMPI]:
|
|
97
|
-
[Opcode.INTERNALCALL]:
|
|
98
|
-
[Opcode.INTERNALRETURN]:
|
|
92
|
+
[Opcode.JUMP]: DefaultBaseGasCost,
|
|
93
|
+
[Opcode.JUMPI]: DefaultBaseGasCost,
|
|
94
|
+
[Opcode.INTERNALCALL]: DefaultBaseGasCost,
|
|
95
|
+
[Opcode.INTERNALRETURN]: DefaultBaseGasCost,
|
|
99
96
|
// Memory
|
|
100
|
-
[Opcode.SET]:
|
|
101
|
-
[Opcode.MOV]:
|
|
102
|
-
[Opcode.CMOV]:
|
|
97
|
+
[Opcode.SET]: DefaultBaseGasCost,
|
|
98
|
+
[Opcode.MOV]: DefaultBaseGasCost,
|
|
99
|
+
[Opcode.CMOV]: DefaultBaseGasCost,
|
|
103
100
|
// World state
|
|
104
|
-
[Opcode.SLOAD]:
|
|
105
|
-
[Opcode.SSTORE]:
|
|
106
|
-
[Opcode.NOTEHASHEXISTS]:
|
|
107
|
-
[Opcode.EMITNOTEHASH]:
|
|
108
|
-
[Opcode.NULLIFIEREXISTS]:
|
|
109
|
-
[Opcode.EMITNULLIFIER]:
|
|
110
|
-
[Opcode.L1TOL2MSGEXISTS]:
|
|
111
|
-
[Opcode.HEADERMEMBER]:
|
|
112
|
-
[Opcode.EMITUNENCRYPTEDLOG]:
|
|
113
|
-
[Opcode.SENDL2TOL1MSG]:
|
|
114
|
-
[Opcode.GETCONTRACTINSTANCE]:
|
|
101
|
+
[Opcode.SLOAD]: DefaultBaseGasCost,
|
|
102
|
+
[Opcode.SSTORE]: DefaultBaseGasCost,
|
|
103
|
+
[Opcode.NOTEHASHEXISTS]: DefaultBaseGasCost,
|
|
104
|
+
[Opcode.EMITNOTEHASH]: DefaultBaseGasCost,
|
|
105
|
+
[Opcode.NULLIFIEREXISTS]: DefaultBaseGasCost,
|
|
106
|
+
[Opcode.EMITNULLIFIER]: DefaultBaseGasCost,
|
|
107
|
+
[Opcode.L1TOL2MSGEXISTS]: DefaultBaseGasCost,
|
|
108
|
+
[Opcode.HEADERMEMBER]: DefaultBaseGasCost,
|
|
109
|
+
[Opcode.EMITUNENCRYPTEDLOG]: DefaultBaseGasCost,
|
|
110
|
+
[Opcode.SENDL2TOL1MSG]: DefaultBaseGasCost,
|
|
111
|
+
[Opcode.GETCONTRACTINSTANCE]: DefaultBaseGasCost,
|
|
115
112
|
// External calls
|
|
116
|
-
[Opcode.CALL]:
|
|
117
|
-
[Opcode.STATICCALL]:
|
|
118
|
-
[Opcode.DELEGATECALL]:
|
|
119
|
-
[Opcode.RETURN]:
|
|
120
|
-
[Opcode.REVERT]:
|
|
113
|
+
[Opcode.CALL]: DefaultBaseGasCost,
|
|
114
|
+
[Opcode.STATICCALL]: DefaultBaseGasCost,
|
|
115
|
+
[Opcode.DELEGATECALL]: DefaultBaseGasCost,
|
|
116
|
+
[Opcode.RETURN]: DefaultBaseGasCost,
|
|
117
|
+
[Opcode.REVERT]: DefaultBaseGasCost,
|
|
121
118
|
// Misc
|
|
122
|
-
[Opcode.DEBUGLOG]:
|
|
119
|
+
[Opcode.DEBUGLOG]: DefaultBaseGasCost,
|
|
123
120
|
// Gadgets
|
|
124
|
-
[Opcode.KECCAK]:
|
|
125
|
-
[Opcode.POSEIDON2]:
|
|
126
|
-
[Opcode.SHA256]:
|
|
127
|
-
[Opcode.PEDERSEN]:
|
|
121
|
+
[Opcode.KECCAK]: DefaultBaseGasCost,
|
|
122
|
+
[Opcode.POSEIDON2]: DefaultBaseGasCost,
|
|
123
|
+
[Opcode.SHA256]: DefaultBaseGasCost,
|
|
124
|
+
[Opcode.PEDERSEN]: DefaultBaseGasCost,
|
|
125
|
+
[Opcode.ECADD]: DefaultBaseGasCost,
|
|
126
|
+
[Opcode.MSM]: DefaultBaseGasCost,
|
|
128
127
|
// Conversions
|
|
129
|
-
[Opcode.TORADIXLE]:
|
|
128
|
+
[Opcode.TORADIXLE]: DefaultBaseGasCost,
|
|
130
129
|
};
|
|
131
130
|
|
|
132
|
-
/** Returns the fixed base gas cost for a given opcode
|
|
131
|
+
/** Returns the fixed base gas cost for a given opcode. */
|
|
133
132
|
export function getBaseGasCost(opcode: Opcode): Gas {
|
|
134
|
-
|
|
135
|
-
if (cost === DynamicGasCost) {
|
|
136
|
-
throw new Error(`Opcode ${Opcode[opcode]} has dynamic gas cost`);
|
|
137
|
-
}
|
|
138
|
-
return cost;
|
|
133
|
+
return BaseGasCosts[opcode];
|
|
139
134
|
}
|
|
140
135
|
|
|
141
136
|
/** Returns the gas cost associated with the memory operations performed. */
|
|
@@ -298,9 +298,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
public checkIsValidMemoryOffsetTag(offset: number) {
|
|
301
|
-
|
|
302
|
-
throw TagCheckError.forOffset(offset, TypeTag[this.getTag(offset)], 'UINT64');
|
|
303
|
-
}
|
|
301
|
+
this.checkTag(TypeTag.UINT32, offset);
|
|
304
302
|
}
|
|
305
303
|
|
|
306
304
|
public static checkIsIntegralTag(tag: TypeTag) {
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
|
|
|
17
17
|
|
|
18
18
|
export class AvmSimulator {
|
|
19
19
|
private log: DebugLogger;
|
|
20
|
+
private bytecode: Buffer | undefined;
|
|
20
21
|
|
|
21
22
|
constructor(private context: AvmContext) {
|
|
22
23
|
this.log = createDebugLogger(
|
|
@@ -43,6 +44,13 @@ export class AvmSimulator {
|
|
|
43
44
|
return await this.executeBytecode(bytecode);
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Return the bytecode used for execution, if any.
|
|
49
|
+
*/
|
|
50
|
+
public getBytecode(): Buffer | undefined {
|
|
51
|
+
return this.bytecode;
|
|
52
|
+
}
|
|
53
|
+
|
|
46
54
|
/**
|
|
47
55
|
* Executes the provided bytecode in the current context.
|
|
48
56
|
* This method is useful for testing and debugging.
|
|
@@ -51,6 +59,7 @@ export class AvmSimulator {
|
|
|
51
59
|
const decompressedBytecode = await decompressBytecodeIfCompressed(bytecode);
|
|
52
60
|
assert(isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
53
61
|
|
|
62
|
+
this.bytecode = decompressedBytecode;
|
|
54
63
|
return await this.executeInstructions(decodeFromBytecode(decompressedBytecode));
|
|
55
64
|
}
|
|
56
65
|
|
|
@@ -3,7 +3,10 @@ import { FunctionSelector } from '@aztec/foundation/abi';
|
|
|
3
3
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import { Fr } from '@aztec/foundation/fields';
|
|
6
|
+
import { AvmTestContractArtifact } from '@aztec/noir-contracts.js';
|
|
7
|
+
import { SerializableContractInstance } from '@aztec/types/contracts';
|
|
6
8
|
|
|
9
|
+
import { strict as assert } from 'assert';
|
|
7
10
|
import { mock } from 'jest-mock-extended';
|
|
8
11
|
import merge from 'lodash.merge';
|
|
9
12
|
|
|
@@ -14,6 +17,7 @@ import { AvmMachineState } from '../avm_machine_state.js';
|
|
|
14
17
|
import { Field, Uint8 } from '../avm_memory_types.js';
|
|
15
18
|
import { HostStorage } from '../journal/host_storage.js';
|
|
16
19
|
import { AvmPersistableStateManager } from '../journal/journal.js';
|
|
20
|
+
import { type TracedContractInstance } from '../journal/trace_types.js';
|
|
17
21
|
|
|
18
22
|
/**
|
|
19
23
|
* Create a new AVM context with default values.
|
|
@@ -125,3 +129,23 @@ export function randomMemoryBytes(length: number): Uint8[] {
|
|
|
125
129
|
export function randomMemoryFields(length: number): Field[] {
|
|
126
130
|
return [...Array(length)].map(_ => new Field(Fr.random()));
|
|
127
131
|
}
|
|
132
|
+
|
|
133
|
+
export function getAvmTestContractBytecode(functionName: string): Buffer {
|
|
134
|
+
const artifact = AvmTestContractArtifact.functions.find(f => f.name === functionName)!;
|
|
135
|
+
assert(
|
|
136
|
+
!!artifact?.bytecode,
|
|
137
|
+
`No bytecode found for function ${functionName}. Try re-running bootstrap.sh on the repository root.`,
|
|
138
|
+
);
|
|
139
|
+
return artifact.bytecode;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function randomTracedContractInstance(): TracedContractInstance {
|
|
143
|
+
const instance = SerializableContractInstance.random();
|
|
144
|
+
const address = AztecAddress.random();
|
|
145
|
+
return { exists: true, ...instance, address };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function emptyTracedContractInstance(withAddress?: AztecAddress): TracedContractInstance {
|
|
149
|
+
const instance = SerializableContractInstance.empty().withAddress(withAddress ?? AztecAddress.zero());
|
|
150
|
+
return { exists: false, ...instance };
|
|
151
|
+
}
|
package/src/avm/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './avm_simulator.js';
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { EventSelector } from '@aztec/foundation/abi';
|
|
15
15
|
import { Fr } from '@aztec/foundation/fields';
|
|
16
16
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
17
|
+
import { SerializableContractInstance } from '@aztec/types/contracts';
|
|
17
18
|
|
|
18
19
|
import { type PublicExecutionResult } from '../../index.js';
|
|
19
20
|
import { type HostStorage } from './host_storage.js';
|
|
@@ -21,6 +22,7 @@ import { Nullifiers } from './nullifiers.js';
|
|
|
21
22
|
import { PublicStorage } from './public_storage.js';
|
|
22
23
|
import { WorldStateAccessTrace } from './trace.js';
|
|
23
24
|
import {
|
|
25
|
+
type TracedContractInstance,
|
|
24
26
|
type TracedL1toL2MessageCheck,
|
|
25
27
|
type TracedNoteHash,
|
|
26
28
|
type TracedNoteHashCheck,
|
|
@@ -55,9 +57,11 @@ export type JournalData = {
|
|
|
55
57
|
};
|
|
56
58
|
|
|
57
59
|
// TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
|
|
58
|
-
type PartialPublicExecutionResult = {
|
|
60
|
+
export type PartialPublicExecutionResult = {
|
|
61
|
+
noteHashReadRequests: ReadRequest[];
|
|
59
62
|
nullifierReadRequests: ReadRequest[];
|
|
60
63
|
nullifierNonExistentReadRequests: ReadRequest[];
|
|
64
|
+
l1ToL2MsgReadRequests: ReadRequest[];
|
|
61
65
|
newNoteHashes: NoteHash[];
|
|
62
66
|
newL2ToL1Messages: L2ToL1Message[];
|
|
63
67
|
startSideEffectCounter: number;
|
|
@@ -108,8 +112,10 @@ export class AvmPersistableStateManager {
|
|
|
108
112
|
this.trace = new WorldStateAccessTrace(parent?.trace);
|
|
109
113
|
|
|
110
114
|
this.transitionalExecutionResult = {
|
|
115
|
+
noteHashReadRequests: [],
|
|
111
116
|
nullifierReadRequests: [],
|
|
112
117
|
nullifierNonExistentReadRequests: [],
|
|
118
|
+
l1ToL2MsgReadRequests: [],
|
|
113
119
|
newNoteHashes: [],
|
|
114
120
|
newL2ToL1Messages: [],
|
|
115
121
|
startSideEffectCounter: this.trace.accessCounter,
|
|
@@ -143,15 +149,6 @@ export class AvmPersistableStateManager {
|
|
|
143
149
|
this.publicStorage.write(storageAddress, slot, value);
|
|
144
150
|
|
|
145
151
|
// TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
|
|
146
|
-
// The current info to the kernel clears any previous read or write request.
|
|
147
|
-
this.transitionalExecutionResult.contractStorageReads =
|
|
148
|
-
this.transitionalExecutionResult.contractStorageReads.filter(
|
|
149
|
-
read => !read.storageSlot.equals(slot) || !read.contractAddress!.equals(storageAddress),
|
|
150
|
-
);
|
|
151
|
-
this.transitionalExecutionResult.contractStorageUpdateRequests =
|
|
152
|
-
this.transitionalExecutionResult.contractStorageUpdateRequests.filter(
|
|
153
|
-
update => !update.storageSlot.equals(slot) || !update.contractAddress!.equals(storageAddress),
|
|
154
|
-
);
|
|
155
152
|
this.transitionalExecutionResult.contractStorageUpdateRequests.push(
|
|
156
153
|
new ContractStorageUpdateRequest(slot, value, this.trace.accessCounter, storageAddress),
|
|
157
154
|
);
|
|
@@ -174,17 +171,9 @@ export class AvmPersistableStateManager {
|
|
|
174
171
|
);
|
|
175
172
|
|
|
176
173
|
// TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
this.transitionalExecutionResult.contractStorageReads =
|
|
181
|
-
this.transitionalExecutionResult.contractStorageReads.filter(
|
|
182
|
-
read => !read.storageSlot.equals(slot) || !read.contractAddress!.equals(storageAddress),
|
|
183
|
-
);
|
|
184
|
-
this.transitionalExecutionResult.contractStorageReads.push(
|
|
185
|
-
new ContractStorageRead(slot, value, this.trace.accessCounter, storageAddress),
|
|
186
|
-
);
|
|
187
|
-
}
|
|
174
|
+
this.transitionalExecutionResult.contractStorageReads.push(
|
|
175
|
+
new ContractStorageRead(slot, value, this.trace.accessCounter, storageAddress),
|
|
176
|
+
);
|
|
188
177
|
|
|
189
178
|
// We want to keep track of all performed reads (even reverted ones)
|
|
190
179
|
this.trace.tracePublicStorageRead(storageAddress, slot, value, exists, cached);
|
|
@@ -204,6 +193,10 @@ export class AvmPersistableStateManager {
|
|
|
204
193
|
const gotLeafIndex = await this.hostStorage.commitmentsDb.getCommitmentIndex(noteHash);
|
|
205
194
|
const exists = gotLeafIndex === leafIndex.toBigInt();
|
|
206
195
|
this.log.debug(`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex}, exists: ${exists}.`);
|
|
196
|
+
|
|
197
|
+
// TODO: include exists here also - This can for sure come from the trace???
|
|
198
|
+
this.transitionalExecutionResult.noteHashReadRequests.push(new ReadRequest(noteHash, this.trace.accessCounter));
|
|
199
|
+
|
|
207
200
|
this.trace.traceNoteHashCheck(storageAddress, noteHash, exists, leafIndex);
|
|
208
201
|
return Promise.resolve(exists);
|
|
209
202
|
}
|
|
@@ -275,6 +268,9 @@ export class AvmPersistableStateManager {
|
|
|
275
268
|
this.log.debug(
|
|
276
269
|
`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
|
|
277
270
|
);
|
|
271
|
+
|
|
272
|
+
this.transitionalExecutionResult.l1ToL2MsgReadRequests.push(new ReadRequest(msgHash, this.trace.accessCounter));
|
|
273
|
+
|
|
278
274
|
this.trace.traceL1ToL2MessageCheck(msgHash, msgLeafIndex, exists);
|
|
279
275
|
return Promise.resolve(exists);
|
|
280
276
|
}
|
|
@@ -308,7 +304,8 @@ export class AvmPersistableStateManager {
|
|
|
308
304
|
this.transitionalExecutionResult.allUnencryptedLogs.push(ulog);
|
|
309
305
|
// this duplicates exactly what happens in the trace just for the purpose of transitional integration with the kernel
|
|
310
306
|
this.transitionalExecutionResult.unencryptedLogsHashes.push(
|
|
311
|
-
|
|
307
|
+
// TODO(6578): explain magic number 4 here
|
|
308
|
+
new LogHash(logHash, this.trace.accessCounter, new Fr(ulog.length + 4)),
|
|
312
309
|
);
|
|
313
310
|
// TODO(6206): likely need to track this here and not just in the transitional logic.
|
|
314
311
|
|
|
@@ -317,6 +314,19 @@ export class AvmPersistableStateManager {
|
|
|
317
314
|
this.trace.traceNewLog(logHash);
|
|
318
315
|
}
|
|
319
316
|
|
|
317
|
+
public async getContractInstance(contractAddress: Fr): Promise<TracedContractInstance> {
|
|
318
|
+
let exists = true;
|
|
319
|
+
const aztecAddress = AztecAddress.fromField(contractAddress);
|
|
320
|
+
let instance = await this.hostStorage.contractsDb.getContractInstance(aztecAddress);
|
|
321
|
+
if (instance === undefined) {
|
|
322
|
+
instance = SerializableContractInstance.empty().withAddress(aztecAddress);
|
|
323
|
+
exists = false;
|
|
324
|
+
}
|
|
325
|
+
const tracedInstance = { ...instance, exists };
|
|
326
|
+
this.trace.traceGetContractInstance(tracedInstance);
|
|
327
|
+
return Promise.resolve(tracedInstance);
|
|
328
|
+
}
|
|
329
|
+
|
|
320
330
|
/**
|
|
321
331
|
* Accept nested world state modifications, merging in its trace and accrued substate
|
|
322
332
|
*/
|
package/src/avm/journal/trace.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
type TracedContractInstance,
|
|
4
5
|
type TracedL1toL2MessageCheck,
|
|
5
6
|
type TracedNoteHash,
|
|
6
7
|
type TracedNoteHashCheck,
|
|
@@ -23,6 +24,7 @@ export class WorldStateAccessTrace {
|
|
|
23
24
|
public newNullifiers: TracedNullifier[] = [];
|
|
24
25
|
public l1ToL2MessageChecks: TracedL1toL2MessageCheck[] = [];
|
|
25
26
|
public newLogsHashes: TracedUnencryptedL2Log[] = [];
|
|
27
|
+
public gotContractInstances: TracedContractInstance[] = [];
|
|
26
28
|
|
|
27
29
|
//public contractCalls: TracedContractCall[] = [];
|
|
28
30
|
//public archiveChecks: TracedArchiveLeafCheck[] = [];
|
|
@@ -131,6 +133,7 @@ export class WorldStateAccessTrace {
|
|
|
131
133
|
leafIndex: msgLeafIndex,
|
|
132
134
|
msgHash: msgHash,
|
|
133
135
|
exists: exists,
|
|
136
|
+
counter: new Fr(this.accessCounter),
|
|
134
137
|
//endLifetime: Fr.ZERO, // FIXME
|
|
135
138
|
};
|
|
136
139
|
this.l1ToL2MessageChecks.push(traced);
|
|
@@ -146,6 +149,11 @@ export class WorldStateAccessTrace {
|
|
|
146
149
|
this.incrementAccessCounter();
|
|
147
150
|
}
|
|
148
151
|
|
|
152
|
+
public traceGetContractInstance(instance: TracedContractInstance) {
|
|
153
|
+
this.gotContractInstances.push(instance);
|
|
154
|
+
this.incrementAccessCounter();
|
|
155
|
+
}
|
|
156
|
+
|
|
149
157
|
private incrementAccessCounter() {
|
|
150
158
|
this.accessCounter++;
|
|
151
159
|
}
|
|
@@ -166,6 +174,7 @@ export class WorldStateAccessTrace {
|
|
|
166
174
|
this.newNullifiers.push(...incomingTrace.newNullifiers);
|
|
167
175
|
this.l1ToL2MessageChecks.push(...incomingTrace.l1ToL2MessageChecks);
|
|
168
176
|
this.newLogsHashes.push(...incomingTrace.newLogsHashes);
|
|
177
|
+
this.gotContractInstances.push(...incomingTrace.gotContractInstances);
|
|
169
178
|
// it is assumed that the incoming trace was initialized with this as parent, so accept counter
|
|
170
179
|
this.accessCounter = incomingTrace.accessCounter;
|
|
171
180
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
2
3
|
|
|
3
4
|
//export type TracedContractCall = {
|
|
4
5
|
// callPointer: Fr;
|
|
@@ -71,6 +72,7 @@ export type TracedL1toL2MessageCheck = {
|
|
|
71
72
|
leafIndex: Fr;
|
|
72
73
|
msgHash: Fr;
|
|
73
74
|
exists: boolean;
|
|
75
|
+
counter: Fr;
|
|
74
76
|
//endLifetime: Fr;
|
|
75
77
|
};
|
|
76
78
|
|
|
@@ -85,3 +87,5 @@ export type TracedUnencryptedL2Log = {
|
|
|
85
87
|
// leafIndex: Fr;
|
|
86
88
|
// leaf: Fr;
|
|
87
89
|
//};
|
|
90
|
+
|
|
91
|
+
export type TracedContractInstance = { exists: boolean } & ContractInstanceWithAddress;
|