@aztec/aztec-node 0.16.3 → 0.16.5
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/db.js +3 -3
- package/dest/aztec-node/server.d.ts +2 -2
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +7 -7
- package/dest/bin/index.d.ts +1 -7
- package/dest/bin/index.d.ts.map +1 -1
- package/dest/bin/index.js +1 -17
- package/package.json +11 -11
- package/src/aztec-node/config.ts +0 -31
- package/src/aztec-node/db.ts +0 -92
- package/src/aztec-node/http_rpc_server.ts +0 -51
- package/src/aztec-node/server.ts +0 -624
- package/src/bin/index.ts +0 -67
- package/src/declaration.d.ts +0 -16
- package/src/index.ts +0 -3
package/dest/aztec-node/db.js
CHANGED
|
@@ -6,8 +6,8 @@ import { mkdir } from 'node:fs/promises';
|
|
|
6
6
|
import { join } from 'node:path';
|
|
7
7
|
export const createMemDown = () => memdown();
|
|
8
8
|
export const createLevelDown = (path) => leveldown(path);
|
|
9
|
-
const DB_SUBDIR = 'aztec-node';
|
|
10
|
-
const WORLD_STATE_SUBDIR = 'aztec-world-state';
|
|
9
|
+
const DB_SUBDIR = 'aztec-node-db';
|
|
10
|
+
const WORLD_STATE_SUBDIR = 'aztec-world-state-db';
|
|
11
11
|
const NODE_METADATA_KEY = '@@aztec_node_metadata';
|
|
12
12
|
/**
|
|
13
13
|
* Opens the database for the aztec node. If a data directory is specified, then this attempts to create it.
|
|
@@ -61,4 +61,4 @@ async function checkNodeMetadataAndClear(nodeDb, worldStateDb, nodeMetadata, log
|
|
|
61
61
|
await metadataDB.close();
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsT0FBTyxJQUFJLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RCxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlqQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUUsT0FBZSxFQUF1QixDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUUsU0FBaUIsQ0FBQyxJQUFJLENBQWMsQ0FBQztBQUV2RixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQztBQUNsRCxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO0FBWWxEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQzFCLE1BQXVCLEVBQ3ZCLEdBQVU7SUFFVixNQUFNLFlBQVksR0FBaUI7UUFDakMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO0tBQ25FLENBQUM7SUFFRixJQUFJLE1BQW9CLENBQUM7SUFDekIsSUFBSSxZQUFxQixDQUFDO0lBRTFCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLG1FQUFtRTtRQUNuRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoRCxHQUFHLENBQUMsa0NBQWtDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFM0IsR0FBRyxDQUFDLG1DQUFtQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7S0FDeEQ7U0FBTTtRQUNMLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25DLG1GQUFtRjtRQUNuRixNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLFlBQVksR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztLQUN6QztJQUVELE1BQU0seUJBQXlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSx5QkFBeUIsQ0FDdEMsTUFBb0IsRUFDcEIsWUFBcUIsRUFDckIsWUFBMEIsRUFDMUIsR0FBVTtJQUVWLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQXVCLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RSxJQUFJO1FBQ0YsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELGdGQUFnRjtRQUNoRixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsS0FBSyxZQUFZLENBQUMscUJBQXFCLEVBQUU7WUFDdEYsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFDL0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxNQUFNLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDdkQ7WUFBUztRQUNSLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQzFCO0FBQ0gsQ0FBQyJ9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ARCHIVE_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';
|
|
@@ -173,7 +173,7 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
173
173
|
* @param leafIndex - Index of the leaf in the tree.
|
|
174
174
|
* @returns The sibling path.
|
|
175
175
|
*/
|
|
176
|
-
|
|
176
|
+
getArchiveSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof ARCHIVE_HEIGHT>>;
|
|
177
177
|
/**
|
|
178
178
|
* Returns a sibling path for a leaf in the committed public data tree.
|
|
179
179
|
* @param blockNumber - The block number at which to get the data.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AACA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -272,9 +272,9 @@ export class AztecNodeService {
|
|
|
272
272
|
* @param leafIndex - Index of the leaf in the tree.
|
|
273
273
|
* @returns The sibling path.
|
|
274
274
|
*/
|
|
275
|
-
async
|
|
275
|
+
async getArchiveSiblingPath(blockNumber, leafIndex) {
|
|
276
276
|
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, blockNumber);
|
|
277
|
-
return committedDb.getSiblingPath(MerkleTreeId.
|
|
277
|
+
return committedDb.getSiblingPath(MerkleTreeId.ARCHIVE, leafIndex);
|
|
278
278
|
}
|
|
279
279
|
/**
|
|
280
280
|
* Returns a sibling path for a leaf in the committed public data tree.
|
|
@@ -357,12 +357,12 @@ export class AztecNodeService {
|
|
|
357
357
|
async getTreeRoots() {
|
|
358
358
|
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, 'latest');
|
|
359
359
|
const getTreeRoot = async (id) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
|
|
360
|
-
const [noteHashTree, nullifierTree, contractTree, l1ToL2MessagesTree,
|
|
360
|
+
const [noteHashTree, nullifierTree, contractTree, l1ToL2MessagesTree, archive, publicDataTree] = await Promise.all([
|
|
361
361
|
getTreeRoot(MerkleTreeId.NOTE_HASH_TREE),
|
|
362
362
|
getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
|
|
363
363
|
getTreeRoot(MerkleTreeId.CONTRACT_TREE),
|
|
364
364
|
getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
365
|
-
getTreeRoot(MerkleTreeId.
|
|
365
|
+
getTreeRoot(MerkleTreeId.ARCHIVE),
|
|
366
366
|
getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
|
|
367
367
|
]);
|
|
368
368
|
return {
|
|
@@ -371,7 +371,7 @@ export class AztecNodeService {
|
|
|
371
371
|
[MerkleTreeId.NULLIFIER_TREE]: nullifierTree,
|
|
372
372
|
[MerkleTreeId.PUBLIC_DATA_TREE]: publicDataTree,
|
|
373
373
|
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: l1ToL2MessagesTree,
|
|
374
|
-
[MerkleTreeId.
|
|
374
|
+
[MerkleTreeId.ARCHIVE]: archive,
|
|
375
375
|
};
|
|
376
376
|
}
|
|
377
377
|
/**
|
|
@@ -381,7 +381,7 @@ export class AztecNodeService {
|
|
|
381
381
|
async getBlockHeader() {
|
|
382
382
|
const committedDb = await __classPrivateFieldGet(this, _AztecNodeService_instances, "m", _AztecNodeService_getWorldState).call(this, 'latest');
|
|
383
383
|
const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
|
|
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.
|
|
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.ARCHIVE], Fr.ZERO, roots[MerkleTreeId.PUBLIC_DATA_TREE], globalsHash);
|
|
385
385
|
}
|
|
386
386
|
/**
|
|
387
387
|
* Simulates the public part of a transaction with the current state.
|
|
@@ -452,4 +452,4 @@ async function _AztecNodeService_syncWorldState() {
|
|
|
452
452
|
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
453
453
|
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
454
454
|
};
|
|
455
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFFTCxXQUFXLEVBRVgsRUFBRSxFQUNGLGVBQWUsR0FNaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RixPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBTyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQU1MLG9CQUFvQixFQUNwQixxQkFBcUIsRUFRckIsT0FBTyxFQUNQLFlBQVksRUFDWiwwQkFBMEIsR0FLM0IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMs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
|
|
455
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFFTCxXQUFXLEVBRVgsRUFBRSxFQUNGLGVBQWUsR0FNaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RixPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBTyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQU1MLG9CQUFvQixFQUNwQixxQkFBcUIsRUFRckIsT0FBTyxFQUNQLFlBQVksRUFDWiwwQkFBMEIsR0FLM0IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBc0IsRUFDakMsTUFBTSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7O1FBYjFCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWM7UUFDakMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFjO1FBQ25DLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQ3RDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUztRQUNqQyxRQUFHLEdBQUgsR0FBRyxDQUFrQztRQUU3QyxNQUFNLE9BQU8sR0FDWCxzQ0FBc0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsc0JBQXNCO1lBQ2hGLFdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDMUQsYUFBYSxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUM5RCxVQUFVLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQ3hELFdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDMUQscUJBQXFCLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0NBQWdDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUN4RixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBdUI7UUFDdkQsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsMkVBQTJFO1FBQzNFLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsb0JBQW9CLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FDbEcsQ0FBQztTQUNIO1FBRUQsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFekQscUNBQXFDO1FBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzRSxpRkFBaUY7UUFDakYsaUNBQWlDO1FBQ2pDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFFeEYsNkVBQTZFO1FBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLGNBQWMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWhGLCtEQUErRDtRQUMvRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBcUIsbUJBQW1CLEVBQUUsQ0FBQztRQUNqRSxNQUFNLHNCQUFzQixHQUFHLE1BQU0sNEJBQTRCLENBQUMsR0FBRyxDQUNuRSxZQUFZLEVBQ1osV0FBVyxFQUNYLFFBQVEsRUFDUixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZFLDJCQUEyQjtRQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCO1lBQ3ZDLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdkcsT0FBTyxJQUFJLGdCQUFnQixDQUN6QixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFDMUIsTUFBTSxDQUFDLE9BQU8sRUFDZCx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFDaEMsWUFBWSxFQUNaLEdBQUcsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWM7UUFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDaEQsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsY0FBYztRQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVTtRQUNmLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVU7UUFDZixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGVBQTZCO1FBQ3pELE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FBQyxlQUE2QjtRQUN4RCxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksT0FBTyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsT0FBZ0I7UUFDMUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ3hHLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsTUFBaUI7UUFDbEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBTTtRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksQ0FBQyxTQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWM7UUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixXQUE4QixFQUM5QixNQUFvQixFQUNwQixTQUFhO1FBRWIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsc0JBQXNCLENBQ2pDLFdBQThCLEVBQzlCLFNBQWlCO1FBRWpCLE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLEVBQWdCLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsV0FBOEIsRUFDOUIsU0FBaUI7UUFFakIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQixDQUNqQyxXQUE4QixFQUM5QixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLHVCQUFBLElBQUksb0VBQWUsTUFBbkIsSUFBSSxFQUFnQixXQUFXLENBQUMsQ0FBQztRQUMzRCxPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBYztRQUNsRCxxQ0FBcUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBRSxDQUFDO1FBQ3JHLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsV0FBOEIsRUFDOUIsU0FBaUI7UUFFakIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMscUJBQXFCLENBQ2hDLFdBQThCLEVBQzlCLFNBQWlCO1FBRWpCLE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLEVBQWdCLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FDdkMsV0FBOEIsRUFDOUIsU0FBaUI7UUFFakIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsNkJBQTZCLENBQ3hDLFdBQThCLEVBQzlCLFNBQWE7UUFFYixNQUFNLEVBQUUsR0FBRyxNQUFNLHVCQUFBLElBQUksb0VBQWUsTUFBbkIsSUFBSSxFQUFnQixXQUFXLENBQUMsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQzFDLFlBQVksQ0FBQyxjQUFjLEVBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDZCxDQUFDO1FBRUYsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFakcsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBcUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsV0FBOEIsRUFDOUIsU0FBYTtRQUViLE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLEVBQWdCLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDN0MsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxTQUFTLENBQUMsUUFBUSxFQUFFLDZCQUE2QixDQUFDLENBQUM7U0FDL0U7UUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFFLENBQUM7UUFFOUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUNsRCxZQUFZLENBQUMsY0FBYyxFQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQ2QsQ0FBQztRQUNGLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBcUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQXNCLEVBQUUsSUFBUTtRQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLHVCQUFBLElBQUksb0VBQWUsTUFBbkIsSUFBSSxFQUFnQixRQUFRLENBQUMsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0YsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLFlBQVk7UUFDdkIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsUUFBUSxDQUFDLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEVBQWdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNqSCxXQUFXLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUN4QyxXQUFXLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUN4QyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUN2QyxXQUFXLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO1lBQ2hELFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ2pDLFdBQVcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFlBQVk7WUFDMUMsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWTtZQUMzQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxhQUFhO1lBQzVDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsY0FBYztZQUMvQyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLGtCQUFrQjtZQUN6RCxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGNBQWM7UUFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksRUFBZ0IsUUFBUSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsV0FBVyxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxILE9BQU8sSUFBSSxXQUFXLENBQ3BCLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQ2xDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQ2xDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQ2pDLEtBQUssQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDMUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFDM0IsRUFBRSxDQUFDLElBQUksRUFDUCxLQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQ3BDLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7UUFHSTtJQUNHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUFNO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTlHLHNGQUFzRjtRQUN0RiwwR0FBMEc7UUFDMUcscUVBQXFFO1FBQ3JFLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNwRSxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDckIsbUJBQW1CO1NBQ3BCLENBQUMsQ0FBQztRQUVILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FDdkQsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDL0YsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsTUFBTSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWdDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQXdDRjs7QUF0Q0M7Ozs7R0FJRztBQUNILEtBQUssMENBQWdCLFdBQThCO0lBQ2pELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsR0FBRyxvQkFBb0IsRUFBRTtRQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0tBQ2hGO0lBRUQsSUFBSSxhQUFhLEdBQVcsQ0FBQyxDQUFDO0lBQzlCLElBQUk7UUFDRiwrQ0FBK0M7UUFDL0MsYUFBYSxHQUFHLE1BQU0sdUJBQUEsSUFBSSxxRUFBZ0IsTUFBcEIsSUFBSSxDQUFrQixDQUFDO0tBQzlDO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUVELHVFQUF1RTtJQUN2RSxJQUFJLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxLQUFLLGFBQWEsRUFBRTtRQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxXQUFXLDZCQUE2QixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxDQUFDO0tBQ25EO1NBQU0sSUFBSSxXQUFXLEdBQUcsYUFBYSxFQUFFO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsNEJBQTRCLFdBQVcsNkJBQTZCLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDOUYsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQzdEO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsV0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3hEO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUs7SUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNsRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN0RSxDQUFDIn0=
|
package/dest/bin/index.d.ts
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --no-warnings
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Creates a router for helper API endpoints of the Private eXecution Environment (PXE).
|
|
5
|
-
* @param apiPrefix - The prefix to use for all api requests
|
|
6
|
-
* @returns - The router for handling status requests.
|
|
7
|
-
*/
|
|
8
|
-
export declare function createStatusRouter(apiPrefix: string): Router<any, {}>;
|
|
2
|
+
export {};
|
|
9
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dest/bin/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":""}
|
package/dest/bin/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --no-warnings
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
3
|
import http from 'http';
|
|
4
|
-
import Router from 'koa-router';
|
|
5
4
|
import { AztecNodeService, createAztecNodeRpcServer, getConfigEnvVars } from '../index.js';
|
|
6
5
|
const { AZTEC_NODE_PORT = 8081, API_PREFIX = '' } = process.env;
|
|
7
6
|
const logger = createDebugLogger('aztec:node');
|
|
@@ -12,18 +11,6 @@ async function createAndDeployAztecNode() {
|
|
|
12
11
|
const aztecNodeConfig = { ...getConfigEnvVars() };
|
|
13
12
|
return await AztecNodeService.createAndSync(aztecNodeConfig);
|
|
14
13
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Creates a router for helper API endpoints of the Private eXecution Environment (PXE).
|
|
17
|
-
* @param apiPrefix - The prefix to use for all api requests
|
|
18
|
-
* @returns - The router for handling status requests.
|
|
19
|
-
*/
|
|
20
|
-
export function createStatusRouter(apiPrefix) {
|
|
21
|
-
const router = new Router({ prefix: `${apiPrefix}` });
|
|
22
|
-
router.get('/status', (ctx) => {
|
|
23
|
-
ctx.status = 200;
|
|
24
|
-
});
|
|
25
|
-
return router;
|
|
26
|
-
}
|
|
27
14
|
/**
|
|
28
15
|
* Create and start a new Aztec Node HTTP Server
|
|
29
16
|
*/
|
|
@@ -39,9 +26,6 @@ async function main() {
|
|
|
39
26
|
process.once('SIGTERM', shutdown);
|
|
40
27
|
const rpcServer = createAztecNodeRpcServer(aztecNode);
|
|
41
28
|
const app = rpcServer.getApp(API_PREFIX);
|
|
42
|
-
const apiRouter = createStatusRouter(API_PREFIX);
|
|
43
|
-
app.use(apiRouter.routes());
|
|
44
|
-
app.use(apiRouter.allowedMethods());
|
|
45
29
|
const httpServer = http.createServer(app.callback());
|
|
46
30
|
httpServer.listen(+AZTEC_NODE_PORT);
|
|
47
31
|
logger.info(`Aztec Node JSON-RPC Server listening on port ${AZTEC_NODE_PORT}`);
|
|
@@ -50,4 +34,4 @@ main().catch(err => {
|
|
|
50
34
|
logger.error(err);
|
|
51
35
|
process.exit(1);
|
|
52
36
|
});
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RyxNQUFNLEVBQUUsZUFBZSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUVoRSxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUUvQzs7R0FFRztBQUNILEtBQUssVUFBVSx3QkFBd0I7SUFDckMsTUFBTSxlQUFlLEdBQW9CLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7SUFFbkUsT0FBTyxNQUFNLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsSUFBSTtJQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFFeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSx3QkFBd0IsRUFBRSxDQUFDO0lBRW5ELE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoQyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNyRCxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsZUFBZSxFQUFFLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/aztec-node",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.5",
|
|
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.5",
|
|
37
|
+
"@aztec/circuits.js": "0.16.5",
|
|
38
|
+
"@aztec/ethereum": "0.16.5",
|
|
39
|
+
"@aztec/foundation": "0.16.5",
|
|
40
|
+
"@aztec/l1-artifacts": "0.16.5",
|
|
41
|
+
"@aztec/merkle-tree": "0.16.5",
|
|
42
|
+
"@aztec/p2p": "0.16.5",
|
|
43
|
+
"@aztec/sequencer-client": "0.16.5",
|
|
44
|
+
"@aztec/types": "0.16.5",
|
|
45
|
+
"@aztec/world-state": "0.16.5",
|
|
46
46
|
"koa": "^2.14.2",
|
|
47
47
|
"koa-router": "^12.0.0",
|
|
48
48
|
"levelup": "^5.1.1",
|
package/src/aztec-node/config.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { ArchiverConfig, getConfigEnvVars as getArchiverVars } from '@aztec/archiver';
|
|
2
|
-
import { P2PConfig, getP2PConfigEnvVars } from '@aztec/p2p';
|
|
3
|
-
import { SequencerClientConfig, getConfigEnvVars as getSequencerVars } from '@aztec/sequencer-client';
|
|
4
|
-
import { getConfigEnvVars as getWorldStateVars } from '@aztec/world-state';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* The configuration the aztec node.
|
|
8
|
-
*/
|
|
9
|
-
export type AztecNodeConfig = ArchiverConfig &
|
|
10
|
-
SequencerClientConfig &
|
|
11
|
-
P2PConfig & {
|
|
12
|
-
/** Whether the sequencer is disabled for this node. */
|
|
13
|
-
disableSequencer: boolean;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Returns the config of the aztec node from environment variables with reasonable defaults.
|
|
18
|
-
* @returns A valid aztec node config.
|
|
19
|
-
*/
|
|
20
|
-
export function getConfigEnvVars(): AztecNodeConfig {
|
|
21
|
-
const { SEQ_DISABLED } = process.env;
|
|
22
|
-
const allEnvVars: AztecNodeConfig = {
|
|
23
|
-
...getSequencerVars(),
|
|
24
|
-
...getArchiverVars(),
|
|
25
|
-
...getP2PConfigEnvVars(),
|
|
26
|
-
...getWorldStateVars(),
|
|
27
|
-
disableSequencer: !!SEQ_DISABLED,
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
return allEnvVars;
|
|
31
|
-
}
|
package/src/aztec-node/db.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { LogFn } from '@aztec/foundation/log';
|
|
2
|
-
|
|
3
|
-
import { LevelDown, default as leveldown } from 'leveldown';
|
|
4
|
-
import { LevelUp, default as levelup } from 'levelup';
|
|
5
|
-
import { RootDatabase, open } from 'lmdb';
|
|
6
|
-
import { MemDown, default as memdown } from 'memdown';
|
|
7
|
-
import { mkdir } from 'node:fs/promises';
|
|
8
|
-
import { join } from 'node:path';
|
|
9
|
-
|
|
10
|
-
import { AztecNodeConfig } from './config.js';
|
|
11
|
-
|
|
12
|
-
export const createMemDown = () => (memdown as any)() as MemDown<any, any>;
|
|
13
|
-
export const createLevelDown = (path: string) => (leveldown as any)(path) as LevelDown;
|
|
14
|
-
|
|
15
|
-
const DB_SUBDIR = 'aztec-node';
|
|
16
|
-
const WORLD_STATE_SUBDIR = 'aztec-world-state';
|
|
17
|
-
const NODE_METADATA_KEY = '@@aztec_node_metadata';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The metadata for an aztec node.
|
|
21
|
-
*/
|
|
22
|
-
type NodeMetadata = {
|
|
23
|
-
/**
|
|
24
|
-
* The address of the rollup contract on L1
|
|
25
|
-
*/
|
|
26
|
-
rollupContractAddress: string;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Opens the database for the aztec node. If a data directory is specified, then this attempts to create it.
|
|
31
|
-
* @param config - The configuration to be used by the aztec node.
|
|
32
|
-
* @throws If `config.dataDirectory` is set and the directory cannot be created.
|
|
33
|
-
* @returns The database for the aztec node.
|
|
34
|
-
*/
|
|
35
|
-
export async function openDb(
|
|
36
|
-
config: AztecNodeConfig,
|
|
37
|
-
log: LogFn,
|
|
38
|
-
): Promise<[nodeDb: RootDatabase, worldStateDb: LevelUp]> {
|
|
39
|
-
const nodeMetadata: NodeMetadata = {
|
|
40
|
-
rollupContractAddress: config.l1Contracts.rollupAddress.toString(),
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
let nodeDb: RootDatabase;
|
|
44
|
-
let worldStateDb: LevelUp;
|
|
45
|
-
|
|
46
|
-
if (config.dataDirectory) {
|
|
47
|
-
const nodeDir = join(config.dataDirectory, DB_SUBDIR);
|
|
48
|
-
const worldStateDir = join(config.dataDirectory, WORLD_STATE_SUBDIR);
|
|
49
|
-
// this throws if we don't have permissions to create the directory
|
|
50
|
-
await mkdir(nodeDir, { recursive: true });
|
|
51
|
-
await mkdir(worldStateDir, { recursive: true });
|
|
52
|
-
|
|
53
|
-
log(`Opening aztec-node database at ${nodeDir}`);
|
|
54
|
-
nodeDb = open(nodeDir, {});
|
|
55
|
-
|
|
56
|
-
log(`Opening world-state database at ${worldStateDir}`);
|
|
57
|
-
worldStateDb = levelup(createLevelDown(worldStateDir));
|
|
58
|
-
} else {
|
|
59
|
-
log('Opening temporary databases');
|
|
60
|
-
// not passing a path will use a temp file that gets deleted when the process exits
|
|
61
|
-
nodeDb = open({});
|
|
62
|
-
worldStateDb = levelup(createMemDown());
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
await checkNodeMetadataAndClear(nodeDb, worldStateDb, nodeMetadata, log);
|
|
66
|
-
return [nodeDb, worldStateDb];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Checks the node metadata and clears the database if the rollup contract address has changed.
|
|
71
|
-
* @param nodeDb - The database for the aztec node.
|
|
72
|
-
* @param nodeMetadata - The metadata for the aztec node.
|
|
73
|
-
*/
|
|
74
|
-
async function checkNodeMetadataAndClear(
|
|
75
|
-
nodeDb: RootDatabase,
|
|
76
|
-
worldStateDb: LevelUp,
|
|
77
|
-
nodeMetadata: NodeMetadata,
|
|
78
|
-
log: LogFn,
|
|
79
|
-
): Promise<void> {
|
|
80
|
-
const metadataDB = nodeDb.openDB<NodeMetadata, string>('metadata', {});
|
|
81
|
-
try {
|
|
82
|
-
const existing = metadataDB.get(NODE_METADATA_KEY);
|
|
83
|
-
// if the rollup addresses are different, wipe the local database and start over
|
|
84
|
-
if (!existing || existing.rollupContractAddress !== nodeMetadata.rollupContractAddress) {
|
|
85
|
-
log('Rollup contract address has changed, clearing databases');
|
|
86
|
-
await Promise.all([nodeDb.clearAsync(), worldStateDb.clear()]);
|
|
87
|
-
}
|
|
88
|
-
await metadataDB.put(NODE_METADATA_KEY, nodeMetadata);
|
|
89
|
-
} finally {
|
|
90
|
-
await metadataDB.close();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { BlockHeader, FunctionSelector } from '@aztec/circuits.js';
|
|
2
|
-
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
3
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
-
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
6
|
-
import {
|
|
7
|
-
AztecNode,
|
|
8
|
-
ContractData,
|
|
9
|
-
ExtendedContractData,
|
|
10
|
-
ExtendedUnencryptedL2Log,
|
|
11
|
-
L1ToL2MessageAndIndex,
|
|
12
|
-
L2Block,
|
|
13
|
-
L2BlockL2Logs,
|
|
14
|
-
L2Tx,
|
|
15
|
-
LogId,
|
|
16
|
-
SiblingPath,
|
|
17
|
-
Tx,
|
|
18
|
-
TxHash,
|
|
19
|
-
} from '@aztec/types';
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Wrap an AztecNode instance with a JSON RPC HTTP server.
|
|
23
|
-
* @param node - The AztecNode
|
|
24
|
-
* @returns An JSON-RPC HTTP server
|
|
25
|
-
*/
|
|
26
|
-
export function createAztecNodeRpcServer(node: AztecNode) {
|
|
27
|
-
const rpc = new JsonRpcServer(
|
|
28
|
-
node,
|
|
29
|
-
{
|
|
30
|
-
AztecAddress,
|
|
31
|
-
EthAddress,
|
|
32
|
-
ExtendedContractData,
|
|
33
|
-
ExtendedUnencryptedL2Log,
|
|
34
|
-
ContractData,
|
|
35
|
-
Fr,
|
|
36
|
-
FunctionSelector,
|
|
37
|
-
BlockHeader,
|
|
38
|
-
L2Block,
|
|
39
|
-
L2Tx,
|
|
40
|
-
LogId,
|
|
41
|
-
TxHash,
|
|
42
|
-
SiblingPath,
|
|
43
|
-
L1ToL2MessageAndIndex,
|
|
44
|
-
},
|
|
45
|
-
{ Tx, L2BlockL2Logs },
|
|
46
|
-
false,
|
|
47
|
-
// disable methods not part of the AztecNode interface
|
|
48
|
-
['start', 'stop'],
|
|
49
|
-
);
|
|
50
|
-
return rpc;
|
|
51
|
-
}
|
package/src/aztec-node/server.ts
DELETED
|
@@ -1,624 +0,0 @@
|
|
|
1
|
-
import { Archiver, LMDBArchiverStore } from '@aztec/archiver';
|
|
2
|
-
import {
|
|
3
|
-
BLOCKS_TREE_HEIGHT,
|
|
4
|
-
BlockHeader,
|
|
5
|
-
CONTRACT_TREE_HEIGHT,
|
|
6
|
-
Fr,
|
|
7
|
-
GlobalVariables,
|
|
8
|
-
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
9
|
-
NOTE_HASH_TREE_HEIGHT,
|
|
10
|
-
NULLIFIER_TREE_HEIGHT,
|
|
11
|
-
NullifierLeafPreimage,
|
|
12
|
-
PUBLIC_DATA_TREE_HEIGHT,
|
|
13
|
-
} from '@aztec/circuits.js';
|
|
14
|
-
import { computeGlobalsHash, computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
|
|
15
|
-
import { L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
|
|
16
|
-
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
17
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
18
|
-
import { InMemoryTxPool, P2P, createP2PClient } from '@aztec/p2p';
|
|
19
|
-
import {
|
|
20
|
-
GlobalVariableBuilder,
|
|
21
|
-
PublicProcessorFactory,
|
|
22
|
-
SequencerClient,
|
|
23
|
-
getGlobalVariableBuilder,
|
|
24
|
-
} from '@aztec/sequencer-client';
|
|
25
|
-
import {
|
|
26
|
-
AztecNode,
|
|
27
|
-
ContractData,
|
|
28
|
-
ContractDataSource,
|
|
29
|
-
ExtendedContractData,
|
|
30
|
-
GetUnencryptedLogsResponse,
|
|
31
|
-
INITIAL_L2_BLOCK_NUM,
|
|
32
|
-
L1ToL2MessageAndIndex,
|
|
33
|
-
L1ToL2MessageSource,
|
|
34
|
-
L2Block,
|
|
35
|
-
L2BlockL2Logs,
|
|
36
|
-
L2BlockSource,
|
|
37
|
-
L2LogsSource,
|
|
38
|
-
L2Tx,
|
|
39
|
-
LogFilter,
|
|
40
|
-
LogType,
|
|
41
|
-
MerkleTreeId,
|
|
42
|
-
NullifierMembershipWitness,
|
|
43
|
-
SequencerConfig,
|
|
44
|
-
SiblingPath,
|
|
45
|
-
Tx,
|
|
46
|
-
TxHash,
|
|
47
|
-
} from '@aztec/types';
|
|
48
|
-
import {
|
|
49
|
-
MerkleTrees,
|
|
50
|
-
ServerWorldStateSynchronizer,
|
|
51
|
-
WorldStateConfig,
|
|
52
|
-
WorldStateSynchronizer,
|
|
53
|
-
getConfigEnvVars as getWorldStateConfig,
|
|
54
|
-
} from '@aztec/world-state';
|
|
55
|
-
|
|
56
|
-
import { LevelUp } from 'levelup';
|
|
57
|
-
|
|
58
|
-
import { AztecNodeConfig } from './config.js';
|
|
59
|
-
import { openDb } from './db.js';
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* The aztec node.
|
|
63
|
-
*/
|
|
64
|
-
export class AztecNodeService implements AztecNode {
|
|
65
|
-
constructor(
|
|
66
|
-
protected readonly config: AztecNodeConfig,
|
|
67
|
-
protected readonly p2pClient: P2P,
|
|
68
|
-
protected readonly blockSource: L2BlockSource,
|
|
69
|
-
protected readonly encryptedLogsSource: L2LogsSource,
|
|
70
|
-
protected readonly unencryptedLogsSource: L2LogsSource,
|
|
71
|
-
protected readonly contractDataSource: ContractDataSource,
|
|
72
|
-
protected readonly l1ToL2MessageSource: L1ToL2MessageSource,
|
|
73
|
-
protected readonly worldStateSynchronizer: WorldStateSynchronizer,
|
|
74
|
-
protected readonly sequencer: SequencerClient | undefined,
|
|
75
|
-
protected readonly chainId: number,
|
|
76
|
-
protected readonly version: number,
|
|
77
|
-
protected readonly globalVariableBuilder: GlobalVariableBuilder,
|
|
78
|
-
protected readonly merkleTreesDb: LevelUp,
|
|
79
|
-
private log = createDebugLogger('aztec:node'),
|
|
80
|
-
) {
|
|
81
|
-
const message =
|
|
82
|
-
`Started Aztec Node against chain 0x${chainId.toString(16)} with contracts - \n` +
|
|
83
|
-
`Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
|
|
84
|
-
`Registry: ${config.l1Contracts.registryAddress.toString()}\n` +
|
|
85
|
-
`Inbox: ${config.l1Contracts.inboxAddress.toString()}\n` +
|
|
86
|
-
`Outbox: ${config.l1Contracts.outboxAddress.toString()}\n` +
|
|
87
|
-
`Contract Emitter: ${config.l1Contracts.contractDeploymentEmitterAddress.toString()}`;
|
|
88
|
-
this.log(message);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* initializes the Aztec Node, wait for component to sync.
|
|
93
|
-
* @param config - The configuration to be used by the aztec node.
|
|
94
|
-
* @returns - A fully synced Aztec Node for use in development/testing.
|
|
95
|
-
*/
|
|
96
|
-
public static async createAndSync(config: AztecNodeConfig) {
|
|
97
|
-
const ethereumChain = createEthereumChain(config.rpcUrl, config.apiKey);
|
|
98
|
-
//validate that the actual chain id matches that specified in configuration
|
|
99
|
-
if (config.chainId !== ethereumChain.chainInfo.id) {
|
|
100
|
-
throw new Error(
|
|
101
|
-
`RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.chainId}`,
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const log = createDebugLogger('aztec:node');
|
|
106
|
-
const [nodeDb, worldStateDb] = await openDb(config, log);
|
|
107
|
-
|
|
108
|
-
// first create and sync the archiver
|
|
109
|
-
const archiverStore = new LMDBArchiverStore(nodeDb, config.maxLogs);
|
|
110
|
-
const archiver = await Archiver.createAndSync(config, archiverStore, true);
|
|
111
|
-
|
|
112
|
-
// we identify the P2P transaction protocol by using the rollup contract address.
|
|
113
|
-
// this may well change in future
|
|
114
|
-
config.transactionProtocol = `/aztec/tx/${config.l1Contracts.rollupAddress.toString()}`;
|
|
115
|
-
|
|
116
|
-
// create the tx pool and the p2p client, which will need the l2 block source
|
|
117
|
-
const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
|
|
118
|
-
|
|
119
|
-
// now create the merkle trees and the world state synchronizer
|
|
120
|
-
const merkleTrees = await MerkleTrees.new(worldStateDb);
|
|
121
|
-
const worldStateConfig: WorldStateConfig = getWorldStateConfig();
|
|
122
|
-
const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(
|
|
123
|
-
worldStateDb,
|
|
124
|
-
merkleTrees,
|
|
125
|
-
archiver,
|
|
126
|
-
worldStateConfig,
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
// start both and wait for them to sync from the block source
|
|
130
|
-
await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
|
|
131
|
-
|
|
132
|
-
// now create the sequencer
|
|
133
|
-
const sequencer = config.disableSequencer
|
|
134
|
-
? undefined
|
|
135
|
-
: await SequencerClient.new(config, p2pClient, worldStateSynchronizer, archiver, archiver, archiver);
|
|
136
|
-
|
|
137
|
-
return new AztecNodeService(
|
|
138
|
-
config,
|
|
139
|
-
p2pClient,
|
|
140
|
-
archiver,
|
|
141
|
-
archiver,
|
|
142
|
-
archiver,
|
|
143
|
-
archiver,
|
|
144
|
-
archiver,
|
|
145
|
-
worldStateSynchronizer,
|
|
146
|
-
sequencer,
|
|
147
|
-
ethereumChain.chainInfo.id,
|
|
148
|
-
config.version,
|
|
149
|
-
getGlobalVariableBuilder(config),
|
|
150
|
-
worldStateDb,
|
|
151
|
-
log,
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Returns the sequencer client instance.
|
|
157
|
-
* @returns The sequencer client instance.
|
|
158
|
-
*/
|
|
159
|
-
public getSequencer(): SequencerClient | undefined {
|
|
160
|
-
return this.sequencer;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Method to return the currently deployed L1 contract addresses.
|
|
165
|
-
* @returns - The currently deployed L1 contract addresses.
|
|
166
|
-
*/
|
|
167
|
-
public getL1ContractAddresses(): Promise<L1ContractAddresses> {
|
|
168
|
-
return Promise.resolve(this.config.l1Contracts);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Method to determine if the node is ready to accept transactions.
|
|
173
|
-
* @returns - Flag indicating the readiness for tx submission.
|
|
174
|
-
*/
|
|
175
|
-
public async isReady() {
|
|
176
|
-
return (await this.p2pClient.isReady()) ?? false;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Get a block specified by its number.
|
|
181
|
-
* @param number - The block number being requested.
|
|
182
|
-
* @returns The requested block.
|
|
183
|
-
*/
|
|
184
|
-
public async getBlock(number: number): Promise<L2Block | undefined> {
|
|
185
|
-
return await this.blockSource.getBlock(number);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Method to request blocks. Will attempt to return all requested blocks but will return only those available.
|
|
190
|
-
* @param from - The start of the range of blocks to return.
|
|
191
|
-
* @param limit - The maximum number of blocks to obtain.
|
|
192
|
-
* @returns The blocks requested.
|
|
193
|
-
*/
|
|
194
|
-
public async getBlocks(from: number, limit: number): Promise<L2Block[]> {
|
|
195
|
-
return (await this.blockSource.getBlocks(from, limit)) ?? [];
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Method to fetch the current block number.
|
|
200
|
-
* @returns The block number.
|
|
201
|
-
*/
|
|
202
|
-
public async getBlockNumber(): Promise<number> {
|
|
203
|
-
return await this.blockSource.getBlockNumber();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Method to fetch the version of the rollup the node is connected to.
|
|
208
|
-
* @returns The rollup version.
|
|
209
|
-
*/
|
|
210
|
-
public getVersion(): Promise<number> {
|
|
211
|
-
return Promise.resolve(this.version);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Method to fetch the chain id of the base-layer for the rollup.
|
|
216
|
-
* @returns The chain id.
|
|
217
|
-
*/
|
|
218
|
-
public getChainId(): Promise<number> {
|
|
219
|
-
return Promise.resolve(this.chainId);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Get the extended contract data for this contract.
|
|
224
|
-
* @param contractAddress - The contract data address.
|
|
225
|
-
* @returns The extended contract data or undefined if not found.
|
|
226
|
-
*/
|
|
227
|
-
async getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined> {
|
|
228
|
-
return await this.contractDataSource.getExtendedContractData(contractAddress);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Lookup the contract data for this contract.
|
|
233
|
-
* Contains the ethereum portal address .
|
|
234
|
-
* @param contractAddress - The contract data address.
|
|
235
|
-
* @returns The contract's address & portal address.
|
|
236
|
-
*/
|
|
237
|
-
public async getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined> {
|
|
238
|
-
return await this.contractDataSource.getContractData(contractAddress);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Gets up to `limit` amount of logs starting from `from`.
|
|
243
|
-
* @param from - Number of the L2 block to which corresponds the first logs to be returned.
|
|
244
|
-
* @param limit - The maximum number of logs to return.
|
|
245
|
-
* @param logType - Specifies whether to return encrypted or unencrypted logs.
|
|
246
|
-
* @returns The requested logs.
|
|
247
|
-
*/
|
|
248
|
-
public getLogs(from: number, limit: number, logType: LogType): Promise<L2BlockL2Logs[]> {
|
|
249
|
-
const logSource = logType === LogType.ENCRYPTED ? this.encryptedLogsSource : this.unencryptedLogsSource;
|
|
250
|
-
return logSource.getLogs(from, limit, logType);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Gets unencrypted logs based on the provided filter.
|
|
255
|
-
* @param filter - The filter to apply to the logs.
|
|
256
|
-
* @returns The requested logs.
|
|
257
|
-
*/
|
|
258
|
-
getUnencryptedLogs(filter: LogFilter): Promise<GetUnencryptedLogsResponse> {
|
|
259
|
-
return this.unencryptedLogsSource.getUnencryptedLogs(filter);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Method to submit a transaction to the p2p pool.
|
|
264
|
-
* @param tx - The transaction to be submitted.
|
|
265
|
-
*/
|
|
266
|
-
public async sendTx(tx: Tx) {
|
|
267
|
-
this.log.info(`Received tx ${await tx.getTxHash()}`);
|
|
268
|
-
await this.p2pClient!.sendTx(tx);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
public getTx(txHash: TxHash): Promise<L2Tx | undefined> {
|
|
272
|
-
return this.blockSource.getL2Tx(txHash);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Method to stop the aztec node.
|
|
277
|
-
*/
|
|
278
|
-
public async stop() {
|
|
279
|
-
this.log.info(`Stopping`);
|
|
280
|
-
await this.sequencer?.stop();
|
|
281
|
-
await this.p2pClient.stop();
|
|
282
|
-
await this.worldStateSynchronizer.stop();
|
|
283
|
-
await this.blockSource.stop();
|
|
284
|
-
this.log.info(`Stopped`);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Method to retrieve pending txs.
|
|
289
|
-
* @returns - The pending txs.
|
|
290
|
-
*/
|
|
291
|
-
public async getPendingTxs() {
|
|
292
|
-
return await this.p2pClient!.getTxs();
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Method to retrieve a single pending tx.
|
|
297
|
-
* @param txHash - The transaction hash to return.
|
|
298
|
-
* @returns - The pending tx if it exists.
|
|
299
|
-
*/
|
|
300
|
-
public async getPendingTxByHash(txHash: TxHash) {
|
|
301
|
-
return await this.p2pClient!.getTxByHash(txHash);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Find the index of the given leaf in the given tree.
|
|
306
|
-
* @param blockNumber - The block number at which to get the data
|
|
307
|
-
* @param treeId - The tree to search in.
|
|
308
|
-
* @param leafValue - The value to search for
|
|
309
|
-
* @returns The index of the given leaf in the given tree or undefined if not found.
|
|
310
|
-
*/
|
|
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);
|
|
317
|
-
return committedDb.findLeafIndex(treeId, leafValue.toBuffer());
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
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.
|
|
323
|
-
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
324
|
-
* @returns The sibling path for the leaf index.
|
|
325
|
-
*/
|
|
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);
|
|
331
|
-
return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
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.
|
|
337
|
-
* @param leafIndex - The index of the leaf for which the sibling path is required.
|
|
338
|
-
* @returns The sibling path for the leaf index.
|
|
339
|
-
*/
|
|
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);
|
|
359
|
-
return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Gets a confirmed/consumed L1 to L2 message for the given message key
|
|
364
|
-
* and its index in the merkle tree.
|
|
365
|
-
* @param messageKey - The message key.
|
|
366
|
-
* @returns The map containing the message and index.
|
|
367
|
-
*/
|
|
368
|
-
public async getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex> {
|
|
369
|
-
// todo: #697 - make this one lookup.
|
|
370
|
-
const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey))!;
|
|
371
|
-
const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
|
|
372
|
-
return Promise.resolve(new L1ToL2MessageAndIndex(index, message));
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
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.
|
|
378
|
-
* @param leafIndex - Index of the leaf in the tree.
|
|
379
|
-
* @returns The sibling path.
|
|
380
|
-
*/
|
|
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);
|
|
386
|
-
return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex);
|
|
387
|
-
}
|
|
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
|
-
|
|
484
|
-
/**
|
|
485
|
-
* Gets the storage value at the given contract storage slot.
|
|
486
|
-
*
|
|
487
|
-
* @remarks The storage slot here refers to the slot as it is defined in Noir not the index in the merkle tree.
|
|
488
|
-
* Aztec's version of `eth_getStorageAt`.
|
|
489
|
-
*
|
|
490
|
-
* @param contract - Address of the contract to query.
|
|
491
|
-
* @param slot - Slot to query.
|
|
492
|
-
* @returns Storage value at the given contract slot (or undefined if not found).
|
|
493
|
-
*/
|
|
494
|
-
public async getPublicStorageAt(contract: AztecAddress, slot: Fr): Promise<Fr | undefined> {
|
|
495
|
-
const committedDb = await this.#getWorldState('latest');
|
|
496
|
-
const leafIndex = computePublicDataTreeIndex(contract, slot);
|
|
497
|
-
const value = await committedDb.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex.value);
|
|
498
|
-
return value ? Fr.fromBuffer(value) : undefined;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
/**
|
|
502
|
-
* Returns the current committed roots for the data trees.
|
|
503
|
-
* @returns The current committed roots for the data trees.
|
|
504
|
-
*/
|
|
505
|
-
public async getTreeRoots(): Promise<Record<MerkleTreeId, Fr>> {
|
|
506
|
-
const committedDb = await this.#getWorldState('latest');
|
|
507
|
-
const getTreeRoot = async (id: MerkleTreeId) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
|
|
508
|
-
|
|
509
|
-
const [noteHashTree, nullifierTree, contractTree, l1ToL2MessagesTree, blocksTree, publicDataTree] =
|
|
510
|
-
await Promise.all([
|
|
511
|
-
getTreeRoot(MerkleTreeId.NOTE_HASH_TREE),
|
|
512
|
-
getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
|
|
513
|
-
getTreeRoot(MerkleTreeId.CONTRACT_TREE),
|
|
514
|
-
getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
515
|
-
getTreeRoot(MerkleTreeId.BLOCKS_TREE),
|
|
516
|
-
getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
|
|
517
|
-
]);
|
|
518
|
-
|
|
519
|
-
return {
|
|
520
|
-
[MerkleTreeId.CONTRACT_TREE]: contractTree,
|
|
521
|
-
[MerkleTreeId.NOTE_HASH_TREE]: noteHashTree,
|
|
522
|
-
[MerkleTreeId.NULLIFIER_TREE]: nullifierTree,
|
|
523
|
-
[MerkleTreeId.PUBLIC_DATA_TREE]: publicDataTree,
|
|
524
|
-
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: l1ToL2MessagesTree,
|
|
525
|
-
[MerkleTreeId.BLOCKS_TREE]: blocksTree,
|
|
526
|
-
};
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
/**
|
|
530
|
-
* Returns the currently committed block header.
|
|
531
|
-
* @returns The current committed block header.
|
|
532
|
-
*/
|
|
533
|
-
public async getBlockHeader(): Promise<BlockHeader> {
|
|
534
|
-
const committedDb = await this.#getWorldState('latest');
|
|
535
|
-
const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
|
|
536
|
-
|
|
537
|
-
return new BlockHeader(
|
|
538
|
-
roots[MerkleTreeId.NOTE_HASH_TREE],
|
|
539
|
-
roots[MerkleTreeId.NULLIFIER_TREE],
|
|
540
|
-
roots[MerkleTreeId.CONTRACT_TREE],
|
|
541
|
-
roots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE],
|
|
542
|
-
roots[MerkleTreeId.BLOCKS_TREE],
|
|
543
|
-
Fr.ZERO,
|
|
544
|
-
roots[MerkleTreeId.PUBLIC_DATA_TREE],
|
|
545
|
-
globalsHash,
|
|
546
|
-
);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
/**
|
|
550
|
-
* Simulates the public part of a transaction with the current state.
|
|
551
|
-
* @param tx - The transaction to simulate.
|
|
552
|
-
**/
|
|
553
|
-
public async simulatePublicCalls(tx: Tx) {
|
|
554
|
-
this.log.info(`Simulating tx ${await tx.getTxHash()}`);
|
|
555
|
-
const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
|
|
556
|
-
const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(new Fr(blockNumber));
|
|
557
|
-
const prevGlobalVariables = (await this.blockSource.getBlock(-1))?.globalVariables ?? GlobalVariables.empty();
|
|
558
|
-
|
|
559
|
-
// Instantiate merkle trees so uncommitted updates by this simulation are local to it.
|
|
560
|
-
// TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
|
|
561
|
-
// So simulation of public functions doesn't affect the merkle trees.
|
|
562
|
-
const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
|
|
563
|
-
const globalVariablesHash = computeGlobalsHash(prevGlobalVariables);
|
|
564
|
-
await merkleTrees.init({
|
|
565
|
-
globalVariablesHash,
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
const publicProcessorFactory = new PublicProcessorFactory(
|
|
569
|
-
merkleTrees.asLatest(),
|
|
570
|
-
this.contractDataSource,
|
|
571
|
-
this.l1ToL2MessageSource,
|
|
572
|
-
);
|
|
573
|
-
const processor = await publicProcessorFactory.create(prevGlobalVariables, newGlobalVariables);
|
|
574
|
-
const [, failedTxs] = await processor.process([tx]);
|
|
575
|
-
if (failedTxs.length) {
|
|
576
|
-
throw failedTxs[0].error;
|
|
577
|
-
}
|
|
578
|
-
this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
public setConfig(config: Partial<SequencerConfig>): Promise<void> {
|
|
582
|
-
this.sequencer?.updateSequencerConfig(config);
|
|
583
|
-
return Promise.resolve();
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
/**
|
|
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.
|
|
589
|
-
* @returns An instance of a committed MerkleTreeOperations
|
|
590
|
-
*/
|
|
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;
|
|
597
|
-
try {
|
|
598
|
-
// Attempt to sync the world state if necessary
|
|
599
|
-
blockSyncedTo = await this.#syncWorldState();
|
|
600
|
-
} catch (err) {
|
|
601
|
-
this.log.error(`Error getting world state: ${err}`);
|
|
602
|
-
}
|
|
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
|
-
}
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
/**
|
|
617
|
-
* Ensure we fully sync the world state
|
|
618
|
-
* @returns A promise that fulfils once the world state is synced
|
|
619
|
-
*/
|
|
620
|
-
async #syncWorldState(): Promise<number> {
|
|
621
|
-
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
622
|
-
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
623
|
-
}
|
|
624
|
-
}
|
package/src/bin/index.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env -S node --no-warnings
|
|
2
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
-
|
|
4
|
-
import http from 'http';
|
|
5
|
-
import Koa from 'koa';
|
|
6
|
-
import Router from 'koa-router';
|
|
7
|
-
|
|
8
|
-
import { AztecNodeConfig, AztecNodeService, createAztecNodeRpcServer, getConfigEnvVars } from '../index.js';
|
|
9
|
-
|
|
10
|
-
const { AZTEC_NODE_PORT = 8081, API_PREFIX = '' } = process.env;
|
|
11
|
-
|
|
12
|
-
const logger = createDebugLogger('aztec:node');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Creates the node from provided config
|
|
16
|
-
*/
|
|
17
|
-
async function createAndDeployAztecNode() {
|
|
18
|
-
const aztecNodeConfig: AztecNodeConfig = { ...getConfigEnvVars() };
|
|
19
|
-
|
|
20
|
-
return await AztecNodeService.createAndSync(aztecNodeConfig);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Creates a router for helper API endpoints of the Private eXecution Environment (PXE).
|
|
25
|
-
* @param apiPrefix - The prefix to use for all api requests
|
|
26
|
-
* @returns - The router for handling status requests.
|
|
27
|
-
*/
|
|
28
|
-
export function createStatusRouter(apiPrefix: string) {
|
|
29
|
-
const router = new Router({ prefix: `${apiPrefix}` });
|
|
30
|
-
router.get('/status', (ctx: Koa.Context) => {
|
|
31
|
-
ctx.status = 200;
|
|
32
|
-
});
|
|
33
|
-
return router;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Create and start a new Aztec Node HTTP Server
|
|
38
|
-
*/
|
|
39
|
-
async function main() {
|
|
40
|
-
logger.info(`Setting up Aztec Node...`);
|
|
41
|
-
|
|
42
|
-
const aztecNode = await createAndDeployAztecNode();
|
|
43
|
-
|
|
44
|
-
const shutdown = async () => {
|
|
45
|
-
logger.info('Shutting down...');
|
|
46
|
-
await aztecNode.stop();
|
|
47
|
-
process.exit(0);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
process.once('SIGINT', shutdown);
|
|
51
|
-
process.once('SIGTERM', shutdown);
|
|
52
|
-
|
|
53
|
-
const rpcServer = createAztecNodeRpcServer(aztecNode);
|
|
54
|
-
const app = rpcServer.getApp(API_PREFIX);
|
|
55
|
-
const apiRouter = createStatusRouter(API_PREFIX);
|
|
56
|
-
app.use(apiRouter.routes());
|
|
57
|
-
app.use(apiRouter.allowedMethods());
|
|
58
|
-
|
|
59
|
-
const httpServer = http.createServer(app.callback());
|
|
60
|
-
httpServer.listen(+AZTEC_NODE_PORT);
|
|
61
|
-
logger.info(`Aztec Node JSON-RPC Server listening on port ${AZTEC_NODE_PORT}`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
main().catch(err => {
|
|
65
|
-
logger.error(err);
|
|
66
|
-
process.exit(1);
|
|
67
|
-
});
|
package/src/declaration.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2
|
-
import { RootDatabaseOptionsWithPath } from 'lmdb';
|
|
3
|
-
|
|
4
|
-
// The problem is this snippet `nodeDb = open({});` in src/aztec-node/db.ts
|
|
5
|
-
// tsc compiles this code fine, but ts-jest can't.
|
|
6
|
-
// This is a mixture for two bugs:
|
|
7
|
-
// - the first in ts-jest, it gets confused by packages with mixed CJS and ESM type exports - https://github.com/kulshekhar/ts-jest/issues/4221
|
|
8
|
-
// - the second in lmdb, it outputs different CJS and ESM types - https://github.com/kriszyp/lmdb-js/issues/243#issuecomment-1823585586
|
|
9
|
-
|
|
10
|
-
declare module 'lmdb' {
|
|
11
|
-
/* eslint-disable jsdoc/require-jsdoc */
|
|
12
|
-
interface RootDatabaseOptionsWithPath {
|
|
13
|
-
path?: string;
|
|
14
|
-
}
|
|
15
|
-
/* eslint-enable jsdoc/require-jsdoc */
|
|
16
|
-
}
|
package/src/index.ts
DELETED