From 3eac5e78fdff623770be88e9ed4dc9a2a20bca0c Mon Sep 17 00:00:00 2001 From: benesjan Date: Wed, 3 May 2023 12:02:40 +0000 Subject: [PATCH 1/4] chore: enabled strict linter checks --- yarn-project/archiver/.eslintrc.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/archiver/.eslintrc.cjs b/yarn-project/archiver/.eslintrc.cjs index 97d6f1878135..e659927475c0 100644 --- a/yarn-project/archiver/.eslintrc.cjs +++ b/yarn-project/archiver/.eslintrc.cjs @@ -1 +1 @@ -module.exports = require('@aztec/foundation/eslint-legacy'); +module.exports = require('@aztec/foundation/eslint'); From b89cbcd857d407a4023be27cd375373056ab5441 Mon Sep 17 00:00:00 2001 From: benesjan Date: Wed, 3 May 2023 12:25:31 +0000 Subject: [PATCH 2/4] docs: fixed linting errors --- .../archiver/src/archiver/archiver.ts | 54 ++++++++++++++----- yarn-project/archiver/src/archiver/config.ts | 5 ++ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 709c148b2cad..fc8f7ce78715 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -60,12 +60,12 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa private nextL2BlockFromBlock = 0n; /** - * Next L1 block number to fetch `UnverifiedData` logs from (i.e. `fromBlock` in eth_getLogs) + * Next L1 block number to fetch `UnverifiedData` logs from (i.e. `fromBlock` in eth_getLogs). */ private nextUnverifiedDataFromBlock = 0n; /** - * Next L1 block number to fetch `ContractPublicData` logs from (i.e. `fromBlock` in eth_getLogs) + * Next L1 block number to fetch `ContractPublicData` logs from (i.e. `fromBlock` in eth_getLogs). */ private nextContractDataFromBlock = 0n; @@ -74,7 +74,7 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa * @param publicClient - A client for interacting with the Ethereum node. * @param rollupAddress - Ethereum address of the rollup contract. * @param unverifiedDataEmitterAddress - Ethereum address of the unverifiedDataEmitter contract. - * @param pollingInterval - The interval for polling for rollup logs. + * @param pollingIntervalMs - The interval for polling for rollup logs (in milliseconds). * @param log - A logger. */ constructor( @@ -136,6 +136,11 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa await this.syncNewContractData(blockUntilSynced, currentBlockNumber); } + /** + * Fetches and processes new blocks. + * @param blockUntilSynced - If true, blocks until the archiver has fully synced. + * @param currentBlockNumber - Latest available block number in the ETH node. + */ private async syncBlocks(blockUntilSynced: boolean, currentBlockNumber: bigint) { do { if (this.nextL2BlockFromBlock > currentBlockNumber) { @@ -157,6 +162,11 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa } while (blockUntilSynced && this.nextL2BlockFromBlock <= currentBlockNumber); } + /** + * Fetches and processes new unverified data. + * @param blockUntilSynced - If true, blocks until the archiver has fully synced. + * @param currentBlockNumber - Latest available block number in the ETH node. + */ private async syncUnverifiedData(blockUntilSynced: boolean, currentBlockNumber: bigint) { do { if (this.nextUnverifiedDataFromBlock > currentBlockNumber) { @@ -176,6 +186,11 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa } while (blockUntilSynced && this.nextUnverifiedDataFromBlock <= currentBlockNumber); } + /** + * Fetches and processes new contract data. + * @param blockUntilSynced - If true, blocks until the archiver has fully synced. + * @param currentBlockNumber - Latest available block number in the ETH node. + */ private async syncNewContractData(blockUntilSynced: boolean, currentBlockNumber: bigint) { do { if (this.nextContractDataFromBlock > currentBlockNumber) { @@ -229,7 +244,12 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa }); } - private async getContractDataLogs(fromBlock: bigint) { + /** + * Gets relevant `ContractDeployment` logs from chain. + * @param fromBlock - First block to get logs from (inclusive). + * @returns An array of `ContractDeployment` logs. + */ + private async getContractDataLogs(fromBlock: bigint): Promise { const abiItem = getAbiItem({ abi: UnverifiedDataEmitterAbi, name: 'ContractDeployment', @@ -289,6 +309,10 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa this.log('Processed unverifiedData corresponding to ' + logs.length + ' blocks.'); } + /** + * Processes newly received UnverifiedData logs. + * @param logs - ContractDeployment logs. + */ private processContractDataLogs( logs: Log[], ) { @@ -384,8 +408,8 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa /** * Lookup all contract data in an L2 block. - * @param blockNumber - The block number to get all contract data from. - * @returns All new contract data in the block (if found) + * @param blockNum - The block number to get all contract data from. + * @returns All new contract data in the block (if found). */ public getL2ContractPublicDataInBlock(blockNum: number): Promise { if (blockNum > this.l2Blocks.length) { @@ -415,22 +439,28 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa /** * Lookup the L2 contract info inside a block. * Contains contract address & the ethereum portal address. - * @param contractAddress - The contract data address. + * @param l2BlockNum - The L2 block number to get the contract data from. * @returns ContractData with the portal address (if we didn't throw an error). */ - public getL2ContractInfoInBlock(blockNum: number): Promise { - if (blockNum > this.l2Blocks.length) { + public getL2ContractInfoInBlock(l2BlockNum: number): Promise { + if (l2BlockNum > this.l2Blocks.length) { return Promise.resolve([]); } - const block = this.l2Blocks[blockNum]; + const block = this.l2Blocks[l2BlockNum]; return Promise.resolve(block.newContractData); } + /** + * Gets the public function data for a contract. + * @param contractAddress - The contract address containing the function to fetch. + * @param functionSelector - The function selector of the function to fetch. + * @returns The public function data (if found). + */ public async getPublicFunction( - address: AztecAddress, + contractAddress: AztecAddress, functionSelector: Buffer, ): Promise { - const contractData = await this.getL2ContractPublicData(address); + const contractData = await this.getL2ContractPublicData(contractAddress); const result = contractData?.publicFunctions?.find(fn => fn.functionSelector.equals(functionSelector)); return result; } diff --git a/yarn-project/archiver/src/archiver/config.ts b/yarn-project/archiver/src/archiver/config.ts index 07e425f95eef..1111bf0b553d 100644 --- a/yarn-project/archiver/src/archiver/config.ts +++ b/yarn-project/archiver/src/archiver/config.ts @@ -16,6 +16,11 @@ export interface ArchiverConfig extends L1Addresses { archiverPollingInterval?: number; } +/** + * Returns the archiver configuration from the environment variables. + * Note: If an environment variable is not set, the default value is used. + * @returns The archiver configuration. + */ export function getConfigEnvVars(): ArchiverConfig { const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL, ROLLUP_CONTRACT_ADDRESS, UNVERIFIED_DATA_EMITTER_ADDRESS } = process.env; From ac25529a6e62b0d2025fce261a17cba45fda7a1c Mon Sep 17 00:00:00 2001 From: benesjan Date: Wed, 3 May 2023 12:27:15 +0000 Subject: [PATCH 3/4] refactor: fixed inconsistent naming --- yarn-project/archiver/src/archiver/archiver.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index fc8f7ce78715..f4d8c8e1f6aa 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -198,9 +198,9 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa } this.log(`Syncing ContractData logs from block ${this.nextContractDataFromBlock}`); - const contractDataLogs = await this.getContractDataLogs(this.nextContractDataFromBlock); + const contractDataLogs = await this.getContractDeploymentLogs(this.nextContractDataFromBlock); - this.processContractDataLogs(contractDataLogs); + this.processContractDeploymentLogs(contractDataLogs); this.nextContractDataFromBlock = (contractDataLogs.findLast(cd => !!cd)?.blockNumber || this.nextContractDataFromBlock) + 1n; } while (blockUntilSynced && this.nextContractDataFromBlock <= currentBlockNumber); @@ -249,7 +249,7 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa * @param fromBlock - First block to get logs from (inclusive). * @returns An array of `ContractDeployment` logs. */ - private async getContractDataLogs(fromBlock: bigint): Promise { + private async getContractDeploymentLogs(fromBlock: bigint): Promise { const abiItem = getAbiItem({ abi: UnverifiedDataEmitterAbi, name: 'ContractDeployment', @@ -313,7 +313,7 @@ export class Archiver implements L2BlockSource, UnverifiedDataSource, ContractDa * Processes newly received UnverifiedData logs. * @param logs - ContractDeployment logs. */ - private processContractDataLogs( + private processContractDeploymentLogs( logs: Log[], ) { for (const log of logs) { From 4c88211999105d67fb699809d8b88dedf6961f8e Mon Sep 17 00:00:00 2001 From: benesjan Date: Wed, 3 May 2023 12:46:34 +0000 Subject: [PATCH 4/4] docs: updated readme --- yarn-project/archiver/README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/yarn-project/archiver/README.md b/yarn-project/archiver/README.md index a6743c372bea..4f180b229cfc 100644 --- a/yarn-project/archiver/README.md +++ b/yarn-project/archiver/README.md @@ -1,6 +1,14 @@ # Archiver -To run: -1. Run `anvil`, -2. in the aztec3-l1-contracts repo check out my branch `janb/archiver-test-data`, -3. deploy the contracts and generate initial activity with: `forge script --fork-url "http://127.0.0.1:8545/" --ffi GenerateActivityTest --sig "testGenerateActivity()" --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast` -4. in this repository run `yarn start:dev` (Note: this repo is currently messy and eslint will not allow it to be built with `yarn start`) +Archiver is a service which is used to fetch data on-chain data and present them in a nice-to-consume form. +The on-chain data specifically are the following events: +1. `L2BlockProcessed` event emitted on Rollup contract, +2. `UnverifiedData` event emitted on UnverifiedDataEmitter contract and +3. `ContractDeployment` event emitted on UnverifiedDataEmitter contract as well. + +The interfaces defining how the data can be consumed from the archiver are `L2BlockSource`, `UnverifiedDataSource` and `ContractDataSource`. + +## Usage +To install dependencies and build the package run `yarn install` followed by `yarn build`. +To run test execute `yarn test`. + +To start the service export `ETHEREUM_HOST` (defaults to `http://127.0.0.1:8545/`), `ARCHIVER_POLLING_INTERVAL` (defaults to `1000 ms`), `ROLLUP_CONTRACT_ADDRESS`, `UNVERIFIED_DATA_EMITTER_ADDRESS` environmental variables and start the service with `yarn start`.