@aztec/simulator 0.43.0 → 0.44.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.
Files changed (110) hide show
  1. package/dest/acvm/oracle/oracle.d.ts +2 -0
  2. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  3. package/dest/acvm/oracle/oracle.js +10 -4
  4. package/dest/acvm/oracle/typed_oracle.d.ts +5 -3
  5. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/typed_oracle.js +7 -1
  7. package/dest/avm/avm_execution_environment.d.ts +2 -0
  8. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  9. package/dest/avm/avm_execution_environment.js +9 -4
  10. package/dest/avm/avm_simulator.d.ts.map +1 -1
  11. package/dest/avm/avm_simulator.js +2 -3
  12. package/dest/avm/fixtures/index.d.ts +10 -6
  13. package/dest/avm/fixtures/index.d.ts.map +1 -1
  14. package/dest/avm/fixtures/index.js +8 -15
  15. package/dest/avm/journal/journal.d.ts +56 -65
  16. package/dest/avm/journal/journal.d.ts.map +1 -1
  17. package/dest/avm/journal/journal.js +76 -115
  18. package/dest/avm/journal/nullifiers.d.ts +21 -8
  19. package/dest/avm/journal/nullifiers.d.ts.map +1 -1
  20. package/dest/avm/journal/nullifiers.js +26 -8
  21. package/dest/avm/journal/public_storage.d.ts +4 -0
  22. package/dest/avm/journal/public_storage.d.ts.map +1 -1
  23. package/dest/avm/journal/public_storage.js +10 -1
  24. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  25. package/dest/avm/opcodes/accrued_substate.js +4 -4
  26. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  27. package/dest/avm/opcodes/external_calls.js +12 -27
  28. package/dest/avm/test_utils.d.ts +14 -0
  29. package/dest/avm/test_utils.d.ts.map +1 -0
  30. package/dest/avm/test_utils.js +36 -0
  31. package/dest/client/client_execution_context.d.ts +3 -3
  32. package/dest/client/client_execution_context.d.ts.map +1 -1
  33. package/dest/client/client_execution_context.js +3 -3
  34. package/dest/client/execution_note_cache.d.ts.map +1 -1
  35. package/dest/client/execution_note_cache.js +1 -1
  36. package/dest/client/execution_result.d.ts +2 -1
  37. package/dest/client/execution_result.d.ts.map +1 -1
  38. package/dest/client/execution_result.js +1 -1
  39. package/dest/client/index.d.ts +2 -0
  40. package/dest/client/index.d.ts.map +1 -1
  41. package/dest/client/index.js +3 -1
  42. package/dest/client/simulator.d.ts +3 -3
  43. package/dest/client/simulator.d.ts.map +1 -1
  44. package/dest/client/simulator.js +1 -1
  45. package/dest/client/view_data_oracle.d.ts +2 -0
  46. package/dest/client/view_data_oracle.d.ts.map +1 -1
  47. package/dest/client/view_data_oracle.js +7 -1
  48. package/dest/mocks/fixtures.d.ts.map +1 -1
  49. package/dest/mocks/fixtures.js +3 -2
  50. package/dest/public/abstract_phase_manager.d.ts +1 -0
  51. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  52. package/dest/public/abstract_phase_manager.js +11 -8
  53. package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
  54. package/dest/public/app_logic_phase_manager.js +2 -1
  55. package/dest/public/execution.d.ts +27 -25
  56. package/dest/public/execution.d.ts.map +1 -1
  57. package/dest/public/execution.js +1 -1
  58. package/dest/public/executor.d.ts +9 -4
  59. package/dest/public/executor.d.ts.map +1 -1
  60. package/dest/public/executor.js +29 -25
  61. package/dest/public/public_processor.d.ts +5 -2
  62. package/dest/public/public_processor.d.ts.map +1 -1
  63. package/dest/public/public_processor.js +142 -123
  64. package/dest/public/side_effect_trace.d.ts +86 -0
  65. package/dest/public/side_effect_trace.d.ts.map +1 -0
  66. package/dest/public/side_effect_trace.js +222 -0
  67. package/dest/public/side_effect_trace_interface.d.ts +36 -0
  68. package/dest/public/side_effect_trace_interface.d.ts.map +1 -0
  69. package/dest/public/side_effect_trace_interface.js +2 -0
  70. package/dest/public/teardown_phase_manager.d.ts.map +1 -1
  71. package/dest/public/teardown_phase_manager.js +2 -1
  72. package/dest/public/transitional_adaptors.d.ts +2 -6
  73. package/dest/public/transitional_adaptors.d.ts.map +1 -1
  74. package/dest/public/transitional_adaptors.js +1 -49
  75. package/package.json +18 -9
  76. package/src/acvm/oracle/oracle.ts +11 -3
  77. package/src/acvm/oracle/typed_oracle.ts +17 -3
  78. package/src/avm/avm_execution_environment.ts +10 -3
  79. package/src/avm/avm_simulator.ts +2 -3
  80. package/src/avm/fixtures/index.ts +18 -17
  81. package/src/avm/journal/journal.ts +114 -223
  82. package/src/avm/journal/nullifiers.ts +30 -13
  83. package/src/avm/journal/public_storage.ts +10 -0
  84. package/src/avm/opcodes/accrued_substate.ts +7 -3
  85. package/src/avm/opcodes/external_calls.ts +12 -34
  86. package/src/avm/test_utils.ts +53 -0
  87. package/src/client/client_execution_context.ts +10 -4
  88. package/src/client/execution_note_cache.ts +0 -1
  89. package/src/client/execution_result.ts +2 -1
  90. package/src/client/index.ts +2 -0
  91. package/src/client/simulator.ts +8 -2
  92. package/src/client/view_data_oracle.ts +8 -0
  93. package/src/mocks/fixtures.ts +2 -1
  94. package/src/public/abstract_phase_manager.ts +22 -11
  95. package/src/public/app_logic_phase_manager.ts +1 -0
  96. package/src/public/execution.ts +35 -25
  97. package/src/public/executor.ts +44 -37
  98. package/src/public/public_processor.ts +11 -2
  99. package/src/public/side_effect_trace.ts +323 -0
  100. package/src/public/side_effect_trace_interface.ts +41 -0
  101. package/src/public/teardown_phase_manager.ts +1 -0
  102. package/src/public/transitional_adaptors.ts +2 -100
  103. package/dest/avm/journal/trace.d.ts +0 -33
  104. package/dest/avm/journal/trace.d.ts.map +0 -1
  105. package/dest/avm/journal/trace.js +0 -152
  106. package/dest/avm/journal/trace_types.d.ts +0 -55
  107. package/dest/avm/journal/trace_types.d.ts.map +0 -1
  108. package/dest/avm/journal/trace_types.js +0 -2
  109. package/src/avm/journal/trace.ts +0 -181
  110. package/src/avm/journal/trace_types.ts +0 -91
@@ -1,71 +1,45 @@
1
- import { UnencryptedL2Log } from '@aztec/circuit-types';
2
- import { ContractStorageRead, ContractStorageUpdateRequest, EthAddress, L2ToL1Message, LogHash, NoteHash, Nullifier, ReadRequest } from '@aztec/circuits.js';
3
- import { Fr } from '@aztec/foundation/fields';
4
- import { type PublicExecutionResult } from '../../index.js';
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { AztecAddress, type FunctionSelector, type Gas } from '@aztec/circuits.js';
3
+ import { type Fr } from '@aztec/foundation/fields';
4
+ import { type TracedContractInstance } from '../../public/side_effect_trace.js';
5
+ import { type PublicSideEffectTraceInterface } from '../../public/side_effect_trace_interface.js';
6
+ import { type AvmExecutionEnvironment } from '../avm_execution_environment.js';
7
+ import { type AvmContractCallResults } from '../avm_message_call_result.js';
5
8
  import { type HostStorage } from './host_storage.js';
6
- import { Nullifiers } from './nullifiers.js';
9
+ import { NullifierManager } from './nullifiers.js';
7
10
  import { PublicStorage } from './public_storage.js';
8
- import { WorldStateAccessTrace } from './trace.js';
9
- import { type TracedContractInstance, type TracedL1toL2MessageCheck, type TracedNoteHash, type TracedNoteHashCheck, type TracedNullifier, type TracedNullifierCheck, type TracedPublicStorageRead, type TracedPublicStorageWrite, type TracedUnencryptedL2Log } from './trace_types.js';
10
- /**
11
- * Data held within the journal
12
- */
13
- export type JournalData = {
14
- storageWrites: TracedPublicStorageWrite[];
15
- storageReads: TracedPublicStorageRead[];
16
- noteHashChecks: TracedNoteHashCheck[];
17
- newNoteHashes: TracedNoteHash[];
18
- nullifierChecks: TracedNullifierCheck[];
19
- newNullifiers: TracedNullifier[];
20
- l1ToL2MessageChecks: TracedL1toL2MessageCheck[];
21
- newL1Messages: L2ToL1Message[];
22
- newLogs: UnencryptedL2Log[];
23
- newLogsHashes: TracedUnencryptedL2Log[];
24
- /** contract address -\> key -\> value */
25
- currentStorageValue: Map<bigint, Map<bigint, Fr>>;
26
- sideEffectCounter: number;
27
- };
28
- export type PartialPublicExecutionResult = {
29
- noteHashReadRequests: ReadRequest[];
30
- nullifierReadRequests: ReadRequest[];
31
- nullifierNonExistentReadRequests: ReadRequest[];
32
- l1ToL2MsgReadRequests: ReadRequest[];
33
- newNoteHashes: NoteHash[];
34
- newL2ToL1Messages: L2ToL1Message[];
35
- startSideEffectCounter: number;
36
- newNullifiers: Nullifier[];
37
- contractStorageReads: ContractStorageRead[];
38
- contractStorageUpdateRequests: ContractStorageUpdateRequest[];
39
- unencryptedLogsHashes: LogHash[];
40
- unencryptedLogs: UnencryptedL2Log[];
41
- allUnencryptedLogs: UnencryptedL2Log[];
42
- nestedExecutions: PublicExecutionResult[];
43
- };
44
11
  /**
45
12
  * A class to manage persistable AVM state for contract calls.
46
13
  * Maintains a cache of the current world state,
47
- * a trace of all world state accesses, and a list of accrued substate items.
14
+ * a trace of all side effects.
48
15
  *
49
- * The simulator should make any world state and accrued substate queries through this object.
16
+ * The simulator should make any world state / tree queries through this object.
50
17
  *
51
18
  * Manages merging of successful/reverted child state into current state.
52
19
  */
53
20
  export declare class AvmPersistableStateManager {
21
+ /** Reference to node storage */
22
+ private hostStorage;
23
+ /** Side effect trace */
24
+ private trace;
25
+ /** Public storage, including cached writes */
26
+ readonly publicStorage: PublicStorage;
27
+ /** Nullifier set, including cached/recently-emitted nullifiers */
28
+ private readonly nullifiers;
54
29
  private readonly log;
30
+ constructor(
55
31
  /** Reference to node storage */
56
- readonly hostStorage: HostStorage;
57
- /** World State */
32
+ hostStorage: HostStorage,
33
+ /** Side effect trace */
34
+ trace: PublicSideEffectTraceInterface,
58
35
  /** Public storage, including cached writes */
59
- publicStorage: PublicStorage;
36
+ publicStorage: PublicStorage,
60
37
  /** Nullifier set, including cached/recently-emitted nullifiers */
61
- nullifiers: Nullifiers;
62
- /** World State Access Trace */
63
- trace: WorldStateAccessTrace;
64
- /** Accrued Substate **/
65
- newL1Messages: L2ToL1Message[];
66
- newLogs: UnencryptedL2Log[];
67
- transitionalExecutionResult: PartialPublicExecutionResult;
68
- constructor(hostStorage: HostStorage, parent?: AvmPersistableStateManager);
38
+ nullifiers: NullifierManager);
39
+ /**
40
+ * Create a new state manager with some preloaded pending siloed nullifiers
41
+ */
42
+ static newWithPendingSiloedNullifiers(hostStorage: HostStorage, trace: PublicSideEffectTraceInterface, pendingSiloedNullifiers: Fr[]): AvmPersistableStateManager;
69
43
  /**
70
44
  * Create a new state manager forked from this one
71
45
  */
@@ -86,6 +60,14 @@ export declare class AvmPersistableStateManager {
86
60
  * @returns the latest value written to slot, or 0 if never written to before
87
61
  */
88
62
  readStorage(storageAddress: Fr, slot: Fr): Promise<Fr>;
63
+ /**
64
+ * Read from public storage, don't trace the read.
65
+ *
66
+ * @param storageAddress - the address of the contract whose storage is being read from
67
+ * @param slot - the slot in the contract's storage being read from
68
+ * @returns the latest value written to slot, or 0 if never written to before
69
+ */
70
+ peekStorage(storageAddress: Fr, slot: Fr): Promise<Fr>;
89
71
  /**
90
72
  * Check if a note hash exists at the given leaf index, trace the check.
91
73
  *
@@ -119,28 +101,37 @@ export declare class AvmPersistableStateManager {
119
101
  * @param msgLeafIndex - the message leaf index to use in the check
120
102
  * @returns exists - whether the message exists in the L1 to L2 Messages tree
121
103
  */
122
- checkL1ToL2MessageExists(msgHash: Fr, msgLeafIndex: Fr): Promise<boolean>;
104
+ checkL1ToL2MessageExists(contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr): Promise<boolean>;
123
105
  /**
124
106
  * Write an L2 to L1 message.
125
107
  * @param recipient - L1 contract address to send the message to.
126
108
  * @param content - Message content.
127
109
  */
128
- writeL1Message(recipient: EthAddress | Fr, content: Fr): void;
129
- writeLog(contractAddress: Fr, event: Fr, log: Fr[]): void;
110
+ writeL2ToL1Message(recipient: Fr, content: Fr): void;
111
+ /**
112
+ * Write an unencrypted log
113
+ * @param contractAddress - address of the contract that emitted the log
114
+ * @param event - log event selector
115
+ * @param log - log contents
116
+ */
117
+ writeUnencryptedLog(contractAddress: Fr, event: Fr, log: Fr[]): void;
118
+ /**
119
+ * Get a contract instance.
120
+ * @param contractAddress - address of the contract instance to retrieve.
121
+ * @returns the contract instance with an "exists" flag
122
+ */
130
123
  getContractInstance(contractAddress: Fr): Promise<TracedContractInstance>;
131
124
  /**
132
- * Accept nested world state modifications, merging in its trace and accrued substate
125
+ * Accept nested world state modifications
133
126
  */
134
- acceptNestedCallState(nestedJournal: AvmPersistableStateManager): void;
127
+ acceptNestedCallState(nestedState: AvmPersistableStateManager): void;
135
128
  /**
136
- * Reject nested world state, merging in its trace, but not accepting any state modifications
129
+ * Get a contract's bytecode from the contracts DB
137
130
  */
138
- rejectNestedCallState(nestedJournal: AvmPersistableStateManager): void;
131
+ getBytecode(contractAddress: AztecAddress, selector: FunctionSelector): Promise<Buffer | undefined>;
139
132
  /**
140
- * Access the current state of the journal
141
- *
142
- * @returns a JournalData object
133
+ * Accept the nested call's state and trace the nested call
143
134
  */
144
- flush(): JournalData;
135
+ processNestedCall(nestedState: AvmPersistableStateManager, success: boolean, nestedEnvironment: AvmExecutionEnvironment, startGasLeft: Gas, endGasLeft: Gas, bytecode: Buffer, avmCallResults: AvmContractCallResults): Promise<void>;
145
136
  }
146
137
  //# sourceMappingURL=journal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/journal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/journal.ts"],"names":[],"mappings":"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"}
@@ -1,54 +1,47 @@
1
- // TODO(5818): Rename file and all uses of "journal"
2
- import { UnencryptedL2Log } from '@aztec/circuit-types';
3
- import { AztecAddress, ContractStorageRead, ContractStorageUpdateRequest, EthAddress, L2ToL1Message, LogHash, NoteHash, Nullifier, ReadRequest, } from '@aztec/circuits.js';
4
- import { EventSelector } from '@aztec/foundation/abi';
5
- import { Fr } from '@aztec/foundation/fields';
1
+ import { AztecAddress } from '@aztec/circuits.js';
6
2
  import { createDebugLogger } from '@aztec/foundation/log';
7
3
  import { SerializableContractInstance } from '@aztec/types/contracts';
8
- import { Nullifiers } from './nullifiers.js';
4
+ import { NullifierManager } from './nullifiers.js';
9
5
  import { PublicStorage } from './public_storage.js';
10
- import { WorldStateAccessTrace } from './trace.js';
11
6
  /**
12
7
  * A class to manage persistable AVM state for contract calls.
13
8
  * Maintains a cache of the current world state,
14
- * a trace of all world state accesses, and a list of accrued substate items.
9
+ * a trace of all side effects.
15
10
  *
16
- * The simulator should make any world state and accrued substate queries through this object.
11
+ * The simulator should make any world state / tree queries through this object.
17
12
  *
18
13
  * Manages merging of successful/reverted child state into current state.
19
14
  */
20
15
  export class AvmPersistableStateManager {
21
- constructor(hostStorage, parent) {
22
- this.log = createDebugLogger('aztec:avm_simulator:state_manager');
23
- /** Accrued Substate **/
24
- this.newL1Messages = [];
25
- this.newLogs = [];
16
+ constructor(
17
+ /** Reference to node storage */
18
+ hostStorage,
19
+ /** Side effect trace */
20
+ trace,
21
+ /** Public storage, including cached writes */
22
+ publicStorage,
23
+ /** Nullifier set, including cached/recently-emitted nullifiers */
24
+ nullifiers) {
26
25
  this.hostStorage = hostStorage;
27
- this.publicStorage = new PublicStorage(hostStorage.publicStateDb, parent?.publicStorage);
28
- this.nullifiers = new Nullifiers(hostStorage.commitmentsDb, parent?.nullifiers);
29
- this.trace = new WorldStateAccessTrace(parent?.trace);
30
- this.transitionalExecutionResult = {
31
- noteHashReadRequests: [],
32
- nullifierReadRequests: [],
33
- nullifierNonExistentReadRequests: [],
34
- l1ToL2MsgReadRequests: [],
35
- newNoteHashes: [],
36
- newL2ToL1Messages: [],
37
- startSideEffectCounter: this.trace.accessCounter,
38
- newNullifiers: [],
39
- contractStorageReads: [],
40
- contractStorageUpdateRequests: [],
41
- unencryptedLogsHashes: [],
42
- unencryptedLogs: [],
43
- allUnencryptedLogs: [],
44
- nestedExecutions: [],
45
- };
26
+ this.trace = trace;
27
+ this.publicStorage = publicStorage;
28
+ this.nullifiers = nullifiers;
29
+ this.log = createDebugLogger('aztec:avm_simulator:state_manager');
30
+ }
31
+ /**
32
+ * Create a new state manager with some preloaded pending siloed nullifiers
33
+ */
34
+ static newWithPendingSiloedNullifiers(hostStorage, trace, pendingSiloedNullifiers) {
35
+ const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(hostStorage.commitmentsDb, pendingSiloedNullifiers);
36
+ return new AvmPersistableStateManager(hostStorage, trace,
37
+ /*publicStorage=*/ new PublicStorage(hostStorage.publicStateDb),
38
+ /*nullifiers=*/ parentNullifiers.fork());
46
39
  }
47
40
  /**
48
41
  * Create a new state manager forked from this one
49
42
  */
50
43
  fork() {
51
- return new AvmPersistableStateManager(this.hostStorage, this);
44
+ return new AvmPersistableStateManager(this.hostStorage, this.trace.fork(), this.publicStorage.fork(), this.nullifiers.fork());
52
45
  }
53
46
  /**
54
47
  * Write to public storage, journal/trace the write.
@@ -61,9 +54,6 @@ export class AvmPersistableStateManager {
61
54
  this.log.debug(`Storage write (address=${storageAddress}, slot=${slot}): value=${value}`);
62
55
  // Cache storage writes for later reference/reads
63
56
  this.publicStorage.write(storageAddress, slot, value);
64
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
65
- this.transitionalExecutionResult.contractStorageUpdateRequests.push(new ContractStorageUpdateRequest(slot, value, this.trace.accessCounter, storageAddress));
66
- // Trace all storage writes (even reverted ones)
67
57
  this.trace.tracePublicStorageWrite(storageAddress, slot, value);
68
58
  }
69
59
  /**
@@ -76,12 +66,21 @@ export class AvmPersistableStateManager {
76
66
  async readStorage(storageAddress, slot) {
77
67
  const { value, exists, cached } = await this.publicStorage.read(storageAddress, slot);
78
68
  this.log.debug(`Storage read (address=${storageAddress}, slot=${slot}): value=${value}, exists=${exists}, cached=${cached}`);
79
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
80
- this.transitionalExecutionResult.contractStorageReads.push(new ContractStorageRead(slot, value, this.trace.accessCounter, storageAddress));
81
- // We want to keep track of all performed reads (even reverted ones)
82
69
  this.trace.tracePublicStorageRead(storageAddress, slot, value, exists, cached);
83
70
  return Promise.resolve(value);
84
71
  }
72
+ /**
73
+ * Read from public storage, don't trace the read.
74
+ *
75
+ * @param storageAddress - the address of the contract whose storage is being read from
76
+ * @param slot - the slot in the contract's storage being read from
77
+ * @returns the latest value written to slot, or 0 if never written to before
78
+ */
79
+ async peekStorage(storageAddress, slot) {
80
+ const { value, exists, cached } = await this.publicStorage.read(storageAddress, slot);
81
+ this.log.debug(`Storage peek (address=${storageAddress}, slot=${slot}): value=${value}, exists=${exists}, cached=${cached}`);
82
+ return Promise.resolve(value);
83
+ }
85
84
  // TODO(4886): We currently don't silo note hashes.
86
85
  /**
87
86
  * Check if a note hash exists at the given leaf index, trace the check.
@@ -95,9 +94,7 @@ export class AvmPersistableStateManager {
95
94
  const gotLeafIndex = await this.hostStorage.commitmentsDb.getCommitmentIndex(noteHash);
96
95
  const exists = gotLeafIndex === leafIndex.toBigInt();
97
96
  this.log.debug(`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex}, exists: ${exists}.`);
98
- // TODO: include exists here also - This can for sure come from the trace???
99
- this.transitionalExecutionResult.noteHashReadRequests.push(new ReadRequest(noteHash, this.trace.accessCounter));
100
- this.trace.traceNoteHashCheck(storageAddress, noteHash, exists, leafIndex);
97
+ this.trace.traceNoteHashCheck(storageAddress, noteHash, leafIndex, exists);
101
98
  return Promise.resolve(exists);
102
99
  }
103
100
  /**
@@ -105,8 +102,6 @@ export class AvmPersistableStateManager {
105
102
  * @param noteHash - the unsiloed note hash to write
106
103
  */
107
104
  writeNoteHash(storageAddress, noteHash) {
108
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
109
- this.transitionalExecutionResult.newNoteHashes.push(new NoteHash(noteHash, this.trace.accessCounter));
110
105
  this.log.debug(`noteHashes(${storageAddress}) += @${noteHash}.`);
111
106
  this.trace.traceNewNoteHash(storageAddress, noteHash);
112
107
  }
@@ -118,15 +113,8 @@ export class AvmPersistableStateManager {
118
113
  */
119
114
  async checkNullifierExists(storageAddress, nullifier) {
120
115
  const [exists, isPending, leafIndex] = await this.nullifiers.checkExists(storageAddress, nullifier);
121
- this.log.debug(`nullifiers(${storageAddress})@${nullifier} ?? leafIndex: ${leafIndex}, pending: ${isPending}, exists: ${exists}.`);
122
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
123
- if (exists) {
124
- this.transitionalExecutionResult.nullifierReadRequests.push(new ReadRequest(nullifier, this.trace.accessCounter));
125
- }
126
- else {
127
- this.transitionalExecutionResult.nullifierNonExistentReadRequests.push(new ReadRequest(nullifier, this.trace.accessCounter));
128
- }
129
- this.trace.traceNullifierCheck(storageAddress, nullifier, exists, isPending, leafIndex);
116
+ this.log.debug(`nullifiers(${storageAddress})@${nullifier} ?? leafIndex: ${leafIndex}, exists: ${exists}, pending: ${isPending}.`);
117
+ this.trace.traceNullifierCheck(storageAddress, nullifier, leafIndex, exists, isPending);
130
118
  return Promise.resolve(exists);
131
119
  }
132
120
  /**
@@ -135,8 +123,6 @@ export class AvmPersistableStateManager {
135
123
  * @param nullifier - the unsiloed nullifier to write
136
124
  */
137
125
  async writeNullifier(storageAddress, nullifier) {
138
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
139
- this.transitionalExecutionResult.newNullifiers.push(new Nullifier(nullifier, this.trace.accessCounter, /*noteHash=*/ Fr.ZERO));
140
126
  this.log.debug(`nullifiers(${storageAddress}) += ${nullifier}.`);
141
127
  // Cache pending nullifiers for later access
142
128
  await this.nullifiers.append(storageAddress, nullifier);
@@ -149,12 +135,11 @@ export class AvmPersistableStateManager {
149
135
  * @param msgLeafIndex - the message leaf index to use in the check
150
136
  * @returns exists - whether the message exists in the L1 to L2 Messages tree
151
137
  */
152
- async checkL1ToL2MessageExists(msgHash, msgLeafIndex) {
138
+ async checkL1ToL2MessageExists(contractAddress, msgHash, msgLeafIndex) {
153
139
  const valueAtIndex = await this.hostStorage.commitmentsDb.getL1ToL2LeafValue(msgLeafIndex.toBigInt());
154
140
  const exists = valueAtIndex?.equals(msgHash) ?? false;
155
141
  this.log.debug(`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`);
156
- this.transitionalExecutionResult.l1ToL2MsgReadRequests.push(new ReadRequest(msgHash, this.trace.accessCounter));
157
- this.trace.traceL1ToL2MessageCheck(msgHash, msgLeafIndex, exists);
142
+ this.trace.traceL1ToL2MessageCheck(contractAddress, msgHash, msgLeafIndex, exists);
158
143
  return Promise.resolve(exists);
159
144
  }
160
145
  /**
@@ -162,30 +147,25 @@ export class AvmPersistableStateManager {
162
147
  * @param recipient - L1 contract address to send the message to.
163
148
  * @param content - Message content.
164
149
  */
165
- writeL1Message(recipient, content) {
150
+ writeL2ToL1Message(recipient, content) {
166
151
  this.log.debug(`L1Messages(${recipient}) += ${content}.`);
167
- const recipientAddress = recipient instanceof EthAddress ? recipient : EthAddress.fromField(recipient);
168
- const message = new L2ToL1Message(recipientAddress, content, 0);
169
- this.newL1Messages.push(message);
170
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
171
- this.transitionalExecutionResult.newL2ToL1Messages.push(message);
152
+ this.trace.traceNewL2ToL1Message(recipient, content);
172
153
  }
173
- writeLog(contractAddress, event, log) {
154
+ /**
155
+ * Write an unencrypted log
156
+ * @param contractAddress - address of the contract that emitted the log
157
+ * @param event - log event selector
158
+ * @param log - log contents
159
+ */
160
+ writeUnencryptedLog(contractAddress, event, log) {
174
161
  this.log.debug(`UnencryptedL2Log(${contractAddress}) += event ${event} with ${log.length} fields.`);
175
- const ulog = new UnencryptedL2Log(AztecAddress.fromField(contractAddress), EventSelector.fromField(event), Buffer.concat(log.map(f => f.toBuffer())));
176
- const logHash = Fr.fromBuffer(ulog.hash());
177
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
178
- this.transitionalExecutionResult.unencryptedLogs.push(ulog);
179
- this.transitionalExecutionResult.allUnencryptedLogs.push(ulog);
180
- // this duplicates exactly what happens in the trace just for the purpose of transitional integration with the kernel
181
- this.transitionalExecutionResult.unencryptedLogsHashes.push(
182
- // TODO(6578): explain magic number 4 here
183
- new LogHash(logHash, this.trace.accessCounter, new Fr(ulog.length + 4)));
184
- // TODO(6206): likely need to track this here and not just in the transitional logic.
185
- // TODO(6205): why are logs pushed here but logs hashes are traced?
186
- this.newLogs.push(ulog);
187
- this.trace.traceNewLog(logHash);
162
+ this.trace.traceUnencryptedLog(contractAddress, event, log);
188
163
  }
164
+ /**
165
+ * Get a contract instance.
166
+ * @param contractAddress - address of the contract instance to retrieve.
167
+ * @returns the contract instance with an "exists" flag
168
+ */
189
169
  async getContractInstance(contractAddress) {
190
170
  let exists = true;
191
171
  const aztecAddress = AztecAddress.fromField(contractAddress);
@@ -194,52 +174,33 @@ export class AvmPersistableStateManager {
194
174
  instance = SerializableContractInstance.empty().withAddress(aztecAddress);
195
175
  exists = false;
196
176
  }
177
+ this.log.debug(`Get Contract instance (address=${contractAddress}): exists=${exists}, instance=${JSON.stringify(instance)}`);
197
178
  const tracedInstance = { ...instance, exists };
198
179
  this.trace.traceGetContractInstance(tracedInstance);
199
180
  return Promise.resolve(tracedInstance);
200
181
  }
201
182
  /**
202
- * Accept nested world state modifications, merging in its trace and accrued substate
183
+ * Accept nested world state modifications
203
184
  */
204
- acceptNestedCallState(nestedJournal) {
205
- // Merge Public Storage
206
- this.publicStorage.acceptAndMerge(nestedJournal.publicStorage);
207
- // Merge World State Access Trace
208
- this.trace.acceptAndMerge(nestedJournal.trace);
209
- // Accrued Substate
210
- this.newL1Messages.push(...nestedJournal.newL1Messages);
211
- this.newLogs.push(...nestedJournal.newLogs);
212
- // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
213
- this.transitionalExecutionResult.allUnencryptedLogs.push(...nestedJournal.transitionalExecutionResult.allUnencryptedLogs);
185
+ acceptNestedCallState(nestedState) {
186
+ this.publicStorage.acceptAndMerge(nestedState.publicStorage);
187
+ this.nullifiers.acceptAndMerge(nestedState.nullifiers);
214
188
  }
215
189
  /**
216
- * Reject nested world state, merging in its trace, but not accepting any state modifications
190
+ * Get a contract's bytecode from the contracts DB
217
191
  */
218
- rejectNestedCallState(nestedJournal) {
219
- // Merge World State Access Trace
220
- this.trace.acceptAndMerge(nestedJournal.trace);
192
+ async getBytecode(contractAddress, selector) {
193
+ return await this.hostStorage.contractsDb.getBytecode(contractAddress, selector);
221
194
  }
222
- // TODO:(5818): do we need this type anymore?
223
195
  /**
224
- * Access the current state of the journal
225
- *
226
- * @returns a JournalData object
227
- */
228
- flush() {
229
- return {
230
- noteHashChecks: this.trace.noteHashChecks,
231
- newNoteHashes: this.trace.newNoteHashes,
232
- nullifierChecks: this.trace.nullifierChecks,
233
- newNullifiers: this.trace.newNullifiers,
234
- l1ToL2MessageChecks: this.trace.l1ToL2MessageChecks,
235
- newL1Messages: this.newL1Messages,
236
- newLogs: this.newLogs,
237
- newLogsHashes: this.trace.newLogsHashes,
238
- currentStorageValue: this.publicStorage.getCache().cachePerContract,
239
- storageReads: this.trace.publicStorageReads,
240
- storageWrites: this.trace.publicStorageWrites,
241
- sideEffectCounter: this.trace.accessCounter,
242
- };
196
+ * Accept the nested call's state and trace the nested call
197
+ */
198
+ async processNestedCall(nestedState, success, nestedEnvironment, startGasLeft, endGasLeft, bytecode, avmCallResults) {
199
+ if (success) {
200
+ this.acceptNestedCallState(nestedState);
201
+ }
202
+ const functionName = (await nestedState.hostStorage.contractsDb.getDebugFunctionName(nestedEnvironment.address, nestedEnvironment.temporaryFunctionSelector)) ?? `${nestedEnvironment.address}:${nestedEnvironment.temporaryFunctionSelector}`;
203
+ this.trace.traceNestedCall(nestedState.trace, nestedEnvironment, startGasLeft, endGasLeft, bytecode, avmCallResults, functionName);
243
204
  }
244
205
  }
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam91cm5hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vam91cm5hbC9qb3VybmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsVUFBVSxFQUNWLGFBQWEsRUFDYixPQUFPLEVBQ1AsUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEdBQ1osTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUl0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQXNEbkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCO0lBc0JyQyxZQUFZLFdBQXdCLEVBQUUsTUFBbUM7UUFyQnhELFFBQUcsR0FBZ0IsaUJBQWlCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQWMzRix3QkFBd0I7UUFDakIsa0JBQWEsR0FBb0IsRUFBRSxDQUFDO1FBQ3BDLFlBQU8sR0FBdUIsRUFBRSxDQUFDO1FBTXRDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxNQUFN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
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam91cm5hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vam91cm5hbC9qb3VybmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQW1DLE1BQU0sb0JBQW9CLENBQUM7QUFFbkYsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTywwQkFBMEI7SUFHckM7SUFDRSxnQ0FBZ0M7SUFDeEIsV0FBd0I7SUFDaEMsd0JBQXdCO0lBQ2hCLEtBQXFDO0lBQzdDLDhDQUE4QztJQUM5QixhQUE0QjtJQUM1QyxrRUFBa0U7SUFDakQsVUFBNEI7UUFOckMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFFeEIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFFN0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFFM0IsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFWOUIsUUFBRyxHQUFnQixpQkFBaUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBV3hGLENBQUM7SUFFSjs7T0FFRztJQUNJLE1BQU0sQ0FBQyw4QkFBOEIsQ0FDMUMsV0FBd0IsRUFDeEIsS0FBcUMsRUFDckMsdUJBQTZCO1FBRTdCLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsOEJBQThCLENBQ3RFLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLHVCQUF1QixDQUN4QixDQUFDO1FBQ0YsT0FBTyxJQUFJLDBCQUEwQixDQUNuQyxXQUFXLEVBQ1gsS0FBSztRQUNMLGtCQUFrQixDQUFDLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFh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
@@ -5,18 +5,28 @@ import type { CommitmentsDB } from '../../index.js';
5
5
  * Maintains a nullifier cache, and ensures that existence checks fall back to the correct source.
6
6
  * When a contract call completes, its cached nullifier set can be merged into its parent's.
7
7
  */
8
- export declare class Nullifiers {
8
+ export declare class NullifierManager {
9
9
  /** Reference to node storage. Checked on parent cache-miss. */
10
10
  private readonly hostNullifiers;
11
- /** Parent's nullifiers. Checked on this' cache-miss. */
12
- private readonly parent?;
13
11
  /** Cached nullifiers. */
14
- cache: NullifierCache;
12
+ private readonly cache;
13
+ /** Parent nullifier manager to fall back on */
14
+ private readonly parent?;
15
15
  constructor(
16
16
  /** Reference to node storage. Checked on parent cache-miss. */
17
17
  hostNullifiers: CommitmentsDB,
18
- /** Parent's nullifiers. Checked on this' cache-miss. */
19
- parent?: Nullifiers | undefined);
18
+ /** Cached nullifiers. */
19
+ cache?: NullifierCache,
20
+ /** Parent nullifier manager to fall back on */
21
+ parent?: NullifierManager | undefined);
22
+ /**
23
+ * Create a new nullifiers manager with some preloaded pending siloed nullifiers
24
+ */
25
+ static newWithPendingSiloedNullifiers(hostNullifiers: CommitmentsDB, pendingSiloedNullifiers: Fr[]): NullifierManager;
26
+ /**
27
+ * Create a new nullifiers manager forked from this one
28
+ */
29
+ fork(): NullifierManager;
20
30
  /**
21
31
  * Get a nullifier's existence in this' cache or parent's (recursively).
22
32
  * DOES NOT CHECK HOST STORAGE!
@@ -51,7 +61,7 @@ export declare class Nullifiers {
51
61
  *
52
62
  * @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
53
63
  */
54
- acceptAndMerge(incomingNullifiers: Nullifiers): void;
64
+ acceptAndMerge(incomingNullifiers: NullifierManager): void;
55
65
  }
56
66
  /**
57
67
  * A class to cache nullifiers created during a contract call's AVM simulation.
@@ -66,6 +76,10 @@ export declare class NullifierCache {
66
76
  */
67
77
  private cachePerContract;
68
78
  private siloedNullifiers;
79
+ /**
80
+ * @parem siloedNullifierFrs: optional list of pending siloed nullifiers to initialize this cache with
81
+ */
82
+ constructor(siloedNullifierFrs?: Fr[]);
69
83
  /**
70
84
  * Check whether a nullifier exists in the cache.
71
85
  *
@@ -81,7 +95,6 @@ export declare class NullifierCache {
81
95
  * @param nullifier - the nullifier to stage
82
96
  */
83
97
  append(storageAddress: Fr, nullifier: Fr): void;
84
- appendSiloed(siloedNullifier: Fr): void;
85
98
  /**
86
99
  * Merge another cache's nullifiers into this instance's.
87
100
  *
@@ -1 +1 @@
1
- {"version":3,"file":"nullifiers.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/nullifiers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,UAAU;IAKnB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,yBAAyB;IAClB,KAAK,EAAE,cAAc,CAAC;;IAG3B,+DAA+D;IAC9C,cAAc,EAAE,aAAa;IAC9C,wDAAwD;IACvC,MAAM,CAAC,wBAAwB;IAKlD;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;;;OAYG;IACU,WAAW,CACtB,cAAc,EAAE,EAAE,EAClB,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IAe5E;;;;;OAKG;IACU,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;IAUrD;;;;OAIG;IACI,cAAc,CAAC,kBAAkB,EAAE,UAAU;CAGrD;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,gBAAgB,CAA0B;IAElD;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO;IAOzD;;;;;OAKG;IACI,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;IAgBxC,YAAY,CAAC,eAAe,EAAE,EAAE;IAIvC;;;;;;;;OAQG;IACI,cAAc,CAAC,kBAAkB,EAAE,cAAc;CAwBzD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAI5C"}
1
+ {"version":3,"file":"nullifiers.d.ts","sourceRoot":"","sources":["../../../src/avm/journal/nullifiers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,gBAAgB;IAEzB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IALxB,+DAA+D;IAC9C,cAAc,EAAE,aAAa;IAC9C,yBAAyB;IACR,KAAK,GAAE,cAAqC;IAC7D,+CAA+C;IAC9B,MAAM,CAAC,8BAAkB;IAG5C;;OAEG;WACW,8BAA8B,CAAC,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAAE,EAAE;IAKzG;;OAEG;IACI,IAAI;IAIX;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;;;OAYG;IACU,WAAW,CACtB,cAAc,EAAE,EAAE,EAClB,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IAe5E;;;;;OAKG;IACU,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;IAUrD;;;;OAIG;IACI,cAAc,CAAC,kBAAkB,EAAE,gBAAgB;CAG3D;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,gBAAgB,CAA0B;IAElD;;OAEG;gBACS,kBAAkB,CAAC,EAAE,EAAE,EAAE;IAMrC;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO;IAOzD;;;;;OAKG;IACI,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;IAgB/C;;;;;;;;OAQG;IACI,cAAc,CAAC,kBAAkB,EAAE,cAAc;CAwBzD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAI5C"}