@aztec/aztec-node 0.23.0 → 0.26.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"http_rpc_server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/http_rpc_server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAYV,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,iBAwBvD"}
1
+ {"version":3,"file":"http_rpc_server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/http_rpc_server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAcV,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,iBAwBvD"}
@@ -1,4 +1,4 @@
1
- import { ContractData, ExtendedContractData, ExtendedUnencryptedL2Log, L1ToL2MessageAndIndex, L2Block, L2BlockL2Logs, L2Tx, LogId, SiblingPath, Tx, TxHash, } from '@aztec/circuit-types';
1
+ import { ContractData, ExtendedContractData, ExtendedUnencryptedL2Log, L1ToL2MessageAndIndex, L2Block, L2BlockL2Logs, LogId, NullifierMembershipWitness, SiblingPath, Tx, TxEffect, TxHash, TxReceipt, } from '@aztec/circuit-types';
2
2
  import { FunctionSelector, Header } from '@aztec/circuits.js';
3
3
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -20,14 +20,14 @@ export function createAztecNodeRpcServer(node) {
20
20
  FunctionSelector,
21
21
  Header,
22
22
  L2Block,
23
- L2Tx,
23
+ TxEffect,
24
24
  LogId,
25
25
  TxHash,
26
26
  SiblingPath,
27
27
  L1ToL2MessageAndIndex,
28
- }, { Tx, L2BlockL2Logs },
28
+ }, { Tx, TxReceipt, L2BlockL2Logs, NullifierMembershipWitness },
29
29
  // disable methods not part of the AztecNode interface
30
30
  ['start', 'stop']);
31
31
  return rpc;
32
32
  }
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cF9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLFdBQVcsRUFDWCxFQUFFLEVBQ0YsTUFBTSxHQUNQLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVsRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQWU7SUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFhLENBQzNCLElBQUksRUFDSjtRQUNFLFlBQVk7UUFDWixVQUFVO1FBQ1Ysb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixZQUFZO1FBQ1osRUFBRTtRQUNGLGdCQUFnQjtRQUNoQixNQUFNO1FBQ04sT0FBTztRQUNQLElBQUk7UUFDSixLQUFLO1FBQ0wsTUFBTTtRQUNOLFdBQVc7UUFDWCxxQkFBcUI7S0FDdEIsRUFDRCxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUU7SUFDckIsc0RBQXNEO0lBQ3RELENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNsQixDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIn0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cF9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLGFBQWEsRUFDYixLQUFLLEVBQ0wsMEJBQTBCLEVBQzFCLFdBQVcsRUFDWCxFQUFFLEVBQ0YsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWxFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsSUFBZTtJQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQWEsQ0FDM0IsSUFBSSxFQUNKO1FBQ0UsWUFBWTtRQUNaLFVBQVU7UUFDVixvQkFBb0I7UUFDcEIsd0JBQXdCO1FBQ3hCLFlBQVk7UUFDWixFQUFFO1FBQ0YsZ0JBQWdCO1FBQ2hCLE1BQU07UUFDTixPQUFPO1FBQ1AsUUFBUTtRQUNSLEtBQUs7UUFDTCxNQUFNO1FBQ04sV0FBVztRQUNYLHFCQUFxQjtLQUN0QixFQUNELEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsMEJBQTBCLEVBQUU7SUFDNUQsc0RBQXNEO0lBQ3RELENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNsQixDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIn0=
@@ -1,4 +1,4 @@
1
- import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, L2Tx, LogFilter, LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, SequencerConfig, SiblingPath, Tx, TxHash } from '@aztec/circuit-types';
1
+ import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, LogFilter, LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, SequencerConfig, SiblingPath, Tx, TxEffect, TxHash, TxReceipt } from '@aztec/circuit-types';
2
2
  import { ARCHIVE_HEIGHT, CONTRACT_TREE_HEIGHT, Fr, Header, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/circuits.js';
3
3
  import { L1ContractAddresses } from '@aztec/ethereum';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
@@ -111,7 +111,8 @@ export declare class AztecNodeService implements AztecNode {
111
111
  * @param tx - The transaction to be submitted.
112
112
  */
113
113
  sendTx(tx: Tx): Promise<void>;
114
- getTx(txHash: TxHash): Promise<L2Tx | undefined>;
114
+ getTxReceipt(txHash: TxHash): Promise<TxReceipt>;
115
+ getTxEffect(txHash: TxHash): Promise<TxEffect | undefined>;
115
116
  /**
116
117
  * Method to stop the aztec node.
117
118
  */
@@ -157,12 +158,12 @@ export declare class AztecNodeService implements AztecNode {
157
158
  */
158
159
  getNoteHashSiblingPath(blockNumber: number | 'latest', leafIndex: bigint): Promise<SiblingPath<typeof NOTE_HASH_TREE_HEIGHT>>;
159
160
  /**
160
- * Gets a confirmed/consumed L1 to L2 message for the given message key
161
+ * Gets a confirmed/consumed L1 to L2 message for the given entry key
161
162
  * and its index in the merkle tree.
162
- * @param messageKey - The message key.
163
+ * @param entryKey - The entry key.
163
164
  * @returns The map containing the message and index.
164
165
  */
165
- getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex>;
166
+ getL1ToL2MessageAndIndex(entryKey: Fr): Promise<L1ToL2MessageAndIndex>;
166
167
  /**
167
168
  * Returns a sibling path for a leaf in the committed l1 to l2 data tree.
168
169
  * @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":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  var _AztecNodeService_instances, _AztecNodeService_getWorldState, _AztecNodeService_syncWorldState;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
3
  import { Archiver, KVArchiverDataStore, createArchiverClient } from '@aztec/archiver';
4
- import { INITIAL_L2_BLOCK_NUM, L1ToL2MessageAndIndex, LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, } from '@aztec/circuit-types';
5
- import { EthAddress, Fr, } from '@aztec/circuits.js';
6
- import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/abis';
4
+ import { L1ToL2MessageAndIndex, LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, TxReceipt, TxStatus, } from '@aztec/circuit-types';
5
+ import { EthAddress, Fr, INITIAL_L2_BLOCK_NUM, } from '@aztec/circuits.js';
6
+ import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
7
7
  import { createEthereumChain } from '@aztec/ethereum';
8
8
  import { AztecAddress } from '@aztec/foundation/aztec-address';
9
9
  import { createDebugLogger } from '@aztec/foundation/log';
@@ -37,7 +37,8 @@ export class AztecNodeService {
37
37
  `Registry: ${config.l1Contracts.registryAddress.toString()}\n` +
38
38
  `Inbox: ${config.l1Contracts.inboxAddress.toString()}\n` +
39
39
  `Outbox: ${config.l1Contracts.outboxAddress.toString()}\n` +
40
- `Contract Emitter: ${config.l1Contracts.contractDeploymentEmitterAddress.toString()}`;
40
+ `Contract Emitter: ${config.l1Contracts.contractDeploymentEmitterAddress.toString()}\n` +
41
+ `Availability Oracle: ${config.l1Contracts.availabilityOracleAddress.toString()}`;
41
42
  this.log(message);
42
43
  }
43
44
  /**
@@ -186,11 +187,26 @@ export class AztecNodeService {
186
187
  * @param tx - The transaction to be submitted.
187
188
  */
188
189
  async sendTx(tx) {
189
- this.log.info(`Received tx ${await tx.getTxHash()}`);
190
+ this.log.info(`Received tx ${tx.getTxHash()}`);
190
191
  await this.p2pClient.sendTx(tx);
191
192
  }
192
- getTx(txHash) {
193
- return this.blockSource.getL2Tx(txHash);
193
+ async getTxReceipt(txHash) {
194
+ let txReceipt = new TxReceipt(txHash, TxStatus.DROPPED, 'Tx dropped by P2P node.');
195
+ // We first check if the tx is in pending (instead of first checking if it is mined) because if we first check
196
+ // for mined and then for pending there could be a race condition where the tx is mined between the two checks
197
+ // and we would incorrectly return a TxReceipt with status DROPPED
198
+ const pendingTx = await this.getPendingTxByHash(txHash);
199
+ if (pendingTx) {
200
+ txReceipt = new TxReceipt(txHash, TxStatus.PENDING, '');
201
+ }
202
+ const settledTxReceipt = await this.blockSource.getSettledTxReceipt(txHash);
203
+ if (settledTxReceipt) {
204
+ txReceipt = settledTxReceipt;
205
+ }
206
+ return txReceipt;
207
+ }
208
+ getTxEffect(txHash) {
209
+ return this.blockSource.getTxEffect(txHash);
194
210
  }
195
211
  /**
196
212
  * Method to stop the aztec node.
@@ -260,15 +276,15 @@ export class AztecNodeService {
260
276
  return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
261
277
  }
262
278
  /**
263
- * Gets a confirmed/consumed L1 to L2 message for the given message key
279
+ * Gets a confirmed/consumed L1 to L2 message for the given entry key
264
280
  * and its index in the merkle tree.
265
- * @param messageKey - The message key.
281
+ * @param entryKey - The entry key.
266
282
  * @returns The map containing the message and index.
267
283
  */
268
- async getL1ToL2MessageAndIndex(messageKey) {
284
+ async getL1ToL2MessageAndIndex(entryKey) {
269
285
  // todo: #697 - make this one lookup.
270
- const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGE_TREE, messageKey));
271
- const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
286
+ const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGE_TREE, entryKey));
287
+ const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(entryKey);
272
288
  return Promise.resolve(new L1ToL2MessageAndIndex(index, message));
273
289
  }
274
290
  /**
@@ -399,7 +415,7 @@ export class AztecNodeService {
399
415
  * @param tx - The transaction to simulate.
400
416
  **/
401
417
  async simulatePublicCalls(tx) {
402
- this.log.info(`Simulating tx ${await tx.getTxHash()}`);
418
+ this.log.info(`Simulating tx ${tx.getTxHash()}`);
403
419
  const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
404
420
  // If sequencer is not initialized, we just set these values to zero for simulation.
405
421
  const coinbase = this.sequencer?.coinbase || EthAddress.ZERO;
@@ -416,7 +432,7 @@ export class AztecNodeService {
416
432
  if (failedTxs.length) {
417
433
  throw failedTxs[0].error;
418
434
  }
419
- this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
435
+ this.log.info(`Simulated tx ${tx.getTxHash()} succeeds`);
420
436
  }
421
437
  setConfig(config) {
422
438
  this.sequencer?.updateSequencerConfig(config);
@@ -462,4 +478,4 @@ async function _AztecNodeService_syncWorldState() {
462
478
  const blockSourceHeight = await this.blockSource.getBlockNumber();
463
479
  return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
464
480
  };
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFpQixRQUFRLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRyxPQUFPLEVBTUwsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQVFyQixPQUFPLEVBQ1AsWUFBWSxFQUNaLDBCQUEwQixFQUMxQixpQkFBaUIsR0FLbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBR0wsVUFBVSxFQUNWLEVBQUUsR0FRSCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQU8sZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pFLE9BQU8sRUFFTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLHdCQUF3QixHQUN6QixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsNEJBQTRCLEVBRzVCLGdCQUFnQixJQUFJLG1CQUFtQixHQUN4QyxNQUFNLG9CQUFvQixDQUFDO0FBSTVCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixZQUNxQixNQUF1QixFQUN2QixTQUFjLEVBQ2QsV0FBMEIsRUFDMUIsbUJBQWlDLEVB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
481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFpQixRQUFRLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRyxPQUFPLEVBTUwscUJBQXFCLEVBT3JCLE9BQU8sRUFDUCxZQUFZLEVBQ1osMEJBQTBCLEVBQzFCLGlCQUFpQixFQU1qQixTQUFTLEVBQ1QsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUdMLFVBQVUsRUFDVixFQUFFLEVBRUYsb0JBQW9CLEdBT3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUF1QixtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBTyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDakUsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFJNUI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ3FCLE1BQXVCLEVBQ3ZCLFNBQWMsRUFDZCxX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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/aztec-node",
3
- "version": "0.23.0",
3
+ "version": "0.26.1",
4
4
  "main": "dest/index.js",
5
5
  "type": "module",
6
6
  "exports": "./dest/index.js",
@@ -33,18 +33,18 @@
33
33
  "rootDir": "./src"
34
34
  },
35
35
  "dependencies": {
36
- "@aztec/archiver": "0.23.0",
37
- "@aztec/circuit-types": "0.23.0",
38
- "@aztec/circuits.js": "0.23.0",
39
- "@aztec/ethereum": "0.23.0",
40
- "@aztec/foundation": "0.23.0",
41
- "@aztec/kv-store": "0.23.0",
42
- "@aztec/l1-artifacts": "0.23.0",
43
- "@aztec/merkle-tree": "0.23.0",
44
- "@aztec/p2p": "0.23.0",
45
- "@aztec/sequencer-client": "0.23.0",
46
- "@aztec/types": "0.23.0",
47
- "@aztec/world-state": "0.23.0",
36
+ "@aztec/archiver": "0.26.1",
37
+ "@aztec/circuit-types": "0.26.1",
38
+ "@aztec/circuits.js": "0.26.1",
39
+ "@aztec/ethereum": "0.26.1",
40
+ "@aztec/foundation": "0.26.1",
41
+ "@aztec/kv-store": "0.26.1",
42
+ "@aztec/l1-artifacts": "0.26.1",
43
+ "@aztec/merkle-tree": "0.26.1",
44
+ "@aztec/p2p": "0.26.1",
45
+ "@aztec/sequencer-client": "0.26.1",
46
+ "@aztec/types": "0.26.1",
47
+ "@aztec/world-state": "0.26.1",
48
48
  "koa": "^2.14.2",
49
49
  "koa-router": "^12.0.0",
50
50
  "tslib": "^2.4.0"
@@ -0,0 +1,35 @@
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
+ /** A URL for an archiver service that the node will use. */
16
+ archiverUrl?: string;
17
+ };
18
+
19
+ /**
20
+ * Returns the config of the aztec node from environment variables with reasonable defaults.
21
+ * @returns A valid aztec node config.
22
+ */
23
+ export function getConfigEnvVars(): AztecNodeConfig {
24
+ const { SEQ_DISABLED } = process.env;
25
+ const allEnvVars: AztecNodeConfig = {
26
+ ...getSequencerVars(),
27
+ ...getArchiverVars(),
28
+ ...getP2PConfigEnvVars(),
29
+ ...getWorldStateVars(),
30
+ disableSequencer: !!SEQ_DISABLED,
31
+ archiverUrl: process.env.ARCHIVER_URL,
32
+ };
33
+
34
+ return allEnvVars;
35
+ }
@@ -0,0 +1,52 @@
1
+ import {
2
+ AztecNode,
3
+ ContractData,
4
+ ExtendedContractData,
5
+ ExtendedUnencryptedL2Log,
6
+ L1ToL2MessageAndIndex,
7
+ L2Block,
8
+ L2BlockL2Logs,
9
+ LogId,
10
+ NullifierMembershipWitness,
11
+ SiblingPath,
12
+ Tx,
13
+ TxEffect,
14
+ TxHash,
15
+ TxReceipt,
16
+ } from '@aztec/circuit-types';
17
+ import { FunctionSelector, Header } from '@aztec/circuits.js';
18
+ import { AztecAddress } from '@aztec/foundation/aztec-address';
19
+ import { EthAddress } from '@aztec/foundation/eth-address';
20
+ import { Fr } from '@aztec/foundation/fields';
21
+ import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
22
+
23
+ /**
24
+ * Wrap an AztecNode instance with a JSON RPC HTTP server.
25
+ * @param node - The AztecNode
26
+ * @returns An JSON-RPC HTTP server
27
+ */
28
+ export function createAztecNodeRpcServer(node: AztecNode) {
29
+ const rpc = new JsonRpcServer(
30
+ node,
31
+ {
32
+ AztecAddress,
33
+ EthAddress,
34
+ ExtendedContractData,
35
+ ExtendedUnencryptedL2Log,
36
+ ContractData,
37
+ Fr,
38
+ FunctionSelector,
39
+ Header,
40
+ L2Block,
41
+ TxEffect,
42
+ LogId,
43
+ TxHash,
44
+ SiblingPath,
45
+ L1ToL2MessageAndIndex,
46
+ },
47
+ { Tx, TxReceipt, L2BlockL2Logs, NullifierMembershipWitness },
48
+ // disable methods not part of the AztecNode interface
49
+ ['start', 'stop'],
50
+ );
51
+ return rpc;
52
+ }
@@ -0,0 +1,660 @@
1
+ import { ArchiveSource, Archiver, KVArchiverDataStore, createArchiverClient } from '@aztec/archiver';
2
+ import {
3
+ AztecNode,
4
+ ContractData,
5
+ ContractDataSource,
6
+ ExtendedContractData,
7
+ GetUnencryptedLogsResponse,
8
+ L1ToL2MessageAndIndex,
9
+ L1ToL2MessageSource,
10
+ L2Block,
11
+ L2BlockL2Logs,
12
+ L2BlockSource,
13
+ L2LogsSource,
14
+ LogFilter,
15
+ LogType,
16
+ MerkleTreeId,
17
+ NullifierMembershipWitness,
18
+ PublicDataWitness,
19
+ SequencerConfig,
20
+ SiblingPath,
21
+ Tx,
22
+ TxEffect,
23
+ TxHash,
24
+ TxReceipt,
25
+ TxStatus,
26
+ } from '@aztec/circuit-types';
27
+ import {
28
+ ARCHIVE_HEIGHT,
29
+ CONTRACT_TREE_HEIGHT,
30
+ EthAddress,
31
+ Fr,
32
+ Header,
33
+ INITIAL_L2_BLOCK_NUM,
34
+ L1_TO_L2_MSG_TREE_HEIGHT,
35
+ NOTE_HASH_TREE_HEIGHT,
36
+ NULLIFIER_TREE_HEIGHT,
37
+ NullifierLeafPreimage,
38
+ PUBLIC_DATA_TREE_HEIGHT,
39
+ PublicDataTreeLeafPreimage,
40
+ } from '@aztec/circuits.js';
41
+ import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
42
+ import { L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
43
+ import { AztecAddress } from '@aztec/foundation/aztec-address';
44
+ import { createDebugLogger } from '@aztec/foundation/log';
45
+ import { AztecKVStore } from '@aztec/kv-store';
46
+ import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
47
+ import { initStoreForRollup } from '@aztec/kv-store/utils';
48
+ import { AztecKVTxPool, P2P, createP2PClient } from '@aztec/p2p';
49
+ import {
50
+ GlobalVariableBuilder,
51
+ PublicProcessorFactory,
52
+ SequencerClient,
53
+ getGlobalVariableBuilder,
54
+ } from '@aztec/sequencer-client';
55
+ import { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/types/contracts';
56
+ import {
57
+ MerkleTrees,
58
+ ServerWorldStateSynchronizer,
59
+ WorldStateConfig,
60
+ WorldStateSynchronizer,
61
+ getConfigEnvVars as getWorldStateConfig,
62
+ } from '@aztec/world-state';
63
+
64
+ import { AztecNodeConfig } from './config.js';
65
+
66
+ /**
67
+ * The aztec node.
68
+ */
69
+ export class AztecNodeService implements AztecNode {
70
+ constructor(
71
+ protected readonly config: AztecNodeConfig,
72
+ protected readonly p2pClient: P2P,
73
+ protected readonly blockSource: L2BlockSource,
74
+ protected readonly encryptedLogsSource: L2LogsSource,
75
+ protected readonly unencryptedLogsSource: L2LogsSource,
76
+ protected readonly contractDataSource: ContractDataSource,
77
+ protected readonly l1ToL2MessageSource: L1ToL2MessageSource,
78
+ protected readonly worldStateSynchronizer: WorldStateSynchronizer,
79
+ protected readonly sequencer: SequencerClient | undefined,
80
+ protected readonly chainId: number,
81
+ protected readonly version: number,
82
+ protected readonly globalVariableBuilder: GlobalVariableBuilder,
83
+ protected readonly merkleTreesDb: AztecKVStore,
84
+ private log = createDebugLogger('aztec:node'),
85
+ ) {
86
+ const message =
87
+ `Started Aztec Node against chain 0x${chainId.toString(16)} with contracts - \n` +
88
+ `Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
89
+ `Registry: ${config.l1Contracts.registryAddress.toString()}\n` +
90
+ `Inbox: ${config.l1Contracts.inboxAddress.toString()}\n` +
91
+ `Outbox: ${config.l1Contracts.outboxAddress.toString()}\n` +
92
+ `Contract Emitter: ${config.l1Contracts.contractDeploymentEmitterAddress.toString()}\n` +
93
+ `Availability Oracle: ${config.l1Contracts.availabilityOracleAddress.toString()}`;
94
+ this.log(message);
95
+ }
96
+
97
+ /**
98
+ * initializes the Aztec Node, wait for component to sync.
99
+ * @param config - The configuration to be used by the aztec node.
100
+ * @returns - A fully synced Aztec Node for use in development/testing.
101
+ */
102
+ public static async createAndSync(config: AztecNodeConfig) {
103
+ const ethereumChain = createEthereumChain(config.rpcUrl, config.apiKey);
104
+ //validate that the actual chain id matches that specified in configuration
105
+ if (config.chainId !== ethereumChain.chainInfo.id) {
106
+ throw new Error(
107
+ `RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.chainId}`,
108
+ );
109
+ }
110
+
111
+ const log = createDebugLogger('aztec:node');
112
+ const storeLog = createDebugLogger('aztec:node:lmdb');
113
+ const store = await initStoreForRollup(
114
+ AztecLmdbStore.open(config.dataDirectory, storeLog),
115
+ config.l1Contracts.rollupAddress,
116
+ storeLog,
117
+ );
118
+
119
+ let archiver: ArchiveSource;
120
+ if (!config.archiverUrl) {
121
+ // first create and sync the archiver
122
+ const archiverStore = new KVArchiverDataStore(store, config.maxLogs);
123
+ archiver = await Archiver.createAndSync(config, archiverStore, true);
124
+ } else {
125
+ archiver = createArchiverClient(config.archiverUrl);
126
+ }
127
+
128
+ // we identify the P2P transaction protocol by using the rollup contract address.
129
+ // this may well change in future
130
+ config.transactionProtocol = `/aztec/tx/${config.l1Contracts.rollupAddress.toString()}`;
131
+
132
+ // create the tx pool and the p2p client, which will need the l2 block source
133
+ const p2pClient = await createP2PClient(store, config, new AztecKVTxPool(store), archiver);
134
+
135
+ // now create the merkle trees and the world state synchronizer
136
+ const merkleTrees = await MerkleTrees.new(store);
137
+ const worldStateConfig: WorldStateConfig = getWorldStateConfig();
138
+ const worldStateSynchronizer = new ServerWorldStateSynchronizer(store, merkleTrees, archiver, worldStateConfig);
139
+
140
+ // start both and wait for them to sync from the block source
141
+ await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
142
+
143
+ // now create the sequencer
144
+ const sequencer = config.disableSequencer
145
+ ? undefined
146
+ : await SequencerClient.new(config, p2pClient, worldStateSynchronizer, archiver, archiver, archiver);
147
+
148
+ return new AztecNodeService(
149
+ config,
150
+ p2pClient,
151
+ archiver,
152
+ archiver,
153
+ archiver,
154
+ archiver,
155
+ archiver,
156
+ worldStateSynchronizer,
157
+ sequencer,
158
+ ethereumChain.chainInfo.id,
159
+ config.version,
160
+ getGlobalVariableBuilder(config),
161
+ store,
162
+ log,
163
+ );
164
+ }
165
+
166
+ /**
167
+ * Returns the sequencer client instance.
168
+ * @returns The sequencer client instance.
169
+ */
170
+ public getSequencer(): SequencerClient | undefined {
171
+ return this.sequencer;
172
+ }
173
+
174
+ /**
175
+ * Method to return the currently deployed L1 contract addresses.
176
+ * @returns - The currently deployed L1 contract addresses.
177
+ */
178
+ public getL1ContractAddresses(): Promise<L1ContractAddresses> {
179
+ return Promise.resolve(this.config.l1Contracts);
180
+ }
181
+
182
+ /**
183
+ * Method to determine if the node is ready to accept transactions.
184
+ * @returns - Flag indicating the readiness for tx submission.
185
+ */
186
+ public async isReady() {
187
+ return (await this.p2pClient.isReady()) ?? false;
188
+ }
189
+
190
+ /**
191
+ * Get a block specified by its number.
192
+ * @param number - The block number being requested.
193
+ * @returns The requested block.
194
+ */
195
+ public async getBlock(number: number): Promise<L2Block | undefined> {
196
+ return await this.blockSource.getBlock(number);
197
+ }
198
+
199
+ /**
200
+ * Method to request blocks. Will attempt to return all requested blocks but will return only those available.
201
+ * @param from - The start of the range of blocks to return.
202
+ * @param limit - The maximum number of blocks to obtain.
203
+ * @returns The blocks requested.
204
+ */
205
+ public async getBlocks(from: number, limit: number): Promise<L2Block[]> {
206
+ return (await this.blockSource.getBlocks(from, limit)) ?? [];
207
+ }
208
+
209
+ /**
210
+ * Method to fetch the current block number.
211
+ * @returns The block number.
212
+ */
213
+ public async getBlockNumber(): Promise<number> {
214
+ return await this.blockSource.getBlockNumber();
215
+ }
216
+
217
+ /**
218
+ * Method to fetch the version of the rollup the node is connected to.
219
+ * @returns The rollup version.
220
+ */
221
+ public getVersion(): Promise<number> {
222
+ return Promise.resolve(this.version);
223
+ }
224
+
225
+ /**
226
+ * Method to fetch the chain id of the base-layer for the rollup.
227
+ * @returns The chain id.
228
+ */
229
+ public getChainId(): Promise<number> {
230
+ return Promise.resolve(this.chainId);
231
+ }
232
+
233
+ /**
234
+ * Get the extended contract data for this contract.
235
+ * @param contractAddress - The contract data address.
236
+ * @returns The extended contract data or undefined if not found.
237
+ */
238
+ async getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined> {
239
+ return await this.contractDataSource.getExtendedContractData(contractAddress);
240
+ }
241
+
242
+ /**
243
+ * Lookup the contract data for this contract.
244
+ * Contains the ethereum portal address .
245
+ * @param contractAddress - The contract data address.
246
+ * @returns The contract's address & portal address.
247
+ */
248
+ public async getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined> {
249
+ return await this.contractDataSource.getContractData(contractAddress);
250
+ }
251
+
252
+ public getContractClass(id: Fr): Promise<ContractClassPublic | undefined> {
253
+ return this.contractDataSource.getContractClass(id);
254
+ }
255
+
256
+ public getContract(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
257
+ return this.contractDataSource.getContract(address);
258
+ }
259
+
260
+ /**
261
+ * Gets up to `limit` amount of logs starting from `from`.
262
+ * @param from - Number of the L2 block to which corresponds the first logs to be returned.
263
+ * @param limit - The maximum number of logs to return.
264
+ * @param logType - Specifies whether to return encrypted or unencrypted logs.
265
+ * @returns The requested logs.
266
+ */
267
+ public getLogs(from: number, limit: number, logType: LogType): Promise<L2BlockL2Logs[]> {
268
+ const logSource = logType === LogType.ENCRYPTED ? this.encryptedLogsSource : this.unencryptedLogsSource;
269
+ return logSource.getLogs(from, limit, logType);
270
+ }
271
+
272
+ /**
273
+ * Gets unencrypted logs based on the provided filter.
274
+ * @param filter - The filter to apply to the logs.
275
+ * @returns The requested logs.
276
+ */
277
+ getUnencryptedLogs(filter: LogFilter): Promise<GetUnencryptedLogsResponse> {
278
+ return this.unencryptedLogsSource.getUnencryptedLogs(filter);
279
+ }
280
+
281
+ /**
282
+ * Method to submit a transaction to the p2p pool.
283
+ * @param tx - The transaction to be submitted.
284
+ */
285
+ public async sendTx(tx: Tx) {
286
+ this.log.info(`Received tx ${tx.getTxHash()}`);
287
+ await this.p2pClient!.sendTx(tx);
288
+ }
289
+
290
+ public async getTxReceipt(txHash: TxHash): Promise<TxReceipt> {
291
+ let txReceipt = new TxReceipt(txHash, TxStatus.DROPPED, 'Tx dropped by P2P node.');
292
+
293
+ // We first check if the tx is in pending (instead of first checking if it is mined) because if we first check
294
+ // for mined and then for pending there could be a race condition where the tx is mined between the two checks
295
+ // and we would incorrectly return a TxReceipt with status DROPPED
296
+ const pendingTx = await this.getPendingTxByHash(txHash);
297
+ if (pendingTx) {
298
+ txReceipt = new TxReceipt(txHash, TxStatus.PENDING, '');
299
+ }
300
+
301
+ const settledTxReceipt = await this.blockSource.getSettledTxReceipt(txHash);
302
+ if (settledTxReceipt) {
303
+ txReceipt = settledTxReceipt;
304
+ }
305
+
306
+ return txReceipt;
307
+ }
308
+
309
+ public getTxEffect(txHash: TxHash): Promise<TxEffect | undefined> {
310
+ return this.blockSource.getTxEffect(txHash);
311
+ }
312
+
313
+ /**
314
+ * Method to stop the aztec node.
315
+ */
316
+ public async stop() {
317
+ this.log.info(`Stopping`);
318
+ await this.sequencer?.stop();
319
+ await this.p2pClient.stop();
320
+ await this.worldStateSynchronizer.stop();
321
+ await this.blockSource.stop();
322
+ this.log.info(`Stopped`);
323
+ }
324
+
325
+ /**
326
+ * Method to retrieve pending txs.
327
+ * @returns - The pending txs.
328
+ */
329
+ public async getPendingTxs() {
330
+ return await this.p2pClient!.getTxs();
331
+ }
332
+
333
+ /**
334
+ * Method to retrieve a single pending tx.
335
+ * @param txHash - The transaction hash to return.
336
+ * @returns - The pending tx if it exists.
337
+ */
338
+ public async getPendingTxByHash(txHash: TxHash) {
339
+ return await this.p2pClient!.getTxByHash(txHash);
340
+ }
341
+
342
+ /**
343
+ * Find the index of the given leaf in the given tree.
344
+ * @param blockNumber - The block number at which to get the data
345
+ * @param treeId - The tree to search in.
346
+ * @param leafValue - The value to search for
347
+ * @returns The index of the given leaf in the given tree or undefined if not found.
348
+ */
349
+ public async findLeafIndex(
350
+ blockNumber: number | 'latest',
351
+ treeId: MerkleTreeId,
352
+ leafValue: Fr,
353
+ ): Promise<bigint | undefined> {
354
+ const committedDb = await this.#getWorldState(blockNumber);
355
+ return committedDb.findLeafIndex(treeId, leafValue.toBuffer());
356
+ }
357
+
358
+ /**
359
+ * Returns a sibling path for the given index in the contract tree.
360
+ * @param blockNumber - The block number at which to get the data.
361
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
362
+ * @returns The sibling path for the leaf index.
363
+ */
364
+ public async getContractSiblingPath(
365
+ blockNumber: number | 'latest',
366
+ leafIndex: bigint,
367
+ ): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>> {
368
+ const committedDb = await this.#getWorldState(blockNumber);
369
+ return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
370
+ }
371
+
372
+ /**
373
+ * Returns a sibling path for the given index in the nullifier tree.
374
+ * @param blockNumber - The block number at which to get the data.
375
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
376
+ * @returns The sibling path for the leaf index.
377
+ */
378
+ public async getNullifierSiblingPath(
379
+ blockNumber: number | 'latest',
380
+ leafIndex: bigint,
381
+ ): Promise<SiblingPath<typeof NULLIFIER_TREE_HEIGHT>> {
382
+ const committedDb = await this.#getWorldState(blockNumber);
383
+ return committedDb.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, leafIndex);
384
+ }
385
+
386
+ /**
387
+ * Returns a sibling path for the given index in the data tree.
388
+ * @param blockNumber - The block number at which to get the data.
389
+ * @param leafIndex - The index of the leaf for which the sibling path is required.
390
+ * @returns The sibling path for the leaf index.
391
+ */
392
+ public async getNoteHashSiblingPath(
393
+ blockNumber: number | 'latest',
394
+ leafIndex: bigint,
395
+ ): Promise<SiblingPath<typeof NOTE_HASH_TREE_HEIGHT>> {
396
+ const committedDb = await this.#getWorldState(blockNumber);
397
+ return committedDb.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
398
+ }
399
+
400
+ /**
401
+ * Gets a confirmed/consumed L1 to L2 message for the given entry key
402
+ * and its index in the merkle tree.
403
+ * @param entryKey - The entry key.
404
+ * @returns The map containing the message and index.
405
+ */
406
+ public async getL1ToL2MessageAndIndex(entryKey: Fr): Promise<L1ToL2MessageAndIndex> {
407
+ // todo: #697 - make this one lookup.
408
+ const index = (await this.findLeafIndex('latest', MerkleTreeId.L1_TO_L2_MESSAGE_TREE, entryKey))!;
409
+ const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(entryKey);
410
+ return Promise.resolve(new L1ToL2MessageAndIndex(index, message));
411
+ }
412
+
413
+ /**
414
+ * Returns a sibling path for a leaf in the committed l1 to l2 data tree.
415
+ * @param blockNumber - The block number at which to get the data.
416
+ * @param leafIndex - Index of the leaf in the tree.
417
+ * @returns The sibling path.
418
+ */
419
+ public async getL1ToL2MessageSiblingPath(
420
+ blockNumber: number | 'latest',
421
+ leafIndex: bigint,
422
+ ): Promise<SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
423
+ const committedDb = await this.#getWorldState(blockNumber);
424
+ return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, leafIndex);
425
+ }
426
+
427
+ /**
428
+ * Returns a sibling path for a leaf in the committed blocks tree.
429
+ * @param blockNumber - The block number at which to get the data.
430
+ * @param leafIndex - Index of the leaf in the tree.
431
+ * @returns The sibling path.
432
+ */
433
+ public async getArchiveSiblingPath(
434
+ blockNumber: number | 'latest',
435
+ leafIndex: bigint,
436
+ ): Promise<SiblingPath<typeof ARCHIVE_HEIGHT>> {
437
+ const committedDb = await this.#getWorldState(blockNumber);
438
+ return committedDb.getSiblingPath(MerkleTreeId.ARCHIVE, leafIndex);
439
+ }
440
+
441
+ /**
442
+ * Returns a sibling path for a leaf in the committed public data tree.
443
+ * @param blockNumber - The block number at which to get the data.
444
+ * @param leafIndex - Index of the leaf in the tree.
445
+ * @returns The sibling path.
446
+ */
447
+ public async getPublicDataSiblingPath(
448
+ blockNumber: number | 'latest',
449
+ leafIndex: bigint,
450
+ ): Promise<SiblingPath<typeof PUBLIC_DATA_TREE_HEIGHT>> {
451
+ const committedDb = await this.#getWorldState(blockNumber);
452
+ return committedDb.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
453
+ }
454
+
455
+ /**
456
+ * Returns a nullifier membership witness for a given nullifier at a given block.
457
+ * @param blockNumber - The block number at which to get the index.
458
+ * @param nullifier - Nullifier we try to find witness for.
459
+ * @returns The nullifier membership witness (if found).
460
+ */
461
+ public async getNullifierMembershipWitness(
462
+ blockNumber: number | 'latest',
463
+ nullifier: Fr,
464
+ ): Promise<NullifierMembershipWitness | undefined> {
465
+ const db = await this.#getWorldState(blockNumber);
466
+ const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
467
+ if (!index) {
468
+ return undefined;
469
+ }
470
+
471
+ const leafPreimagePromise = db.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index);
472
+ const siblingPathPromise = db.getSiblingPath<typeof NULLIFIER_TREE_HEIGHT>(
473
+ MerkleTreeId.NULLIFIER_TREE,
474
+ BigInt(index),
475
+ );
476
+
477
+ const [leafPreimage, siblingPath] = await Promise.all([leafPreimagePromise, siblingPathPromise]);
478
+
479
+ if (!leafPreimage) {
480
+ return undefined;
481
+ }
482
+
483
+ return new NullifierMembershipWitness(BigInt(index), leafPreimage as NullifierLeafPreimage, siblingPath);
484
+ }
485
+
486
+ /**
487
+ * Returns a low nullifier membership witness for a given nullifier at a given block.
488
+ * @param blockNumber - The block number at which to get the index.
489
+ * @param nullifier - Nullifier we try to find the low nullifier witness for.
490
+ * @returns The low nullifier membership witness (if found).
491
+ * @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
492
+ * list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
493
+ * we are trying to prove non-inclusion for.
494
+ *
495
+ * Note: This function returns the membership witness of the nullifier itself and not the low nullifier when
496
+ * the nullifier already exists in the tree. This is because the `getPreviousValueIndex` function returns the
497
+ * index of the nullifier itself when it already exists in the tree.
498
+ * TODO: This is a confusing behavior and we should eventually address that.
499
+ */
500
+ public async getLowNullifierMembershipWitness(
501
+ blockNumber: number | 'latest',
502
+ nullifier: Fr,
503
+ ): Promise<NullifierMembershipWitness | undefined> {
504
+ const committedDb = await this.#getWorldState(blockNumber);
505
+ const findResult = await committedDb.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBigInt());
506
+ if (!findResult) {
507
+ return undefined;
508
+ }
509
+ const { index, alreadyPresent } = findResult;
510
+ if (alreadyPresent) {
511
+ this.log.warn(`Nullifier ${nullifier.toBigInt()} already exists in the tree`);
512
+ }
513
+ const preimageData = (await committedDb.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, index))!;
514
+
515
+ const siblingPath = await committedDb.getSiblingPath<typeof NULLIFIER_TREE_HEIGHT>(
516
+ MerkleTreeId.NULLIFIER_TREE,
517
+ BigInt(index),
518
+ );
519
+ return new NullifierMembershipWitness(BigInt(index), preimageData as NullifierLeafPreimage, siblingPath);
520
+ }
521
+
522
+ async getPublicDataTreeWitness(blockNumber: number | 'latest', leafSlot: Fr): Promise<PublicDataWitness | undefined> {
523
+ const committedDb = await this.#getWorldState(blockNumber);
524
+ const lowLeafResult = await committedDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
525
+ if (!lowLeafResult) {
526
+ return undefined;
527
+ } else {
528
+ const preimage = (await committedDb.getLeafPreimage(
529
+ MerkleTreeId.PUBLIC_DATA_TREE,
530
+ lowLeafResult.index,
531
+ )) as PublicDataTreeLeafPreimage;
532
+ const path = await committedDb.getSiblingPath<typeof PUBLIC_DATA_TREE_HEIGHT>(
533
+ MerkleTreeId.PUBLIC_DATA_TREE,
534
+ lowLeafResult.index,
535
+ );
536
+ return new PublicDataWitness(lowLeafResult.index, preimage, path);
537
+ }
538
+ }
539
+
540
+ /**
541
+ * Gets the storage value at the given contract storage slot.
542
+ *
543
+ * @remarks The storage slot here refers to the slot as it is defined in Noir not the index in the merkle tree.
544
+ * Aztec's version of `eth_getStorageAt`.
545
+ *
546
+ * @param contract - Address of the contract to query.
547
+ * @param slot - Slot to query.
548
+ * @returns Storage value at the given contract slot.
549
+ */
550
+ public async getPublicStorageAt(contract: AztecAddress, slot: Fr): Promise<Fr> {
551
+ const committedDb = await this.#getWorldState('latest');
552
+ const leafSlot = computePublicDataTreeLeafSlot(contract, slot);
553
+
554
+ const lowLeafResult = await committedDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
555
+ if (!lowLeafResult || !lowLeafResult.alreadyPresent) {
556
+ return Fr.ZERO;
557
+ }
558
+ const preimage = (await committedDb.getLeafPreimage(
559
+ MerkleTreeId.PUBLIC_DATA_TREE,
560
+ lowLeafResult.index,
561
+ )) as PublicDataTreeLeafPreimage;
562
+ return preimage.value;
563
+ }
564
+
565
+ /**
566
+ * Returns the currently committed block header.
567
+ * @returns The current committed block header.
568
+ */
569
+ public async getHeader(): Promise<Header> {
570
+ const block = await this.getBlock(-1);
571
+ if (block) {
572
+ return block.header;
573
+ }
574
+
575
+ // No block was not found so we build the initial header.
576
+ const committedDb = await this.#getWorldState('latest');
577
+ return await committedDb.buildInitialHeader();
578
+ }
579
+
580
+ /**
581
+ * Simulates the public part of a transaction with the current state.
582
+ * @param tx - The transaction to simulate.
583
+ **/
584
+ public async simulatePublicCalls(tx: Tx) {
585
+ this.log.info(`Simulating tx ${tx.getTxHash()}`);
586
+ const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
587
+
588
+ // If sequencer is not initialized, we just set these values to zero for simulation.
589
+ const coinbase = this.sequencer?.coinbase || EthAddress.ZERO;
590
+ const feeRecipient = this.sequencer?.feeRecipient || AztecAddress.ZERO;
591
+
592
+ const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(
593
+ new Fr(blockNumber),
594
+ coinbase,
595
+ feeRecipient,
596
+ );
597
+ const prevHeader = (await this.blockSource.getBlock(-1))?.header;
598
+
599
+ // Instantiate merkle trees so uncommitted updates by this simulation are local to it.
600
+ // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
601
+ // So simulation of public functions doesn't affect the merkle trees.
602
+ const merkleTrees = await MerkleTrees.new(this.merkleTreesDb, this.log);
603
+
604
+ const publicProcessorFactory = new PublicProcessorFactory(
605
+ merkleTrees.asLatest(),
606
+ this.contractDataSource,
607
+ this.l1ToL2MessageSource,
608
+ );
609
+ const processor = await publicProcessorFactory.create(prevHeader, newGlobalVariables);
610
+ const [, failedTxs] = await processor.process([tx]);
611
+ if (failedTxs.length) {
612
+ throw failedTxs[0].error;
613
+ }
614
+ this.log.info(`Simulated tx ${tx.getTxHash()} succeeds`);
615
+ }
616
+
617
+ public setConfig(config: Partial<SequencerConfig>): Promise<void> {
618
+ this.sequencer?.updateSequencerConfig(config);
619
+ return Promise.resolve();
620
+ }
621
+
622
+ /**
623
+ * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
624
+ * @param blockNumber - The block number at which to get the data.
625
+ * @returns An instance of a committed MerkleTreeOperations
626
+ */
627
+ async #getWorldState(blockNumber: number | 'latest') {
628
+ if (typeof blockNumber === 'number' && blockNumber < INITIAL_L2_BLOCK_NUM) {
629
+ throw new Error('Invalid block number to get world state for: ' + blockNumber);
630
+ }
631
+
632
+ let blockSyncedTo: number = 0;
633
+ try {
634
+ // Attempt to sync the world state if necessary
635
+ blockSyncedTo = await this.#syncWorldState();
636
+ } catch (err) {
637
+ this.log.error(`Error getting world state: ${err}`);
638
+ }
639
+
640
+ // using a snapshot could be less efficient than using the committed db
641
+ if (blockNumber === 'latest' || blockNumber === blockSyncedTo) {
642
+ this.log(`Using committed db for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
643
+ return this.worldStateSynchronizer.getCommitted();
644
+ } else if (blockNumber < blockSyncedTo) {
645
+ this.log(`Using snapshot for block ${blockNumber}, world state synced upto ${blockSyncedTo}`);
646
+ return this.worldStateSynchronizer.getSnapshot(blockNumber);
647
+ } else {
648
+ throw new Error(`Block ${blockNumber} not yet synced`);
649
+ }
650
+ }
651
+
652
+ /**
653
+ * Ensure we fully sync the world state
654
+ * @returns A promise that fulfils once the world state is synced
655
+ */
656
+ async #syncWorldState(): Promise<number> {
657
+ const blockSourceHeight = await this.blockSource.getBlockNumber();
658
+ return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
659
+ }
660
+ }
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ import { createDebugLogger } from '@aztec/foundation/log';
3
+
4
+ import http from 'http';
5
+
6
+ import { AztecNodeConfig, AztecNodeService, createAztecNodeRpcServer, getConfigEnvVars } from '../index.js';
7
+
8
+ const { AZTEC_NODE_PORT = 8081, API_PREFIX = '' } = process.env;
9
+
10
+ const logger = createDebugLogger('aztec:node');
11
+
12
+ /**
13
+ * Creates the node from provided config
14
+ */
15
+ async function createAndDeployAztecNode() {
16
+ const aztecNodeConfig: AztecNodeConfig = { ...getConfigEnvVars() };
17
+
18
+ return await AztecNodeService.createAndSync(aztecNodeConfig);
19
+ }
20
+
21
+ /**
22
+ * Create and start a new Aztec Node HTTP Server
23
+ */
24
+ async function main() {
25
+ logger.info(`Setting up Aztec Node...`);
26
+
27
+ const aztecNode = await createAndDeployAztecNode();
28
+
29
+ const shutdown = async () => {
30
+ logger.info('Shutting down...');
31
+ await aztecNode.stop();
32
+ process.exit(0);
33
+ };
34
+
35
+ process.once('SIGINT', shutdown);
36
+ process.once('SIGTERM', shutdown);
37
+
38
+ const rpcServer = createAztecNodeRpcServer(aztecNode);
39
+ const app = rpcServer.getApp(API_PREFIX);
40
+
41
+ const httpServer = http.createServer(app.callback());
42
+ httpServer.listen(+AZTEC_NODE_PORT);
43
+ logger.info(`Aztec Node JSON-RPC Server listening on port ${AZTEC_NODE_PORT}`);
44
+ }
45
+
46
+ main().catch(err => {
47
+ logger.error(err);
48
+ process.exit(1);
49
+ });
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './aztec-node/config.js';
2
+ export * from './aztec-node/server.js';
3
+ export * from './aztec-node/http_rpc_server.js';