@aztec/simulator 0.85.0 → 0.86.0-nightly.20250425
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/private/providers/acvm_native.d.ts +1 -1
- package/dest/private/providers/acvm_native.d.ts.map +1 -1
- package/dest/private/providers/acvm_native.js +4 -3
- package/dest/private/providers/acvm_wasm.d.ts +2 -1
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm.js +6 -1
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts +2 -1
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm_with_blobs.js +6 -1
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts +2 -1
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts.map +1 -1
- package/dest/private/providers/simulation_provider.d.ts +2 -1
- package/dest/private/providers/simulation_provider.d.ts.map +1 -1
- package/dest/public/avm/avm_context.d.ts +2 -2
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.d.ts +2 -1
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +2 -1
- package/dest/public/avm/avm_simulator_interface.d.ts +11 -0
- package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
- package/dest/public/avm/avm_simulator_interface.js +3 -0
- package/dest/public/avm/errors.d.ts +1 -16
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +0 -37
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/index.d.ts +2 -85
- package/dest/public/avm/fixtures/index.d.ts.map +1 -1
- package/dest/public/avm/fixtures/index.js +2 -174
- package/dest/public/avm/fixtures/initializers.d.ts +42 -0
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
- package/dest/public/avm/fixtures/initializers.js +42 -0
- package/dest/public/avm/fixtures/utils.d.ts +46 -0
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
- package/dest/public/avm/fixtures/utils.js +136 -0
- package/dest/public/avm/index.d.ts +0 -1
- package/dest/public/avm/index.d.ts.map +1 -1
- package/dest/public/avm/index.js +0 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +1 -1
- package/dest/public/avm/opcodes/external_calls.d.ts +3 -2
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +14 -9
- package/dest/public/avm/opcodes/instruction.d.ts +5 -5
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +6 -6
- package/dest/public/avm/revert_reason.d.ts +18 -0
- package/dest/public/avm/revert_reason.d.ts.map +1 -0
- package/dest/public/avm/revert_reason.js +38 -0
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +2 -4
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.js +70 -69
- package/dest/{common → public}/debug_fn_name.d.ts +1 -1
- package/dest/{common → public}/debug_fn_name.d.ts.map +1 -1
- package/dest/public/fixtures/index.d.ts +1 -0
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +1 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +3 -4
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +1 -1
- package/dest/public/hinting_db_sources.d.ts +15 -5
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +74 -29
- package/dest/public/index.d.ts +2 -6
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +2 -6
- package/dest/public/public_db_sources.d.ts +19 -52
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +96 -107
- package/dest/public/public_processor/public_processor.d.ts +8 -8
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +26 -28
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +3 -2
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +2 -2
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +3 -4
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +11 -21
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +5 -4
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +21 -10
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +3 -2
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +2 -2
- package/dest/public/side_effect_trace.d.ts +1 -3
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +3 -2
- package/dest/public/state_manager/state_manager.d.ts +6 -4
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +20 -41
- package/package.json +14 -16
- package/src/private/providers/acvm_native.ts +5 -4
- package/src/private/providers/acvm_wasm.ts +5 -2
- package/src/private/providers/acvm_wasm_with_blobs.ts +5 -3
- package/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +3 -2
- package/src/private/providers/simulation_provider.ts +2 -1
- package/src/public/avm/avm_context.ts +2 -2
- package/src/public/avm/avm_simulator.ts +4 -8
- package/src/public/avm/avm_simulator_interface.ts +8 -0
- package/src/public/avm/errors.ts +1 -53
- package/src/public/avm/fixtures/avm_simulation_tester.ts +1 -1
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +1 -1
- package/src/public/avm/fixtures/index.ts +2 -308
- package/src/public/avm/fixtures/initializers.ts +101 -0
- package/src/public/avm/fixtures/utils.ts +213 -0
- package/src/public/avm/index.ts +0 -1
- package/src/public/avm/opcodes/accrued_substate.ts +1 -5
- package/src/public/avm/opcodes/external_calls.ts +17 -11
- package/src/public/avm/opcodes/instruction.ts +9 -8
- package/src/public/avm/revert_reason.ts +55 -0
- package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
- package/src/{common → public}/debug_fn_name.ts +1 -1
- package/src/public/fixtures/index.ts +1 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +3 -5
- package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +1 -1
- package/src/public/hinting_db_sources.ts +113 -41
- package/src/public/index.ts +2 -6
- package/src/public/public_db_sources.ts +111 -164
- package/src/public/public_processor/public_processor.ts +29 -31
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +4 -3
- package/src/public/public_tx_simulator/public_tx_context.ts +10 -47
- package/src/public/public_tx_simulator/public_tx_simulator.ts +25 -10
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +4 -3
- package/src/public/side_effect_trace.ts +2 -4
- package/src/public/state_manager/state_manager.ts +24 -50
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- /package/dest/{common → public}/debug_fn_name.js +0 -0
- /package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hinting_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/hinting_db_sources.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAOL,KAAK,iBAAiB,EASvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAEL,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"hinting_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/hinting_db_sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { AvmAppendLeavesHint, AvmBytecodeCommitmentHint, AvmCommitCheckpointHint, AvmContractClassHint, AvmContractInstanceHint, AvmCreateCheckpointHint, AvmGetLeafPreimageHintNullifierTree, AvmGetLeafPreimageHintPublicDataTree, AvmGetLeafValueHint, AvmGetPreviousValueIndexHint, AvmGetSiblingPathHint, AvmRevertCheckpointHint, AvmSequentialInsertHintNullifierTree, AvmSequentialInsertHintPublicDataTree } from '@aztec/stdlib/avm';
|
|
5
5
|
import { AppendOnlyTreeSnapshot, MerkleTreeId, NullifierLeaf, PublicDataTreeLeaf, getTreeName, merkleTreeIds } from '@aztec/stdlib/trees';
|
|
6
|
+
import { TreeSnapshots } from '@aztec/stdlib/tx';
|
|
6
7
|
import { strict as assert } from 'assert';
|
|
7
|
-
import { PublicTreesDB } from './public_db_sources.js';
|
|
8
8
|
/**
|
|
9
9
|
* A public contracts database that forwards requests and collects AVM hints.
|
|
10
10
|
*/ export class HintingPublicContractsDB {
|
|
@@ -41,10 +41,11 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
* A
|
|
45
|
-
*/ export class
|
|
44
|
+
* A low-level merkle DB that collects hints.
|
|
45
|
+
*/ export class HintingMerkleWriteOperations {
|
|
46
|
+
db;
|
|
46
47
|
hints;
|
|
47
|
-
static log = createLogger('
|
|
48
|
+
static log = createLogger('simulator:hinting-merkle-db');
|
|
48
49
|
// This stack is only for debugging purposes.
|
|
49
50
|
// The top of the stack is the current checkpoint id.
|
|
50
51
|
// We need the stack to be non-empty and use 0 as an arbitrary initial checkpoint id.
|
|
@@ -52,20 +53,31 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
52
53
|
checkpointStack;
|
|
53
54
|
nextCheckpointId;
|
|
54
55
|
checkpointActionCounter;
|
|
56
|
+
static async create(db, hints) {
|
|
57
|
+
const hintingTreesDB = new HintingMerkleWriteOperations(db, hints);
|
|
58
|
+
const startStateReference = await db.getStateReference();
|
|
59
|
+
hints.startingTreeRoots = new TreeSnapshots(startStateReference.l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
|
|
60
|
+
return hintingTreesDB;
|
|
61
|
+
}
|
|
62
|
+
// Use create() to instantiate.
|
|
55
63
|
constructor(db, hints){
|
|
56
|
-
|
|
64
|
+
this.db = db;
|
|
65
|
+
this.hints = hints;
|
|
66
|
+
this.checkpointStack = [
|
|
57
67
|
0
|
|
58
|
-
]
|
|
68
|
+
];
|
|
69
|
+
this.nextCheckpointId = 1;
|
|
70
|
+
this.checkpointActionCounter = 0;
|
|
59
71
|
}
|
|
60
72
|
// Getters.
|
|
61
73
|
async getSiblingPath(treeId, index) {
|
|
62
|
-
const path = await
|
|
74
|
+
const path = await this.db.getSiblingPath(treeId, index);
|
|
63
75
|
const key = await this.getHintKey(treeId);
|
|
64
76
|
this.hints.getSiblingPathHints.push(new AvmGetSiblingPathHint(key, treeId, index, path.toFields()));
|
|
65
77
|
return Promise.resolve(path);
|
|
66
78
|
}
|
|
67
79
|
async getPreviousValueIndex(treeId, value) {
|
|
68
|
-
const result = await
|
|
80
|
+
const result = await this.db.getPreviousValueIndex(treeId, value);
|
|
69
81
|
if (result === undefined) {
|
|
70
82
|
throw new Error(`getPreviousValueIndex(${getTreeName(treeId)}, ${value}}) returned undefined. Possible wrong tree setup or corrupted state.`);
|
|
71
83
|
}
|
|
@@ -74,7 +86,7 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
74
86
|
return result;
|
|
75
87
|
}
|
|
76
88
|
async getLeafPreimage(treeId, index) {
|
|
77
|
-
const preimage = await
|
|
89
|
+
const preimage = await this.db.getLeafPreimage(treeId, index);
|
|
78
90
|
if (preimage) {
|
|
79
91
|
const key = await this.getHintKey(treeId);
|
|
80
92
|
switch(treeId){
|
|
@@ -95,7 +107,7 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
95
107
|
async getLeafValue(treeId, index) {
|
|
96
108
|
// Use getLeafPreimage for PublicDataTree and NullifierTree.
|
|
97
109
|
assert(treeId == MerkleTreeId.NOTE_HASH_TREE || treeId == MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
98
|
-
const value = await
|
|
110
|
+
const value = await this.db.getLeafValue(treeId, index);
|
|
99
111
|
if (value) {
|
|
100
112
|
const key = await this.getHintKey(treeId);
|
|
101
113
|
// We can cast to Fr because we know the type of the tree.
|
|
@@ -112,10 +124,9 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
112
124
|
// We only support 1 leaf at a time for now. Can easily be extended.
|
|
113
125
|
assert(leaves.length === 1, 'sequentialInsert supports only one leaf at a time!');
|
|
114
126
|
const beforeState = await this.getHintKey(treeId);
|
|
115
|
-
const result = await
|
|
127
|
+
const result = await this.db.sequentialInsert(treeId, leaves);
|
|
116
128
|
const afterState = await this.getHintKey(treeId);
|
|
117
|
-
|
|
118
|
-
HintingPublicTreesDB.logTreeChange(beforeState, afterState, treeId);
|
|
129
|
+
HintingMerkleWriteOperations.logTreeChange('sequentialInsert', beforeState, afterState, treeId);
|
|
119
130
|
switch(treeId){
|
|
120
131
|
case MerkleTreeId.PUBLIC_DATA_TREE:
|
|
121
132
|
this.hints.sequentialInsertHintsPublicDataTree.push(new AvmSequentialInsertHintPublicDataTree(beforeState, afterState, treeId, PublicDataTreeLeaf.fromBuffer(leaves[0]), {
|
|
@@ -150,29 +161,36 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
150
161
|
assert(treeId == MerkleTreeId.NOTE_HASH_TREE || treeId == MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
151
162
|
// We need to process each leaf individually because we need the sibling path after insertion, to be able to constraint the insertion.
|
|
152
163
|
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/13380): This can be changed if the world state appendLeaves returns the sibling paths.
|
|
153
|
-
|
|
154
|
-
await this.appendLeafInternal(treeId,
|
|
164
|
+
if (leaves.length === 1) {
|
|
165
|
+
await this.appendLeafInternal(treeId, leaves[0]);
|
|
166
|
+
return;
|
|
167
|
+
} else {
|
|
168
|
+
// TODO(dbanks12): NON-HINTING! We skip hinting here for now because:
|
|
169
|
+
// 1. We only ever append multiple leaves (for now) when padding (all empty leaves).
|
|
170
|
+
// 2. We don't need hints per-item when padding.
|
|
171
|
+
// 3. In order to get per-item hints today, you need to append one-at-a-time (mentioned above), which is VERY slow.
|
|
172
|
+
await this.db.appendLeaves(treeId, leaves);
|
|
155
173
|
}
|
|
156
174
|
}
|
|
157
175
|
async createCheckpoint() {
|
|
158
176
|
const actionCounter = this.checkpointActionCounter++;
|
|
159
177
|
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
160
178
|
const treesStateHash = await this.getTreesStateHash();
|
|
161
|
-
await
|
|
179
|
+
await this.db.createCheckpoint();
|
|
162
180
|
this.checkpointStack.push(this.nextCheckpointId++);
|
|
163
181
|
const newCheckpointId = this.getCurrentCheckpointId();
|
|
164
182
|
this.hints.createCheckpointHints.push(new AvmCreateCheckpointHint(actionCounter, oldCheckpointId, newCheckpointId));
|
|
165
|
-
|
|
183
|
+
HintingMerkleWriteOperations.log.trace(`[createCheckpoint:${actionCounter}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId} at trees state ${treesStateHash}.`);
|
|
166
184
|
}
|
|
167
185
|
async commitCheckpoint() {
|
|
168
186
|
const actionCounter = this.checkpointActionCounter++;
|
|
169
187
|
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
170
188
|
const treesStateHash = await this.getTreesStateHash();
|
|
171
|
-
await
|
|
189
|
+
await this.db.commitCheckpoint();
|
|
172
190
|
this.checkpointStack.pop();
|
|
173
191
|
const newCheckpointId = this.getCurrentCheckpointId();
|
|
174
192
|
this.hints.commitCheckpointHints.push(new AvmCommitCheckpointHint(actionCounter, oldCheckpointId, newCheckpointId));
|
|
175
|
-
|
|
193
|
+
HintingMerkleWriteOperations.log.trace(`[commitCheckpoint:${actionCounter}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId} at trees state ${treesStateHash}.`);
|
|
176
194
|
}
|
|
177
195
|
async revertCheckpoint() {
|
|
178
196
|
const actionCounter = this.checkpointActionCounter++;
|
|
@@ -185,7 +203,7 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
185
203
|
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: await this.getHintKey(MerkleTreeId.L1_TO_L2_MESSAGE_TREE),
|
|
186
204
|
[MerkleTreeId.ARCHIVE]: await this.getHintKey(MerkleTreeId.ARCHIVE)
|
|
187
205
|
};
|
|
188
|
-
await
|
|
206
|
+
await this.db.revertCheckpoint();
|
|
189
207
|
this.checkpointStack.pop();
|
|
190
208
|
const newCheckpointId = this.getCurrentCheckpointId();
|
|
191
209
|
const afterState = {
|
|
@@ -196,14 +214,14 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
196
214
|
[MerkleTreeId.ARCHIVE]: await this.getHintKey(MerkleTreeId.ARCHIVE)
|
|
197
215
|
};
|
|
198
216
|
this.hints.revertCheckpointHints.push(AvmRevertCheckpointHint.create(actionCounter, oldCheckpointId, newCheckpointId, beforeState, afterState));
|
|
199
|
-
|
|
217
|
+
HintingMerkleWriteOperations.log.trace(`[revertCheckpoint:${actionCounter}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId} at trees state ${treesStateHash}.`);
|
|
200
218
|
for (const treeId of merkleTreeIds()){
|
|
201
|
-
|
|
219
|
+
HintingMerkleWriteOperations.logTreeChange('revertCheckpoint', beforeState[treeId], afterState[treeId], treeId);
|
|
202
220
|
}
|
|
203
221
|
}
|
|
204
222
|
// Private methods.
|
|
205
223
|
async getHintKey(treeId) {
|
|
206
|
-
const treeInfo = await
|
|
224
|
+
const treeInfo = await this.db.getTreeInfo(treeId);
|
|
207
225
|
return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
|
|
208
226
|
}
|
|
209
227
|
getCurrentCheckpointId() {
|
|
@@ -211,26 +229,53 @@ import { PublicTreesDB } from './public_db_sources.js';
|
|
|
211
229
|
}
|
|
212
230
|
// For logging/debugging purposes.
|
|
213
231
|
async getTreesStateHash() {
|
|
214
|
-
const stateReferenceFields = (await
|
|
232
|
+
const stateReferenceFields = (await this.db.getStateReference()).toFields();
|
|
215
233
|
return Fr.fromBuffer(sha256Trunc(Buffer.concat(stateReferenceFields.map((field)=>field.toBuffer()))));
|
|
216
234
|
}
|
|
217
|
-
static logTreeChange(beforeState, afterState, treeId) {
|
|
235
|
+
static logTreeChange(action, beforeState, afterState, treeId) {
|
|
218
236
|
const treeName = getTreeName(treeId);
|
|
219
|
-
|
|
237
|
+
HintingMerkleWriteOperations.log.trace(`[${action}] ${treeName} tree state: ${beforeState.root}, ${beforeState.nextAvailableLeafIndex} -> ${afterState.root}, ${afterState.nextAvailableLeafIndex}.`);
|
|
220
238
|
}
|
|
221
239
|
async appendLeafInternal(treeId, leaf) {
|
|
222
240
|
// Use sequentialInsert for PublicDataTree and NullifierTree.
|
|
223
241
|
assert(treeId == MerkleTreeId.NOTE_HASH_TREE || treeId == MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
224
242
|
const beforeState = await this.getHintKey(treeId);
|
|
225
|
-
await
|
|
243
|
+
await this.db.appendLeaves(treeId, [
|
|
226
244
|
leaf
|
|
227
245
|
]);
|
|
228
246
|
const afterState = await this.getHintKey(treeId);
|
|
229
|
-
|
|
230
|
-
HintingPublicTreesDB.logTreeChange(beforeState, afterState, treeId);
|
|
247
|
+
HintingMerkleWriteOperations.logTreeChange('appendLeaves', beforeState, afterState, treeId);
|
|
231
248
|
this.hints.appendLeavesHints.push(new AvmAppendLeavesHint(beforeState, afterState, treeId, [
|
|
232
249
|
leaf
|
|
233
250
|
]));
|
|
234
251
|
return await this.getSiblingPath(treeId, BigInt(beforeState.nextAvailableLeafIndex));
|
|
235
252
|
}
|
|
253
|
+
// Non-hinted required methods from MerkleTreeWriteOperations interface
|
|
254
|
+
async getTreeInfo(treeId) {
|
|
255
|
+
return await this.db.getTreeInfo(treeId);
|
|
256
|
+
}
|
|
257
|
+
async getStateReference() {
|
|
258
|
+
return await this.db.getStateReference();
|
|
259
|
+
}
|
|
260
|
+
getInitialHeader() {
|
|
261
|
+
return this.db.getInitialHeader();
|
|
262
|
+
}
|
|
263
|
+
async updateArchive(header) {
|
|
264
|
+
return await this.db.updateArchive(header);
|
|
265
|
+
}
|
|
266
|
+
async batchInsert(treeId, leaves, subtreeHeight) {
|
|
267
|
+
return await this.db.batchInsert(treeId, leaves, subtreeHeight);
|
|
268
|
+
}
|
|
269
|
+
async close() {
|
|
270
|
+
return await this.db.close();
|
|
271
|
+
}
|
|
272
|
+
async findLeafIndices(treeId, values) {
|
|
273
|
+
return await this.db.findLeafIndices(treeId, values);
|
|
274
|
+
}
|
|
275
|
+
async findLeafIndicesAfter(treeId, values, startIndex) {
|
|
276
|
+
return await this.db.findLeafIndicesAfter(treeId, values, startIndex);
|
|
277
|
+
}
|
|
278
|
+
async getBlockNumbersForLeafIndices(treeId, leafIndices) {
|
|
279
|
+
return await this.db.getBlockNumbersForLeafIndices(treeId, leafIndices);
|
|
280
|
+
}
|
|
236
281
|
}
|
package/dest/public/index.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export * from './public_db_sources.js';
|
|
1
|
+
export { PublicContractsDB } from './public_db_sources.js';
|
|
2
|
+
export { type PublicTxResult, PublicTxSimulator, TelemetryPublicTxSimulator } from './public_tx_simulator/index.js';
|
|
4
3
|
export { PublicProcessor, PublicProcessorFactory } from './public_processor/public_processor.js';
|
|
5
|
-
export { SideEffectTrace } from './side_effect_trace.js';
|
|
6
|
-
export { PublicTxSimulationTester } from './fixtures/index.js';
|
|
7
|
-
export * from './avm/index.js';
|
|
8
4
|
export { getCallRequestsWithCalldataByPhase } from './utils.js';
|
|
9
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/public/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/public/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,kCAAkC,EAAE,MAAM,YAAY,CAAC"}
|
package/dest/public/index.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export * from './public_db_sources.js';
|
|
1
|
+
export { PublicContractsDB } from './public_db_sources.js';
|
|
2
|
+
export { PublicTxSimulator, TelemetryPublicTxSimulator } from './public_tx_simulator/index.js';
|
|
4
3
|
export { PublicProcessor, PublicProcessorFactory } from './public_processor/public_processor.js';
|
|
5
|
-
export { SideEffectTrace } from './side_effect_trace.js';
|
|
6
|
-
export { PublicTxSimulationTester } from './fixtures/index.js';
|
|
7
|
-
export * from './avm/index.js';
|
|
8
4
|
export { getCallRequestsWithCalldataByPhase } from './utils.js';
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
-
import type { IndexedTreeLeafPreimage, SiblingPath } from '@aztec/foundation/trees';
|
|
5
2
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
6
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
4
|
import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
8
|
-
import type {
|
|
5
|
+
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
9
6
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
10
|
-
import
|
|
7
|
+
import { TreeSnapshots, type Tx } from '@aztec/stdlib/tx';
|
|
11
8
|
import type { PublicContractsDBInterface, PublicStateDBInterface } from './db_interfaces.js';
|
|
12
9
|
/**
|
|
13
10
|
* Implements the PublicContractsDBInterface using a ContractDataSource.
|
|
@@ -91,62 +88,32 @@ export declare class PublicContractsDB implements PublicContractsDBInterface {
|
|
|
91
88
|
getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
|
|
92
89
|
}
|
|
93
90
|
/**
|
|
94
|
-
*
|
|
91
|
+
* A high-level class that provides access to the merkle trees.
|
|
95
92
|
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
getStateReference(): Promise<StateReference>;
|
|
105
|
-
getInitialHeader(): BlockHeader;
|
|
106
|
-
getSiblingPath<N extends number>(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<N>>;
|
|
107
|
-
getPreviousValueIndex<ID extends IndexedTreeId>(treeId: ID, value: bigint): Promise<{
|
|
108
|
-
index: bigint;
|
|
109
|
-
alreadyPresent: boolean;
|
|
110
|
-
} | undefined>;
|
|
111
|
-
getLeafPreimage<ID extends IndexedTreeId>(treeId: ID, index: bigint): Promise<IndexedTreeLeafPreimage | undefined>;
|
|
112
|
-
findLeafIndices<ID extends MerkleTreeId>(treeId: ID, values: MerkleTreeLeafType<ID>[]): Promise<(bigint | undefined)[]>;
|
|
113
|
-
findLeafIndicesAfter<ID extends MerkleTreeId>(treeId: ID, values: MerkleTreeLeafType<ID>[], startIndex: bigint): Promise<(bigint | undefined)[]>;
|
|
114
|
-
getLeafValue<ID extends MerkleTreeId>(treeId: ID, index: bigint): Promise<MerkleTreeLeafType<typeof treeId> | undefined>;
|
|
115
|
-
getBlockNumbersForLeafIndices<ID extends MerkleTreeId>(treeId: ID, leafIndices: bigint[]): Promise<(bigint | undefined)[]>;
|
|
116
|
-
createCheckpoint(): Promise<void>;
|
|
117
|
-
commitCheckpoint(): Promise<void>;
|
|
118
|
-
revertCheckpoint(): Promise<void>;
|
|
119
|
-
appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<ID>[]): Promise<void>;
|
|
120
|
-
updateArchive(header: BlockHeader): Promise<void>;
|
|
121
|
-
batchInsert<TreeHeight extends number, SubtreeSiblingPathHeight extends number, ID extends IndexedTreeId>(treeId: ID, leaves: Buffer[], subtreeHeight: number): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>>;
|
|
122
|
-
sequentialInsert<TreeHeight extends number, ID extends IndexedTreeId>(treeId: ID, leaves: Buffer[]): Promise<SequentialInsertionResult<TreeHeight>>;
|
|
123
|
-
close(): Promise<void>;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* A class that provides access to the merkle trees, and other helper methods.
|
|
93
|
+
* This class is just a helper wrapper around a merkle db. Anything that you can do with it
|
|
94
|
+
* can also be done directly with the merkle db. This class should NOT be exposed or used
|
|
95
|
+
* outside of `simulator/src/public`.
|
|
96
|
+
*
|
|
97
|
+
* NOTE: This class is currently written in such a way that it would generate the
|
|
98
|
+
* necessary hints if used with a hinting merkle db. This is a bit of a leak of concepts.
|
|
99
|
+
* Eventually we can have everything depend on a config/factory at the TxSimulator level
|
|
100
|
+
* to decide whether to use hints or not (same with tracing, etc).
|
|
127
101
|
*/
|
|
128
|
-
export declare class PublicTreesDB
|
|
102
|
+
export declare class PublicTreesDB implements PublicStateDBInterface {
|
|
103
|
+
private readonly db;
|
|
129
104
|
private logger;
|
|
130
105
|
constructor(db: MerkleTreeWriteOperations);
|
|
131
|
-
/**
|
|
132
|
-
* Reads a value from public storage, returning zero if none.
|
|
133
|
-
* @param contract - Owner of the storage.
|
|
134
|
-
* @param slot - Slot to read in the contract storage.
|
|
135
|
-
* @returns The current value in the storage slot.
|
|
136
|
-
*/
|
|
137
106
|
storageRead(contract: AztecAddress, slot: Fr): Promise<Fr>;
|
|
138
|
-
/**
|
|
139
|
-
* Records a write to public storage.
|
|
140
|
-
* @param contract - Owner of the storage.
|
|
141
|
-
* @param slot - Slot to read in the contract storage.
|
|
142
|
-
* @param newValue - The new value to store.
|
|
143
|
-
* @returns The slot of the written leaf in the public data tree.
|
|
144
|
-
*/
|
|
145
107
|
storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<void>;
|
|
146
108
|
getL1ToL2LeafValue(leafIndex: bigint): Promise<Fr | undefined>;
|
|
147
109
|
getNoteHash(leafIndex: bigint): Promise<Fr | undefined>;
|
|
110
|
+
writeNoteHash(noteHash: Fr): Promise<void>;
|
|
148
111
|
checkNullifierExists(nullifier: Fr): Promise<boolean>;
|
|
112
|
+
writeNullifier(siloedNullifier: Fr): Promise<void>;
|
|
149
113
|
padTree(treeId: MerkleTreeId, leavesToInsert: number): Promise<void>;
|
|
114
|
+
createCheckpoint(): Promise<void>;
|
|
115
|
+
commitCheckpoint(): Promise<void>;
|
|
116
|
+
revertCheckpoint(): Promise<void>;
|
|
117
|
+
getTreeSnapshots(): Promise<TreeSnapshots>;
|
|
150
118
|
}
|
|
151
|
-
export {};
|
|
152
119
|
//# sourceMappingURL=public_db_sources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/public_db_sources.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/public_db_sources.ts"],"names":[],"mappings":"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"}
|