@aztec/simulator 0.52.0 → 0.54.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 +7 -0
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +17 -1
- package/dest/avm/avm_execution_environment.d.ts +2 -2
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +5 -6
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +73 -43
- package/dest/avm/avm_memory_types.d.ts +1 -1
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +5 -3
- package/dest/avm/bytecode_utils.js +5 -5
- package/dest/avm/errors.js +2 -2
- package/dest/avm/fixtures/index.d.ts +2 -0
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +18 -2
- package/dest/avm/journal/journal.d.ts +1 -1
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +13 -8
- package/dest/avm/opcodes/arithmetic.d.ts +9 -16
- package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/avm/opcodes/arithmetic.js +12 -37
- package/dest/avm/opcodes/bitwise.d.ts +5 -5
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +6 -6
- package/dest/avm/opcodes/comparators.d.ts +3 -3
- package/dest/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/avm/opcodes/comparators.js +4 -4
- package/dest/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/avm/opcodes/control_flow.js +6 -6
- package/dest/avm/opcodes/instruction.d.ts +18 -12
- package/dest/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction.js +36 -19
- package/dest/avm/opcodes/instruction_impl.d.ts +4 -2
- package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction_impl.js +15 -7
- package/dest/avm/opcodes/memory.d.ts +11 -12
- package/dest/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/avm/opcodes/memory.js +68 -68
- package/dest/avm/serialization/bytecode_serialization.d.ts +7 -8
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +83 -67
- package/dest/avm/serialization/instruction_serialization.d.ts +84 -68
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +102 -71
- 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 +11 -3
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +4 -4
- package/dest/public/db_interfaces.d.ts +6 -0
- package/dest/public/db_interfaces.d.ts.map +1 -1
- package/dest/public/execution.d.ts +3 -3
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -1
- package/dest/public/hints_builder.d.ts +6 -4
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +20 -5
- package/dest/public/public_db_sources.d.ts +1 -0
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +11 -1
- package/dest/public/side_effect_trace.d.ts +2 -2
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +10 -12
- package/dest/public/tail_phase_manager.d.ts.map +1 -1
- package/dest/public/tail_phase_manager.js +4 -3
- package/package.json +9 -9
- package/src/acvm/acvm.ts +22 -0
- package/src/avm/avm_execution_environment.ts +3 -4
- package/src/avm/avm_gas.ts +72 -42
- package/src/avm/avm_memory_types.ts +4 -2
- package/src/avm/bytecode_utils.ts +4 -4
- package/src/avm/errors.ts +1 -1
- package/src/avm/fixtures/index.ts +32 -2
- package/src/avm/journal/journal.ts +14 -8
- package/src/avm/opcodes/arithmetic.ts +12 -41
- package/src/avm/opcodes/bitwise.ts +5 -5
- package/src/avm/opcodes/comparators.ts +3 -3
- package/src/avm/opcodes/control_flow.ts +5 -5
- package/src/avm/opcodes/instruction.ts +41 -19
- package/src/avm/opcodes/instruction_impl.ts +14 -6
- package/src/avm/opcodes/memory.ts +76 -74
- package/src/avm/serialization/bytecode_serialization.ts +93 -77
- package/src/avm/serialization/instruction_serialization.ts +58 -25
- package/src/avm/test_utils.ts +9 -2
- package/src/public/abstract_phase_manager.ts +3 -2
- package/src/public/db_interfaces.ts +7 -0
- package/src/public/execution.ts +3 -2
- package/src/public/hints_builder.ts +48 -13
- package/src/public/public_db_sources.ts +11 -0
- package/src/public/side_effect_trace.ts +11 -12
- package/src/public/tail_phase_manager.ts +10 -7
|
@@ -1,33 +1,48 @@
|
|
|
1
1
|
import { type IndexedTreeId, MerkleTreeId } from '@aztec/circuit-types';
|
|
2
2
|
import {
|
|
3
3
|
type Fr,
|
|
4
|
+
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
5
|
+
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX,
|
|
6
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
4
7
|
type MAX_NULLIFIERS_PER_TX,
|
|
5
8
|
type MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX,
|
|
6
9
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
7
|
-
type MAX_PUBLIC_DATA_HINTS,
|
|
8
10
|
type MAX_PUBLIC_DATA_READS_PER_TX,
|
|
9
11
|
type MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
10
12
|
MembershipWitness,
|
|
13
|
+
NOTE_HASH_TREE_HEIGHT,
|
|
11
14
|
NULLIFIER_TREE_HEIGHT,
|
|
12
15
|
type Nullifier,
|
|
13
16
|
PUBLIC_DATA_TREE_HEIGHT,
|
|
14
|
-
type PublicDataHint,
|
|
15
17
|
type PublicDataRead,
|
|
16
18
|
type PublicDataTreeLeafPreimage,
|
|
17
19
|
type PublicDataUpdateRequest,
|
|
18
20
|
type ScopedReadRequest,
|
|
21
|
+
type TreeLeafReadRequest,
|
|
22
|
+
TreeLeafReadRequestHint,
|
|
19
23
|
buildNullifierNonExistentReadRequestHints,
|
|
20
24
|
buildPublicDataHint,
|
|
21
25
|
buildPublicDataHints,
|
|
22
|
-
buildPublicDataReadRequestHints,
|
|
23
26
|
buildSiloedNullifierReadRequestHints,
|
|
24
27
|
} from '@aztec/circuits.js';
|
|
28
|
+
import { makeTuple } from '@aztec/foundation/array';
|
|
25
29
|
import { type Tuple } from '@aztec/foundation/serialize';
|
|
26
30
|
import { type MerkleTreeOperations } from '@aztec/world-state';
|
|
27
31
|
|
|
28
32
|
export class HintsBuilder {
|
|
29
33
|
constructor(private db: MerkleTreeOperations) {}
|
|
30
34
|
|
|
35
|
+
async getNoteHashReadRequestsHints(
|
|
36
|
+
readRequests: Tuple<TreeLeafReadRequest, typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX>,
|
|
37
|
+
) {
|
|
38
|
+
return await this.getTreeLeafReadRequestsHints(
|
|
39
|
+
readRequests,
|
|
40
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
41
|
+
NOTE_HASH_TREE_HEIGHT,
|
|
42
|
+
MerkleTreeId.NOTE_HASH_TREE,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
31
46
|
async getNullifierReadRequestHints(
|
|
32
47
|
nullifierReadRequests: Tuple<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
|
|
33
48
|
pendingNullifiers: Tuple<Nullifier, typeof MAX_NULLIFIERS_PER_TX>,
|
|
@@ -50,6 +65,17 @@ export class HintsBuilder {
|
|
|
50
65
|
return buildNullifierNonExistentReadRequestHints(this, nullifierNonExistentReadRequests, pendingNullifiers);
|
|
51
66
|
}
|
|
52
67
|
|
|
68
|
+
async getL1ToL2MsgReadRequestsHints(
|
|
69
|
+
readRequests: Tuple<TreeLeafReadRequest, typeof MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX>,
|
|
70
|
+
) {
|
|
71
|
+
return await this.getTreeLeafReadRequestsHints(
|
|
72
|
+
readRequests,
|
|
73
|
+
MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX,
|
|
74
|
+
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
75
|
+
MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
53
79
|
getPublicDataHints(
|
|
54
80
|
publicDataReads: Tuple<PublicDataRead, typeof MAX_PUBLIC_DATA_READS_PER_TX>,
|
|
55
81
|
publicDataUpdateRequests: Tuple<PublicDataUpdateRequest, typeof MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>,
|
|
@@ -62,14 +88,6 @@ export class HintsBuilder {
|
|
|
62
88
|
return buildPublicDataHint(this, slot);
|
|
63
89
|
}
|
|
64
90
|
|
|
65
|
-
getPublicDataReadRequestHints(
|
|
66
|
-
publicDataReads: Tuple<PublicDataRead, typeof MAX_PUBLIC_DATA_READS_PER_TX>,
|
|
67
|
-
publicDataUpdateRequests: Tuple<PublicDataUpdateRequest, typeof MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>,
|
|
68
|
-
publicDataHints: Tuple<PublicDataHint, typeof MAX_PUBLIC_DATA_HINTS>,
|
|
69
|
-
) {
|
|
70
|
-
return buildPublicDataReadRequestHints(publicDataReads, publicDataUpdateRequests, publicDataHints);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
91
|
async getNullifierMembershipWitness(nullifier: Fr) {
|
|
74
92
|
const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
75
93
|
if (index === undefined) {
|
|
@@ -120,8 +138,8 @@ export class HintsBuilder {
|
|
|
120
138
|
treeHeight: TREE_HEIGHT,
|
|
121
139
|
index: bigint,
|
|
122
140
|
) {
|
|
123
|
-
const siblingPath = await this.db.getSiblingPath(treeId, index);
|
|
124
|
-
const membershipWitness = new MembershipWitness
|
|
141
|
+
const siblingPath = await this.db.getSiblingPath<TREE_HEIGHT>(treeId, index);
|
|
142
|
+
const membershipWitness = new MembershipWitness(treeHeight, index, siblingPath.toTuple());
|
|
125
143
|
|
|
126
144
|
const leafPreimage = await this.db.getLeafPreimage(treeId, index);
|
|
127
145
|
if (!leafPreimage) {
|
|
@@ -130,4 +148,21 @@ export class HintsBuilder {
|
|
|
130
148
|
|
|
131
149
|
return { membershipWitness, leafPreimage };
|
|
132
150
|
}
|
|
151
|
+
|
|
152
|
+
private async getTreeLeafReadRequestsHints<N extends number, TREE_HEIGHT extends number>(
|
|
153
|
+
readRequests: Tuple<TreeLeafReadRequest, N>,
|
|
154
|
+
size: N,
|
|
155
|
+
treeHeight: TREE_HEIGHT,
|
|
156
|
+
treeId: MerkleTreeId,
|
|
157
|
+
): Promise<Tuple<TreeLeafReadRequestHint<TREE_HEIGHT>, N>> {
|
|
158
|
+
const hints = makeTuple(size, () => TreeLeafReadRequestHint.empty(treeHeight));
|
|
159
|
+
for (let i = 0; i < readRequests.length; i++) {
|
|
160
|
+
const request = readRequests[i];
|
|
161
|
+
if (!request.isEmpty()) {
|
|
162
|
+
const siblingPath = await this.db.getSiblingPath<typeof treeHeight>(treeId, request.leafIndex.toBigInt());
|
|
163
|
+
hints[i] = new TreeLeafReadRequestHint(treeHeight, siblingPath.toTuple());
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return hints;
|
|
167
|
+
}
|
|
133
168
|
}
|
|
@@ -308,6 +308,17 @@ export class WorldStateDB implements CommitmentsDB {
|
|
|
308
308
|
return index;
|
|
309
309
|
}
|
|
310
310
|
|
|
311
|
+
public async getCommitmentValue(leafIndex: bigint): Promise<Fr | undefined> {
|
|
312
|
+
const timer = new Timer();
|
|
313
|
+
const leafValue = await this.db.getLeafValue(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
|
|
314
|
+
this.log.debug(`[DB] Fetched commitment leaf value`, {
|
|
315
|
+
eventName: 'public-db-access',
|
|
316
|
+
duration: timer.ms(),
|
|
317
|
+
operation: 'get-commitment-leaf-value',
|
|
318
|
+
} satisfies PublicDBAccessStats);
|
|
319
|
+
return leafValue;
|
|
320
|
+
}
|
|
321
|
+
|
|
311
322
|
public async getNullifierIndex(nullifier: Fr): Promise<bigint | undefined> {
|
|
312
323
|
const timer = new Timer();
|
|
313
324
|
const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
Nullifier,
|
|
17
17
|
type PublicCallRequest,
|
|
18
18
|
ReadRequest,
|
|
19
|
+
TreeLeafReadRequest,
|
|
19
20
|
} from '@aztec/circuits.js';
|
|
20
21
|
import { Fr } from '@aztec/foundation/fields';
|
|
21
22
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
@@ -38,14 +39,14 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
38
39
|
private contractStorageReads: ContractStorageRead[] = [];
|
|
39
40
|
private contractStorageUpdateRequests: ContractStorageUpdateRequest[] = [];
|
|
40
41
|
|
|
41
|
-
private noteHashReadRequests:
|
|
42
|
+
private noteHashReadRequests: TreeLeafReadRequest[] = [];
|
|
42
43
|
private noteHashes: NoteHash[] = [];
|
|
43
44
|
|
|
44
45
|
private nullifierReadRequests: ReadRequest[] = [];
|
|
45
46
|
private nullifierNonExistentReadRequests: ReadRequest[] = [];
|
|
46
47
|
private nullifiers: Nullifier[] = [];
|
|
47
48
|
|
|
48
|
-
private l1ToL2MsgReadRequests:
|
|
49
|
+
private l1ToL2MsgReadRequests: TreeLeafReadRequest[] = [];
|
|
49
50
|
private newL2ToL1Messages: L2ToL1Message[] = [];
|
|
50
51
|
|
|
51
52
|
private unencryptedLogs: UnencryptedL2Log[] = [];
|
|
@@ -104,17 +105,16 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
104
105
|
this.incrementSideEffectCounter();
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
109
|
+
public traceNoteHashCheck(_storageAddress: Fr, noteHash: Fr, leafIndex: Fr, exists: boolean) {
|
|
108
110
|
// TODO(4805): check if some threshold is reached for max note hash checks
|
|
109
111
|
// NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
110
112
|
// TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel
|
|
111
113
|
// is in fact checking the leaf indicated by the user
|
|
112
|
-
this.noteHashReadRequests.push(new
|
|
114
|
+
this.noteHashReadRequests.push(new TreeLeafReadRequest(noteHash, leafIndex));
|
|
113
115
|
this.avmCircuitHints.noteHashExists.items.push(
|
|
114
|
-
new AvmKeyValueHint(/*key=*/ new Fr(
|
|
116
|
+
new AvmKeyValueHint(/*key=*/ new Fr(leafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO),
|
|
115
117
|
);
|
|
116
|
-
this.logger.debug(`NOTE_HASH_CHECK cnt: ${this.sideEffectCounter}`);
|
|
117
|
-
this.incrementSideEffectCounter();
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
public traceNewNoteHash(_storageAddress: Fr, noteHash: Fr) {
|
|
@@ -154,17 +154,16 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
154
154
|
this.incrementSideEffectCounter();
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
158
|
+
public traceL1ToL2MessageCheck(_contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr, exists: boolean) {
|
|
158
159
|
// TODO(4805): check if some threshold is reached for max message reads
|
|
159
160
|
// NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
160
161
|
// TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel
|
|
161
162
|
// is in fact checking the leaf indicated by the user
|
|
162
|
-
this.l1ToL2MsgReadRequests.push(new
|
|
163
|
+
this.l1ToL2MsgReadRequests.push(new TreeLeafReadRequest(msgHash, msgLeafIndex));
|
|
163
164
|
this.avmCircuitHints.l1ToL2MessageExists.items.push(
|
|
164
|
-
new AvmKeyValueHint(/*key=*/ new Fr(
|
|
165
|
+
new AvmKeyValueHint(/*key=*/ new Fr(msgLeafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO),
|
|
165
166
|
);
|
|
166
|
-
this.logger.debug(`L1_TO_L2_MSG_CHECK cnt: ${this.sideEffectCounter}`);
|
|
167
|
-
this.incrementSideEffectCounter();
|
|
168
167
|
}
|
|
169
168
|
|
|
170
169
|
public traceNewL2ToL1Message(recipient: Fr, content: Fr) {
|
|
@@ -77,6 +77,10 @@ export class TailPhaseManager extends AbstractPhaseManager {
|
|
|
77
77
|
|
|
78
78
|
const { validationRequests, endNonRevertibleData: nonRevertibleData, end: revertibleData } = previousOutput;
|
|
79
79
|
|
|
80
|
+
const noteHashReadRequestHints = await this.hintsBuilder.getNoteHashReadRequestsHints(
|
|
81
|
+
validationRequests.noteHashReadRequests,
|
|
82
|
+
);
|
|
83
|
+
|
|
80
84
|
const pendingNullifiers = mergeAccumulatedData(
|
|
81
85
|
nonRevertibleData.nullifiers,
|
|
82
86
|
revertibleData.nullifiers,
|
|
@@ -93,6 +97,10 @@ export class TailPhaseManager extends AbstractPhaseManager {
|
|
|
93
97
|
pendingNullifiers,
|
|
94
98
|
);
|
|
95
99
|
|
|
100
|
+
const l1ToL2MsgReadRequestHints = await this.hintsBuilder.getL1ToL2MsgReadRequestsHints(
|
|
101
|
+
validationRequests.l1ToL2MsgReadRequests,
|
|
102
|
+
);
|
|
103
|
+
|
|
96
104
|
const pendingPublicDataWrites = mergeAccumulatedData(
|
|
97
105
|
nonRevertibleData.publicDataUpdateRequests,
|
|
98
106
|
revertibleData.publicDataUpdateRequests,
|
|
@@ -104,20 +112,15 @@ export class TailPhaseManager extends AbstractPhaseManager {
|
|
|
104
112
|
pendingPublicDataWrites,
|
|
105
113
|
);
|
|
106
114
|
|
|
107
|
-
const publicDataReadRequestHints = this.hintsBuilder.getPublicDataReadRequestHints(
|
|
108
|
-
validationRequests.publicDataReads,
|
|
109
|
-
pendingPublicDataWrites,
|
|
110
|
-
publicDataHints,
|
|
111
|
-
);
|
|
112
|
-
|
|
113
115
|
const currentState = await this.db.getStateReference();
|
|
114
116
|
|
|
115
117
|
return new PublicKernelTailCircuitPrivateInputs(
|
|
116
118
|
previousKernel,
|
|
119
|
+
noteHashReadRequestHints,
|
|
117
120
|
nullifierReadRequestHints,
|
|
118
121
|
nullifierNonExistentReadRequestHints,
|
|
122
|
+
l1ToL2MsgReadRequestHints,
|
|
119
123
|
publicDataHints,
|
|
120
|
-
publicDataReadRequestHints,
|
|
121
124
|
currentState.partial,
|
|
122
125
|
);
|
|
123
126
|
}
|