@aztec/aztec-node 0.16.1 → 0.16.3
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/aztec-node/http_rpc_server.js +3 -3
- package/dest/aztec-node/server.d.ts +61 -14
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +126 -28
- package/package.json +11 -11
- package/src/aztec-node/http_rpc_server.ts +2 -2
- package/src/aztec-node/server.ts +175 -27
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BlockHeader, FunctionSelector } from '@aztec/circuits.js';
|
|
2
2
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -18,7 +18,7 @@ export function createAztecNodeRpcServer(node) {
|
|
|
18
18
|
ContractData,
|
|
19
19
|
Fr,
|
|
20
20
|
FunctionSelector,
|
|
21
|
-
|
|
21
|
+
BlockHeader,
|
|
22
22
|
L2Block,
|
|
23
23
|
L2Tx,
|
|
24
24
|
LogId,
|
|
@@ -30,4 +30,4 @@ export function createAztecNodeRpcServer(node) {
|
|
|
30
30
|
['start', 'stop']);
|
|
31
31
|
return rpc;
|
|
32
32
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cF9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUVMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixPQUFPLEVBQ1AsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsV0FBVyxFQUNYLEVBQUUsRUFDRixNQUFNLEdBQ1AsTUFBTSxjQUFjLENBQUM7QUFFdEI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFlO0lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksYUFBYSxDQUMzQixJQUFJLEVBQ0o7UUFDRSxZQUFZO1FBQ1osVUFBVTtRQUNWLG9CQUFvQjtRQUNwQix3QkFBd0I7UUFDeEIsWUFBWTtRQUNaLEVBQUU7UUFDRixnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLE9BQU87UUFDUCxJQUFJO1FBQ0osS0FBSztRQUNMLE1BQU07UUFDTixXQUFXO1FBQ1gscUJBQXFCO0tBQ3RCLEVBQ0QsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQ3JCLEtBQUs7SUFDTCxzREFBc0Q7SUFDdEQsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQ2xCLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMifQ==
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { CONTRACT_TREE_HEIGHT, Fr,
|
|
1
|
+
import { BLOCKS_TREE_HEIGHT, BlockHeader, CONTRACT_TREE_HEIGHT, Fr, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/circuits.js';
|
|
2
2
|
import { L1ContractAddresses } from '@aztec/ethereum';
|
|
3
3
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
4
|
import { P2P } from '@aztec/p2p';
|
|
5
5
|
import { GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
|
|
6
|
-
import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, L2Tx, LogFilter, LogType, MerkleTreeId, SequencerConfig, SiblingPath, Tx, TxHash } from '@aztec/types';
|
|
6
|
+
import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, L2Tx, LogFilter, LogType, MerkleTreeId, NullifierMembershipWitness, SequencerConfig, SiblingPath, Tx, TxHash } from '@aztec/types';
|
|
7
7
|
import { WorldStateSynchronizer } from '@aztec/world-state';
|
|
8
8
|
import { LevelUp } from 'levelup';
|
|
9
9
|
import { AztecNodeConfig } from './config.js';
|
|
@@ -49,9 +49,9 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
49
49
|
*/
|
|
50
50
|
isReady(): Promise<boolean>;
|
|
51
51
|
/**
|
|
52
|
-
* Get
|
|
52
|
+
* Get a block specified by its number.
|
|
53
53
|
* @param number - The block number being requested.
|
|
54
|
-
* @returns The
|
|
54
|
+
* @returns The requested block.
|
|
55
55
|
*/
|
|
56
56
|
getBlock(number: number): Promise<L2Block | undefined>;
|
|
57
57
|
/**
|
|
@@ -126,23 +126,33 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
126
126
|
getPendingTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
127
127
|
/**
|
|
128
128
|
* Find the index of the given leaf in the given tree.
|
|
129
|
+
* @param blockNumber - The block number at which to get the data
|
|
129
130
|
* @param treeId - The tree to search in.
|
|
130
131
|
* @param leafValue - The value to search for
|
|
131
132
|
* @returns The index of the given leaf in the given tree or undefined if not found.
|
|
132
133
|
*/
|
|
133
|
-
findLeafIndex(treeId: MerkleTreeId, leafValue: Fr): Promise<bigint | undefined>;
|
|
134
|
+
findLeafIndex(blockNumber: number | 'latest', treeId: MerkleTreeId, leafValue: Fr): Promise<bigint | undefined>;
|
|
135
|
+
/**
|
|
136
|
+
* Returns a sibling path for the given index in the contract tree.
|
|
137
|
+
* @param blockNumber - The block number at which to get the data.
|
|
138
|
+
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
139
|
+
* @returns The sibling path for the leaf index.
|
|
140
|
+
*/
|
|
141
|
+
getContractSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>>;
|
|
134
142
|
/**
|
|
135
|
-
* Returns
|
|
143
|
+
* Returns a sibling path for the given index in the nullifier tree.
|
|
144
|
+
* @param blockNumber - The block number at which to get the data.
|
|
136
145
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
137
146
|
* @returns The sibling path for the leaf index.
|
|
138
147
|
*/
|
|
139
|
-
|
|
148
|
+
getNullifierTreeSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof NULLIFIER_TREE_HEIGHT>>;
|
|
140
149
|
/**
|
|
141
|
-
* Returns
|
|
150
|
+
* Returns a sibling path for the given index in the data tree.
|
|
151
|
+
* @param blockNumber - The block number at which to get the data.
|
|
142
152
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
143
153
|
* @returns The sibling path for the leaf index.
|
|
144
154
|
*/
|
|
145
|
-
getNoteHashSiblingPath(leafIndex: bigint): Promise<SiblingPath<typeof NOTE_HASH_TREE_HEIGHT>>;
|
|
155
|
+
getNoteHashSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof NOTE_HASH_TREE_HEIGHT>>;
|
|
146
156
|
/**
|
|
147
157
|
* Gets a confirmed/consumed L1 to L2 message for the given message key
|
|
148
158
|
* and its index in the merkle tree.
|
|
@@ -151,11 +161,48 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
151
161
|
*/
|
|
152
162
|
getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex>;
|
|
153
163
|
/**
|
|
154
|
-
* Returns
|
|
164
|
+
* Returns a sibling path for a leaf in the committed l1 to l2 data tree.
|
|
165
|
+
* @param blockNumber - The block number at which to get the data.
|
|
166
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
167
|
+
* @returns The sibling path.
|
|
168
|
+
*/
|
|
169
|
+
getL1ToL2MessageSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>>;
|
|
170
|
+
/**
|
|
171
|
+
* Returns a sibling path for a leaf in the committed blocks tree.
|
|
172
|
+
* @param blockNumber - The block number at which to get the data.
|
|
155
173
|
* @param leafIndex - Index of the leaf in the tree.
|
|
156
174
|
* @returns The sibling path.
|
|
157
175
|
*/
|
|
158
|
-
|
|
176
|
+
getBlocksTreeSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof BLOCKS_TREE_HEIGHT>>;
|
|
177
|
+
/**
|
|
178
|
+
* Returns a sibling path for a leaf in the committed public data tree.
|
|
179
|
+
* @param blockNumber - The block number at which to get the data.
|
|
180
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
181
|
+
* @returns The sibling path.
|
|
182
|
+
*/
|
|
183
|
+
getPublicDataTreeSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof PUBLIC_DATA_TREE_HEIGHT>>;
|
|
184
|
+
/**
|
|
185
|
+
* Returns a nullifier membership witness for a given nullifier at a given block.
|
|
186
|
+
* @param blockNumber - The block number at which to get the index.
|
|
187
|
+
* @param nullifier - Nullifier we try to find witness for.
|
|
188
|
+
* @returns The nullifier membership witness (if found).
|
|
189
|
+
*/
|
|
190
|
+
getNullifierMembershipWitness(blockNumber: number | 'latest', nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
|
|
191
|
+
/**
|
|
192
|
+
* Returns a low nullifier membership witness for a given nullifier at a given block.
|
|
193
|
+
* @param blockNumber - The block number at which to get the index.
|
|
194
|
+
* @param nullifier - Nullifier we try to find the low nullifier witness for.
|
|
195
|
+
* @returns The low nullifier membership witness (if found).
|
|
196
|
+
* @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
|
|
197
|
+
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
198
|
+
* we are trying to prove non-inclusion for.
|
|
199
|
+
*
|
|
200
|
+
* Note: This function returns the membership witness of the nullifier itself and not the low nullifier when
|
|
201
|
+
* the nullifier already exists in the tree. This is because the `getPreviousValueIndex` function returns the
|
|
202
|
+
* index of the nullifier itself when it already exists in the tree.
|
|
203
|
+
* TODO: This is a confusing behavior and we should eventually address that.
|
|
204
|
+
*/
|
|
205
|
+
getLowNullifierMembershipWitness(blockNumber: number | 'latest', nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
|
|
159
206
|
/**
|
|
160
207
|
* Gets the storage value at the given contract storage slot.
|
|
161
208
|
*
|
|
@@ -173,10 +220,10 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
173
220
|
*/
|
|
174
221
|
getTreeRoots(): Promise<Record<MerkleTreeId, Fr>>;
|
|
175
222
|
/**
|
|
176
|
-
* Returns the currently committed
|
|
177
|
-
* @returns The current committed block
|
|
223
|
+
* Returns the currently committed block header.
|
|
224
|
+
* @returns The current committed block header.
|
|
178
225
|
*/
|
|
179
|
-
|
|
226
|
+
getBlockHeader(): Promise<BlockHeader>;
|
|
180
227
|
/**
|
|
181
228
|
* Simulates the public part of a transaction with the current state.
|
|
182
229
|
* @param tx - The transaction to simulate.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,EAAE,EAEF,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
var _AztecNodeService_instances, _AztecNodeService_getWorldState, _AztecNodeService_syncWorldState;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { Archiver, LMDBArchiverStore } from '@aztec/archiver';
|
|
4
|
-
import { Fr, GlobalVariables,
|
|
4
|
+
import { BlockHeader, Fr, GlobalVariables, } from '@aztec/circuits.js';
|
|
5
5
|
import { computeGlobalsHash, computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
|
|
6
6
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
7
7
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { InMemoryTxPool, createP2PClient } from '@aztec/p2p';
|
|
9
9
|
import { PublicProcessorFactory, SequencerClient, getGlobalVariableBuilder, } from '@aztec/sequencer-client';
|
|
10
|
-
import { L1ToL2MessageAndIndex, LogType, MerkleTreeId, } from '@aztec/types';
|
|
10
|
+
import { INITIAL_L2_BLOCK_NUM, L1ToL2MessageAndIndex, LogType, MerkleTreeId, NullifierMembershipWitness, } from '@aztec/types';
|
|
11
11
|
import { MerkleTrees, ServerWorldStateSynchronizer, getConfigEnvVars as getWorldStateConfig, } from '@aztec/world-state';
|
|
12
12
|
import { openDb } from './db.js';
|
|
13
13
|
/**
|
|
@@ -93,9 +93,9 @@ export class AztecNodeService {
|
|
|
93
93
|
return (await this.p2pClient.isReady()) ?? false;
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
96
|
-
* Get
|
|
96
|
+
* Get a block specified by its number.
|
|
97
97
|
* @param number - The block number being requested.
|
|
98
|
-
* @returns The
|
|
98
|
+
* @returns The requested block.
|
|
99
99
|
*/
|
|
100
100
|
async getBlock(number) {
|
|
101
101
|
return await this.blockSource.getBlock(number);
|
|
@@ -205,30 +205,43 @@ export class AztecNodeService {
|
|
|
205
205
|
}
|
|
206
206
|
/**
|
|
207
207
|
* Find the index of the given leaf in the given tree.
|
|
208
|
+
* @param blockNumber - The block number at which to get the data
|
|
208
209
|
* @param treeId - The tree to search in.
|
|
209
210
|
* @param leafValue - The value to search for
|
|
210
211
|
* @returns The index of the given leaf in the given tree or undefined if not found.
|
|
211
212
|
*/
|
|
212
|
-
async findLeafIndex(treeId, leafValue) {
|
|
213
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
213
|
+
async findLeafIndex(blockNumber, treeId, leafValue) {
|
|
214
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
214
215
|
return committedDb.findLeafIndex(treeId, leafValue.toBuffer());
|
|
215
216
|
}
|
|
216
217
|
/**
|
|
217
|
-
* Returns
|
|
218
|
+
* Returns a sibling path for the given index in the contract tree.
|
|
219
|
+
* @param blockNumber - The block number at which to get the data.
|
|
218
220
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
219
221
|
* @returns The sibling path for the leaf index.
|
|
220
222
|
*/
|
|
221
|
-
async getContractSiblingPath(leafIndex) {
|
|
222
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
223
|
+
async getContractSiblingPath(blockNumber, leafIndex) {
|
|
224
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
223
225
|
return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
|
|
224
226
|
}
|
|
225
227
|
/**
|
|
226
|
-
* Returns
|
|
228
|
+
* Returns a sibling path for the given index in the nullifier tree.
|
|
229
|
+
* @param blockNumber - The block number at which to get the data.
|
|
230
|
+
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
231
|
+
* @returns The sibling path for the leaf index.
|
|
232
|
+
*/
|
|
233
|
+
async getNullifierTreeSiblingPath(blockNumber, leafIndex) {
|
|
234
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
235
|
+
return committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, leafIndex);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Returns a sibling path for the given index in the data tree.
|
|
239
|
+
* @param blockNumber - The block number at which to get the data.
|
|
227
240
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
228
241
|
* @returns The sibling path for the leaf index.
|
|
229
242
|
*/
|
|
230
|
-
async getNoteHashSiblingPath(leafIndex) {
|
|
231
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
243
|
+
async getNoteHashSiblingPath(blockNumber, leafIndex) {
|
|
244
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
232
245
|
return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
|
|
233
246
|
}
|
|
234
247
|
/**
|
|
@@ -239,19 +252,88 @@ export class AztecNodeService {
|
|
|
239
252
|
*/
|
|
240
253
|
async getL1ToL2MessageAndIndex(messageKey) {
|
|
241
254
|
// todo: #697 - make this one lookup.
|
|
242
|
-
const index = (await this.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey));
|
|
255
|
+
const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey));
|
|
243
256
|
const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
|
|
244
257
|
return Promise.resolve(new L1ToL2MessageAndIndex(index, message));
|
|
245
258
|
}
|
|
246
259
|
/**
|
|
247
|
-
* Returns
|
|
260
|
+
* Returns a sibling path for a leaf in the committed l1 to l2 data tree.
|
|
261
|
+
* @param blockNumber - The block number at which to get the data.
|
|
248
262
|
* @param leafIndex - Index of the leaf in the tree.
|
|
249
263
|
* @returns The sibling path.
|
|
250
264
|
*/
|
|
251
|
-
async getL1ToL2MessageSiblingPath(leafIndex) {
|
|
252
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
265
|
+
async getL1ToL2MessageSiblingPath(blockNumber, leafIndex) {
|
|
266
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
253
267
|
return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex);
|
|
254
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Returns a sibling path for a leaf in the committed blocks tree.
|
|
271
|
+
* @param blockNumber - The block number at which to get the data.
|
|
272
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
273
|
+
* @returns The sibling path.
|
|
274
|
+
*/
|
|
275
|
+
async getBlocksTreeSiblingPath(blockNumber, leafIndex) {
|
|
276
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
277
|
+
return committedDb.getSiblingPath(MerkleTreeId.BLOCKS_TREE, leafIndex);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Returns a sibling path for a leaf in the committed public data tree.
|
|
281
|
+
* @param blockNumber - The block number at which to get the data.
|
|
282
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
283
|
+
* @returns The sibling path.
|
|
284
|
+
*/
|
|
285
|
+
async getPublicDataTreeSiblingPath(blockNumber, leafIndex) {
|
|
286
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
287
|
+
return committedDb.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Returns a nullifier membership witness for a given nullifier at a given block.
|
|
291
|
+
* @param blockNumber - The block number at which to get the index.
|
|
292
|
+
* @param nullifier - Nullifier we try to find witness for.
|
|
293
|
+
* @returns The nullifier membership witness (if found).
|
|
294
|
+
*/
|
|
295
|
+
async getNullifierMembershipWitness(blockNumber, nullifier) {
|
|
296
|
+
const db = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
297
|
+
const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
298
|
+
if (!index) {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
const leafPreimagePromise = db.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index);
|
|
302
|
+
const siblingPathPromise = db.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, BigInt(index));
|
|
303
|
+
const [leafPreimage, siblingPath] = await Promise.all([leafPreimagePromise, siblingPathPromise]);
|
|
304
|
+
if (!leafPreimage) {
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
return new NullifierMembershipWitness(BigInt(index), leafPreimage, siblingPath);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Returns a low nullifier membership witness for a given nullifier at a given block.
|
|
311
|
+
* @param blockNumber - The block number at which to get the index.
|
|
312
|
+
* @param nullifier - Nullifier we try to find the low nullifier witness for.
|
|
313
|
+
* @returns The low nullifier membership witness (if found).
|
|
314
|
+
* @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
|
|
315
|
+
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
316
|
+
* we are trying to prove non-inclusion for.
|
|
317
|
+
*
|
|
318
|
+
* Note: This function returns the membership witness of the nullifier itself and not the low nullifier when
|
|
319
|
+
* the nullifier already exists in the tree. This is because the `getPreviousValueIndex` function returns the
|
|
320
|
+
* index of the nullifier itself when it already exists in the tree.
|
|
321
|
+
* TODO: This is a confusing behavior and we should eventually address that.
|
|
322
|
+
*/
|
|
323
|
+
async getLowNullifierMembershipWitness(blockNumber, nullifier) {
|
|
324
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
325
|
+
const findResult = await committedDb.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBigInt());
|
|
326
|
+
if (!findResult) {
|
|
327
|
+
return undefined;
|
|
328
|
+
}
|
|
329
|
+
const { index, alreadyPresent } = findResult;
|
|
330
|
+
if (alreadyPresent) {
|
|
331
|
+
this.log.warn(`Nullifier ${nullifier.toBigInt()} already exists in the tree`);
|
|
332
|
+
}
|
|
333
|
+
const preimageData = (await committedDb.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index));
|
|
334
|
+
const siblingPath = await committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, BigInt(index));
|
|
335
|
+
return new NullifierMembershipWitness(BigInt(index), preimageData, siblingPath);
|
|
336
|
+
}
|
|
255
337
|
/**
|
|
256
338
|
* Gets the storage value at the given contract storage slot.
|
|
257
339
|
*
|
|
@@ -263,7 +345,7 @@ export class AztecNodeService {
|
|
|
263
345
|
* @returns Storage value at the given contract slot (or undefined if not found).
|
|
264
346
|
*/
|
|
265
347
|
async getPublicStorageAt(contract, slot) {
|
|
266
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
348
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, 'latest');
|
|
267
349
|
const leafIndex = computePublicDataTreeIndex(contract, slot);
|
|
268
350
|
const value = await committedDb.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex.value);
|
|
269
351
|
return value ? Fr.fromBuffer(value) : undefined;
|
|
@@ -273,7 +355,7 @@ export class AztecNodeService {
|
|
|
273
355
|
* @returns The current committed roots for the data trees.
|
|
274
356
|
*/
|
|
275
357
|
async getTreeRoots() {
|
|
276
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
358
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, 'latest');
|
|
277
359
|
const getTreeRoot = async (id) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
|
|
278
360
|
const [noteHashTree, nullifierTree, contractTree, l1ToL2MessagesTree, blocksTree, publicDataTree] = await Promise.all([
|
|
279
361
|
getTreeRoot(MerkleTreeId.NOTE_HASH_TREE),
|
|
@@ -293,13 +375,13 @@ export class AztecNodeService {
|
|
|
293
375
|
};
|
|
294
376
|
}
|
|
295
377
|
/**
|
|
296
|
-
* Returns the currently committed
|
|
297
|
-
* @returns The current committed block
|
|
378
|
+
* Returns the currently committed block header.
|
|
379
|
+
* @returns The current committed block header.
|
|
298
380
|
*/
|
|
299
|
-
async
|
|
300
|
-
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this);
|
|
381
|
+
async getBlockHeader() {
|
|
382
|
+
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, 'latest');
|
|
301
383
|
const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
|
|
302
|
-
return new
|
|
384
|
+
return new BlockHeader(roots[MerkleTreeId.NOTE_HASH_TREE], roots[MerkleTreeId.NULLIFIER_TREE], roots[MerkleTreeId.CONTRACT_TREE], roots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE], roots[MerkleTreeId.BLOCKS_TREE], Fr.ZERO, roots[MerkleTreeId.PUBLIC_DATA_TREE], globalsHash);
|
|
303
385
|
}
|
|
304
386
|
/**
|
|
305
387
|
* Simulates the public part of a transaction with the current state.
|
|
@@ -334,17 +416,33 @@ export class AztecNodeService {
|
|
|
334
416
|
_AztecNodeService_instances = new WeakSet(), _AztecNodeService_getWorldState =
|
|
335
417
|
/**
|
|
336
418
|
* Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
|
|
419
|
+
* @param blockNumber - The block number at which to get the data.
|
|
337
420
|
* @returns An instance of a committed MerkleTreeOperations
|
|
338
421
|
*/
|
|
339
|
-
async function _AztecNodeService_getWorldState() {
|
|
422
|
+
async function _AztecNodeService_getWorldState(blockNumber) {
|
|
423
|
+
if (typeof blockNumber === 'number' && blockNumber < INITIAL_L2_BLOCK_NUM) {
|
|
424
|
+
throw new Error('Invalid block number to get world state for: ' + blockNumber);
|
|
425
|
+
}
|
|
426
|
+
let blockSyncedTo = 0;
|
|
340
427
|
try {
|
|
341
428
|
// Attempt to sync the world state if necessary
|
|
342
|
-
await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_syncWorldState).call(this);
|
|
429
|
+
blockSyncedTo = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_syncWorldState).call(this);
|
|
343
430
|
}
|
|
344
431
|
catch (err) {
|
|
345
432
|
this.log.error(`Error getting world state: ${err}`);
|
|
346
433
|
}
|
|
347
|
-
|
|
434
|
+
// using a snapshot could be less efficient than using the committed db
|
|
435
|
+
if (blockNumber === 'latest' || blockNumber === blockSyncedTo) {
|
|
436
|
+
this.log(`Using committed db for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
|
|
437
|
+
return this.worldStateSynchronizer.getCommitted();
|
|
438
|
+
}
|
|
439
|
+
else if (blockNumber < blockSyncedTo) {
|
|
440
|
+
this.log(`Using snapshot for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
|
|
441
|
+
return this.worldStateSynchronizer.getSnapshot(blockNumber);
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
throw new Error(`Block ${blockNumber} not yet synced`);
|
|
445
|
+
}
|
|
348
446
|
}, _AztecNodeService_syncWorldState =
|
|
349
447
|
/**
|
|
350
448
|
* Ensure we fully sync the world state
|
|
@@ -352,6 +450,6 @@ async function _AztecNodeService_getWorldState() {
|
|
|
352
450
|
*/
|
|
353
451
|
async function _AztecNodeService_syncWorldState() {
|
|
354
452
|
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
355
|
-
|
|
453
|
+
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
356
454
|
};
|
|
357
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFFTCxFQUFFLEVBQ0YsZUFBZSxFQUNmLGlCQUFpQixHQUdsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBTUwscUJBQXFCLEVBUXJCLE9BQU8sRUFDUCxZQUFZLEdBS2IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBc0IsRUFDakMsTUFBTSxp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
|
|
455
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFFTCxXQUFXLEVBRVgsRUFBRSxFQUNGLGVBQWUsR0FNaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RixPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBTyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQU1MLG9CQUFvQixFQUNwQixxQkFBcUIsRUFRckIsT0FBTyxFQUNQLFlBQVksRUFDWiwwQkFBMEIsR0FLM0IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/aztec-node",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.3",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dest/index.js",
|
|
@@ -33,16 +33,16 @@
|
|
|
33
33
|
"rootDir": "./src"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@aztec/archiver": "0.16.
|
|
37
|
-
"@aztec/circuits.js": "0.16.
|
|
38
|
-
"@aztec/ethereum": "0.16.
|
|
39
|
-
"@aztec/foundation": "0.16.
|
|
40
|
-
"@aztec/l1-artifacts": "0.16.
|
|
41
|
-
"@aztec/merkle-tree": "0.16.
|
|
42
|
-
"@aztec/p2p": "0.16.
|
|
43
|
-
"@aztec/sequencer-client": "0.16.
|
|
44
|
-
"@aztec/types": "0.16.
|
|
45
|
-
"@aztec/world-state": "0.16.
|
|
36
|
+
"@aztec/archiver": "0.16.3",
|
|
37
|
+
"@aztec/circuits.js": "0.16.3",
|
|
38
|
+
"@aztec/ethereum": "0.16.3",
|
|
39
|
+
"@aztec/foundation": "0.16.3",
|
|
40
|
+
"@aztec/l1-artifacts": "0.16.3",
|
|
41
|
+
"@aztec/merkle-tree": "0.16.3",
|
|
42
|
+
"@aztec/p2p": "0.16.3",
|
|
43
|
+
"@aztec/sequencer-client": "0.16.3",
|
|
44
|
+
"@aztec/types": "0.16.3",
|
|
45
|
+
"@aztec/world-state": "0.16.3",
|
|
46
46
|
"koa": "^2.14.2",
|
|
47
47
|
"koa-router": "^12.0.0",
|
|
48
48
|
"levelup": "^5.1.1",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BlockHeader, FunctionSelector } from '@aztec/circuits.js';
|
|
2
2
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -34,7 +34,7 @@ export function createAztecNodeRpcServer(node: AztecNode) {
|
|
|
34
34
|
ContractData,
|
|
35
35
|
Fr,
|
|
36
36
|
FunctionSelector,
|
|
37
|
-
|
|
37
|
+
BlockHeader,
|
|
38
38
|
L2Block,
|
|
39
39
|
L2Tx,
|
|
40
40
|
LogId,
|
package/src/aztec-node/server.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { Archiver, LMDBArchiverStore } from '@aztec/archiver';
|
|
2
2
|
import {
|
|
3
|
+
BLOCKS_TREE_HEIGHT,
|
|
4
|
+
BlockHeader,
|
|
3
5
|
CONTRACT_TREE_HEIGHT,
|
|
4
6
|
Fr,
|
|
5
7
|
GlobalVariables,
|
|
6
|
-
HistoricBlockData,
|
|
7
8
|
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
8
9
|
NOTE_HASH_TREE_HEIGHT,
|
|
10
|
+
NULLIFIER_TREE_HEIGHT,
|
|
11
|
+
NullifierLeafPreimage,
|
|
12
|
+
PUBLIC_DATA_TREE_HEIGHT,
|
|
9
13
|
} from '@aztec/circuits.js';
|
|
10
14
|
import { computeGlobalsHash, computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
|
|
11
15
|
import { L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
|
|
@@ -24,6 +28,7 @@ import {
|
|
|
24
28
|
ContractDataSource,
|
|
25
29
|
ExtendedContractData,
|
|
26
30
|
GetUnencryptedLogsResponse,
|
|
31
|
+
INITIAL_L2_BLOCK_NUM,
|
|
27
32
|
L1ToL2MessageAndIndex,
|
|
28
33
|
L1ToL2MessageSource,
|
|
29
34
|
L2Block,
|
|
@@ -34,6 +39,7 @@ import {
|
|
|
34
39
|
LogFilter,
|
|
35
40
|
LogType,
|
|
36
41
|
MerkleTreeId,
|
|
42
|
+
NullifierMembershipWitness,
|
|
37
43
|
SequencerConfig,
|
|
38
44
|
SiblingPath,
|
|
39
45
|
Tx,
|
|
@@ -171,9 +177,9 @@ export class AztecNodeService implements AztecNode {
|
|
|
171
177
|
}
|
|
172
178
|
|
|
173
179
|
/**
|
|
174
|
-
* Get
|
|
180
|
+
* Get a block specified by its number.
|
|
175
181
|
* @param number - The block number being requested.
|
|
176
|
-
* @returns The
|
|
182
|
+
* @returns The requested block.
|
|
177
183
|
*/
|
|
178
184
|
public async getBlock(number: number): Promise<L2Block | undefined> {
|
|
179
185
|
return await this.blockSource.getBlock(number);
|
|
@@ -297,32 +303,59 @@ export class AztecNodeService implements AztecNode {
|
|
|
297
303
|
|
|
298
304
|
/**
|
|
299
305
|
* Find the index of the given leaf in the given tree.
|
|
306
|
+
* @param blockNumber - The block number at which to get the data
|
|
300
307
|
* @param treeId - The tree to search in.
|
|
301
308
|
* @param leafValue - The value to search for
|
|
302
309
|
* @returns The index of the given leaf in the given tree or undefined if not found.
|
|
303
310
|
*/
|
|
304
|
-
public async findLeafIndex(
|
|
305
|
-
|
|
311
|
+
public async findLeafIndex(
|
|
312
|
+
blockNumber: number | 'latest',
|
|
313
|
+
treeId: MerkleTreeId,
|
|
314
|
+
leafValue: Fr,
|
|
315
|
+
): Promise<bigint | undefined> {
|
|
316
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
306
317
|
return committedDb.findLeafIndex(treeId, leafValue.toBuffer());
|
|
307
318
|
}
|
|
308
319
|
|
|
309
320
|
/**
|
|
310
|
-
* Returns
|
|
321
|
+
* Returns a sibling path for the given index in the contract tree.
|
|
322
|
+
* @param blockNumber - The block number at which to get the data.
|
|
311
323
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
312
324
|
* @returns The sibling path for the leaf index.
|
|
313
325
|
*/
|
|
314
|
-
public async getContractSiblingPath(
|
|
315
|
-
|
|
326
|
+
public async getContractSiblingPath(
|
|
327
|
+
blockNumber: number | 'latest',
|
|
328
|
+
leafIndex: bigint,
|
|
329
|
+
): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>> {
|
|
330
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
316
331
|
return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
|
|
317
332
|
}
|
|
318
333
|
|
|
319
334
|
/**
|
|
320
|
-
* Returns
|
|
335
|
+
* Returns a sibling path for the given index in the nullifier tree.
|
|
336
|
+
* @param blockNumber - The block number at which to get the data.
|
|
321
337
|
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
322
338
|
* @returns The sibling path for the leaf index.
|
|
323
339
|
*/
|
|
324
|
-
public async
|
|
325
|
-
|
|
340
|
+
public async getNullifierTreeSiblingPath(
|
|
341
|
+
blockNumber: number | 'latest',
|
|
342
|
+
leafIndex: bigint,
|
|
343
|
+
): Promise<SiblingPath<typeof NULLIFIER_TREE_HEIGHT>> {
|
|
344
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
345
|
+
return committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, leafIndex);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Returns a sibling path for the given index in the data tree.
|
|
350
|
+
* @param blockNumber - The block number at which to get the data.
|
|
351
|
+
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
352
|
+
* @returns The sibling path for the leaf index.
|
|
353
|
+
*/
|
|
354
|
+
public async getNoteHashSiblingPath(
|
|
355
|
+
blockNumber: number | 'latest',
|
|
356
|
+
leafIndex: bigint,
|
|
357
|
+
): Promise<SiblingPath<typeof NOTE_HASH_TREE_HEIGHT>> {
|
|
358
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
326
359
|
return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
|
|
327
360
|
}
|
|
328
361
|
|
|
@@ -334,21 +367,120 @@ export class AztecNodeService implements AztecNode {
|
|
|
334
367
|
*/
|
|
335
368
|
public async getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex> {
|
|
336
369
|
// todo: #697 - make this one lookup.
|
|
337
|
-
const index = (await this.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey))!;
|
|
370
|
+
const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey))!;
|
|
338
371
|
const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
|
|
339
372
|
return Promise.resolve(new L1ToL2MessageAndIndex(index, message));
|
|
340
373
|
}
|
|
341
374
|
|
|
342
375
|
/**
|
|
343
|
-
* Returns
|
|
376
|
+
* Returns a sibling path for a leaf in the committed l1 to l2 data tree.
|
|
377
|
+
* @param blockNumber - The block number at which to get the data.
|
|
344
378
|
* @param leafIndex - Index of the leaf in the tree.
|
|
345
379
|
* @returns The sibling path.
|
|
346
380
|
*/
|
|
347
|
-
public async getL1ToL2MessageSiblingPath(
|
|
348
|
-
|
|
381
|
+
public async getL1ToL2MessageSiblingPath(
|
|
382
|
+
blockNumber: number | 'latest',
|
|
383
|
+
leafIndex: bigint,
|
|
384
|
+
): Promise<SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
|
|
385
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
349
386
|
return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex);
|
|
350
387
|
}
|
|
351
388
|
|
|
389
|
+
/**
|
|
390
|
+
* Returns a sibling path for a leaf in the committed blocks tree.
|
|
391
|
+
* @param blockNumber - The block number at which to get the data.
|
|
392
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
393
|
+
* @returns The sibling path.
|
|
394
|
+
*/
|
|
395
|
+
public async getBlocksTreeSiblingPath(
|
|
396
|
+
blockNumber: number | 'latest',
|
|
397
|
+
leafIndex: bigint,
|
|
398
|
+
): Promise<SiblingPath<typeof BLOCKS_TREE_HEIGHT>> {
|
|
399
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
400
|
+
return committedDb.getSiblingPath(MerkleTreeId.BLOCKS_TREE, leafIndex);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Returns a sibling path for a leaf in the committed public data tree.
|
|
405
|
+
* @param blockNumber - The block number at which to get the data.
|
|
406
|
+
* @param leafIndex - Index of the leaf in the tree.
|
|
407
|
+
* @returns The sibling path.
|
|
408
|
+
*/
|
|
409
|
+
public async getPublicDataTreeSiblingPath(
|
|
410
|
+
blockNumber: number | 'latest',
|
|
411
|
+
leafIndex: bigint,
|
|
412
|
+
): Promise<SiblingPath<typeof PUBLIC_DATA_TREE_HEIGHT>> {
|
|
413
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
414
|
+
return committedDb.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Returns a nullifier membership witness for a given nullifier at a given block.
|
|
419
|
+
* @param blockNumber - The block number at which to get the index.
|
|
420
|
+
* @param nullifier - Nullifier we try to find witness for.
|
|
421
|
+
* @returns The nullifier membership witness (if found).
|
|
422
|
+
*/
|
|
423
|
+
public async getNullifierMembershipWitness(
|
|
424
|
+
blockNumber: number | 'latest',
|
|
425
|
+
nullifier: Fr,
|
|
426
|
+
): Promise<NullifierMembershipWitness | undefined> {
|
|
427
|
+
const db = await this.#getWorldState(blockNumber);
|
|
428
|
+
const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
429
|
+
if (!index) {
|
|
430
|
+
return undefined;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const leafPreimagePromise = db.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index);
|
|
434
|
+
const siblingPathPromise = db.getSiblingPath<typeof NULLIFIER_TREE_HEIGHT>(
|
|
435
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
436
|
+
BigInt(index),
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
const [leafPreimage, siblingPath] = await Promise.all([leafPreimagePromise, siblingPathPromise]);
|
|
440
|
+
|
|
441
|
+
if (!leafPreimage) {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return new NullifierMembershipWitness(BigInt(index), leafPreimage as NullifierLeafPreimage, siblingPath);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Returns a low nullifier membership witness for a given nullifier at a given block.
|
|
450
|
+
* @param blockNumber - The block number at which to get the index.
|
|
451
|
+
* @param nullifier - Nullifier we try to find the low nullifier witness for.
|
|
452
|
+
* @returns The low nullifier membership witness (if found).
|
|
453
|
+
* @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
|
|
454
|
+
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
455
|
+
* we are trying to prove non-inclusion for.
|
|
456
|
+
*
|
|
457
|
+
* Note: This function returns the membership witness of the nullifier itself and not the low nullifier when
|
|
458
|
+
* the nullifier already exists in the tree. This is because the `getPreviousValueIndex` function returns the
|
|
459
|
+
* index of the nullifier itself when it already exists in the tree.
|
|
460
|
+
* TODO: This is a confusing behavior and we should eventually address that.
|
|
461
|
+
*/
|
|
462
|
+
public async getLowNullifierMembershipWitness(
|
|
463
|
+
blockNumber: number | 'latest',
|
|
464
|
+
nullifier: Fr,
|
|
465
|
+
): Promise<NullifierMembershipWitness | undefined> {
|
|
466
|
+
const committedDb = await this.#getWorldState(blockNumber);
|
|
467
|
+
const findResult = await committedDb.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBigInt());
|
|
468
|
+
if (!findResult) {
|
|
469
|
+
return undefined;
|
|
470
|
+
}
|
|
471
|
+
const { index, alreadyPresent } = findResult;
|
|
472
|
+
if (alreadyPresent) {
|
|
473
|
+
this.log.warn(`Nullifier ${nullifier.toBigInt()} already exists in the tree`);
|
|
474
|
+
}
|
|
475
|
+
const preimageData = (await committedDb.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index))!;
|
|
476
|
+
|
|
477
|
+
const siblingPath = await committedDb.getSiblingPath<typeof NULLIFIER_TREE_HEIGHT>(
|
|
478
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
479
|
+
BigInt(index),
|
|
480
|
+
);
|
|
481
|
+
return new NullifierMembershipWitness(BigInt(index), preimageData as NullifierLeafPreimage, siblingPath);
|
|
482
|
+
}
|
|
483
|
+
|
|
352
484
|
/**
|
|
353
485
|
* Gets the storage value at the given contract storage slot.
|
|
354
486
|
*
|
|
@@ -360,7 +492,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
360
492
|
* @returns Storage value at the given contract slot (or undefined if not found).
|
|
361
493
|
*/
|
|
362
494
|
public async getPublicStorageAt(contract: AztecAddress, slot: Fr): Promise<Fr | undefined> {
|
|
363
|
-
const committedDb = await this.#getWorldState();
|
|
495
|
+
const committedDb = await this.#getWorldState('latest');
|
|
364
496
|
const leafIndex = computePublicDataTreeIndex(contract, slot);
|
|
365
497
|
const value = await committedDb.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex.value);
|
|
366
498
|
return value ? Fr.fromBuffer(value) : undefined;
|
|
@@ -371,7 +503,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
371
503
|
* @returns The current committed roots for the data trees.
|
|
372
504
|
*/
|
|
373
505
|
public async getTreeRoots(): Promise<Record<MerkleTreeId, Fr>> {
|
|
374
|
-
const committedDb = await this.#getWorldState();
|
|
506
|
+
const committedDb = await this.#getWorldState('latest');
|
|
375
507
|
const getTreeRoot = async (id: MerkleTreeId) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
|
|
376
508
|
|
|
377
509
|
const [noteHashTree, nullifierTree, contractTree, l1ToL2MessagesTree, blocksTree, publicDataTree] =
|
|
@@ -395,14 +527,14 @@ export class AztecNodeService implements AztecNode {
|
|
|
395
527
|
}
|
|
396
528
|
|
|
397
529
|
/**
|
|
398
|
-
* Returns the currently committed
|
|
399
|
-
* @returns The current committed block
|
|
530
|
+
* Returns the currently committed block header.
|
|
531
|
+
* @returns The current committed block header.
|
|
400
532
|
*/
|
|
401
|
-
public async
|
|
402
|
-
const committedDb = await this.#getWorldState();
|
|
533
|
+
public async getBlockHeader(): Promise<BlockHeader> {
|
|
534
|
+
const committedDb = await this.#getWorldState('latest');
|
|
403
535
|
const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
|
|
404
536
|
|
|
405
|
-
return new
|
|
537
|
+
return new BlockHeader(
|
|
406
538
|
roots[MerkleTreeId.NOTE_HASH_TREE],
|
|
407
539
|
roots[MerkleTreeId.NULLIFIER_TREE],
|
|
408
540
|
roots[MerkleTreeId.CONTRACT_TREE],
|
|
@@ -453,24 +585,40 @@ export class AztecNodeService implements AztecNode {
|
|
|
453
585
|
|
|
454
586
|
/**
|
|
455
587
|
* Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
|
|
588
|
+
* @param blockNumber - The block number at which to get the data.
|
|
456
589
|
* @returns An instance of a committed MerkleTreeOperations
|
|
457
590
|
*/
|
|
458
|
-
async #getWorldState() {
|
|
591
|
+
async #getWorldState(blockNumber: number | 'latest') {
|
|
592
|
+
if (typeof blockNumber === 'number' && blockNumber < INITIAL_L2_BLOCK_NUM) {
|
|
593
|
+
throw new Error('Invalid block number to get world state for: ' + blockNumber);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
let blockSyncedTo: number = 0;
|
|
459
597
|
try {
|
|
460
598
|
// Attempt to sync the world state if necessary
|
|
461
|
-
await this.#syncWorldState();
|
|
599
|
+
blockSyncedTo = await this.#syncWorldState();
|
|
462
600
|
} catch (err) {
|
|
463
601
|
this.log.error(`Error getting world state: ${err}`);
|
|
464
602
|
}
|
|
465
|
-
|
|
603
|
+
|
|
604
|
+
// using a snapshot could be less efficient than using the committed db
|
|
605
|
+
if (blockNumber === 'latest' || blockNumber === blockSyncedTo) {
|
|
606
|
+
this.log(`Using committed db for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
|
|
607
|
+
return this.worldStateSynchronizer.getCommitted();
|
|
608
|
+
} else if (blockNumber < blockSyncedTo) {
|
|
609
|
+
this.log(`Using snapshot for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
|
|
610
|
+
return this.worldStateSynchronizer.getSnapshot(blockNumber);
|
|
611
|
+
} else {
|
|
612
|
+
throw new Error(`Block ${blockNumber} not yet synced`);
|
|
613
|
+
}
|
|
466
614
|
}
|
|
467
615
|
|
|
468
616
|
/**
|
|
469
617
|
* Ensure we fully sync the world state
|
|
470
618
|
* @returns A promise that fulfils once the world state is synced
|
|
471
619
|
*/
|
|
472
|
-
async #syncWorldState() {
|
|
620
|
+
async #syncWorldState(): Promise<number> {
|
|
473
621
|
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
474
|
-
|
|
622
|
+
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
475
623
|
}
|
|
476
624
|
}
|