From ec6b366c0c559f0ac8b6b0e2fa0f880c5e25e8e9 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 15 Aug 2024 14:13:11 -0300 Subject: [PATCH 01/17] fix: Log err stack traces --- yarn-project/foundation/src/log/logger.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn-project/foundation/src/log/logger.ts b/yarn-project/foundation/src/log/logger.ts index a653b233393d..fbcfd832e02e 100644 --- a/yarn-project/foundation/src/log/logger.ts +++ b/yarn-project/foundation/src/log/logger.ts @@ -1,4 +1,5 @@ import debug from 'debug'; +import { inspect } from 'util'; import { type LogData, type LogFn } from './log_fn.js'; @@ -88,8 +89,7 @@ function logWithDebug(debug: debug.Debugger, level: LogLevel, msg: string, data? * @returns A string with both the log message and the error message. */ function fmtErr(msg: string, err?: Error | unknown): string { - const errStr = err && [(err as Error).name, (err as Error).message].filter(x => !!x).join(' '); - return err ? `${msg}: ${errStr || err}` : msg; + return err ? `${msg}: ${inspect(err)}` : msg; } /** From 5166d057782cce73cb053bdfc29ef8cfdde3d705 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 15 Aug 2024 16:17:37 -0300 Subject: [PATCH 02/17] fix: Replace prover node data store on deploy --- .github/workflows/devnet-deploys.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index e56f4d8837bf..ec785db3ede9 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -442,7 +442,7 @@ jobs: working-directory: ./yarn-project/aztec/terraform/prover-node run: | terraform init -input=false -backend-config="key=${{ env.DEPLOY_TAG }}/aztec-prover-node" - terraform apply -input=false -auto-approve -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" + terraform apply -input=false -auto-approve -replace="aws_efs_file_system.prover_node_data_store" -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" - name: Deploy Provers working-directory: ./yarn-project/aztec/terraform/prover From aa3199617373d089364a6846b59dc66e89229897 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 15 Aug 2024 17:00:02 -0300 Subject: [PATCH 03/17] chore: Do not fail deploy if verifier fails --- .github/workflows/devnet-deploys.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index ec785db3ede9..0f157b3258ff 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -613,7 +613,8 @@ jobs: run: | ./.github/scripts/wait_for_infra.sh pxe ${{ env.DEPLOY_TAG }} ${{ env.API_KEY }} - - name: Deploy verifier + - name: Deploy verifier (allow failure) + continue-on-error: true working-directory: ./yarn-project/aztec/terraform/pxe run: | set -eo pipefail From efcd9edad1ddc0c24aacbeae34758f1047ad234e Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Thu, 15 Aug 2024 20:05:21 -0300 Subject: [PATCH 04/17] fix: Publish proof log --- yarn-project/sequencer-client/src/publisher/l1-publisher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts index 0efedfde0f06..756e3bcaa679 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts @@ -290,7 +290,7 @@ export class L1Publisher implements L2BlockReceiver { ...pick(tx!, 'calldataGas', 'calldataSize'), eventName: 'proof-published-to-l1', }; - this.log.info(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx }); + this.log.info(`Published proof to L1 rollup contract`, { ...stats, ...ctx }); this.metrics.recordSubmitProof(timer.ms(), stats); return true; } From ac55ae3e9afebe689c09331ec471d3e62144a02e Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 16 Aug 2024 12:58:53 -0300 Subject: [PATCH 05/17] fix: Disable validator for aztec node --- yarn-project/aztec/terraform/node/main.tf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/yarn-project/aztec/terraform/node/main.tf b/yarn-project/aztec/terraform/node/main.tf index e7f7b040d7de..43039c796f20 100644 --- a/yarn-project/aztec/terraform/node/main.tf +++ b/yarn-project/aztec/terraform/node/main.tf @@ -367,7 +367,11 @@ resource "aws_ecs_task_definition" "aztec-node" { { name = "NETWORK_NAME", value = "${var.DEPLOY_TAG}" - } + }, + { + name = "VALIDATOR_DISABLED", + value = "1" + }, ] mountPoints = [ { From ce35cad1d0823572c3813d47398137baba276534 Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 16 Aug 2024 14:17:23 -0300 Subject: [PATCH 06/17] feat: Max pending jobs in prover node (#8045) Adds a max number of pending block-proving jobs to the prover node. When reached, the prover node stops proving, and resumes once a job finishes. Also adds error handling to the creation of a new proving job, so if a block-proving-job fails to start, it is skipped instead of blocking the prover node. --- .../end-to-end/src/e2e_prover_node.test.ts | 10 +- yarn-project/foundation/src/config/env_var.ts | 6 +- yarn-project/prover-node/package.json | 1 + yarn-project/prover-node/src/config.ts | 29 ++- yarn-project/prover-node/src/factory.ts | 4 + .../prover-node/src/job/block-proving-job.ts | 29 ++- .../prover-node/src/prover-node.test.ts | 179 ++++++++++++++++++ yarn-project/prover-node/src/prover-node.ts | 77 +++++++- yarn-project/prover-node/tsconfig.json | 3 + yarn-project/yarn.lock | 1 + 10 files changed, 317 insertions(+), 22 deletions(-) create mode 100644 yarn-project/prover-node/src/prover-node.test.ts diff --git a/yarn-project/end-to-end/src/e2e_prover_node.test.ts b/yarn-project/end-to-end/src/e2e_prover_node.test.ts index a2bc44ea239b..b300dc8dac27 100644 --- a/yarn-project/end-to-end/src/e2e_prover_node.test.ts +++ b/yarn-project/end-to-end/src/e2e_prover_node.test.ts @@ -15,7 +15,7 @@ import { sleep, } from '@aztec/aztec.js'; import { StatefulTestContract, TestContract } from '@aztec/noir-contracts.js'; -import { createProverNode } from '@aztec/prover-node'; +import { type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; import { sendL1ToL2Message } from './fixtures/l1_to_l2_messaging.js'; import { @@ -127,7 +127,13 @@ describe('e2e_prover_node', () => { logger.info(`Creating prover node ${proverId.toString()}`); // HACK: We have to use the existing archiver to fetch L2 data, since anvil's chain dump/load used by the // snapshot manager does not include events nor txs, so a new archiver would not "see" old blocks. - const proverConfig = { ...ctx.aztecNodeConfig, txProviderNodeUrl: undefined, dataDirectory: undefined, proverId }; + const proverConfig: ProverNodeConfig = { + ...ctx.aztecNodeConfig, + txProviderNodeUrl: undefined, + dataDirectory: undefined, + proverId, + proverNodeMaxPendingJobs: 100, + }; const archiver = ctx.aztecNode.getBlockSource() as Archiver; const proverNode = await createProverNode(proverConfig, { aztecNodeTxProvider: ctx.aztecNode, archiver }); diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index d4383b4b64b1..6dd924eae743 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -95,4 +95,8 @@ export type EnvVar = | 'BB_BINARY_PATH' | 'BB_WORKING_DIRECTORY' | 'BB_SKIP_CLEANUP' - | 'PXE_PROVER_ENABLED'; + | 'PXE_PROVER_ENABLED' + | 'VALIDATOR_PRIVATE_KEY' + | 'VALIDATOR_DISABLED' + | 'PROVER_NODE_DISABLE_AUTOMATIC_PROVING' + | 'PROVER_NODE_MAX_PENDING_JOBS'; diff --git a/yarn-project/prover-node/package.json b/yarn-project/prover-node/package.json index efcd145e763d..1ab15127b80d 100644 --- a/yarn-project/prover-node/package.json +++ b/yarn-project/prover-node/package.json @@ -58,6 +58,7 @@ "@aztec/sequencer-client": "workspace:^", "@aztec/simulator": "workspace:^", "@aztec/telemetry-client": "workspace:^", + "@aztec/types": "workspace:^", "@aztec/world-state": "workspace:^", "source-map-support": "^0.5.21", "tslib": "^2.4.0" diff --git a/yarn-project/prover-node/src/config.ts b/yarn-project/prover-node/src/config.ts index e49192a217ca..d7229c80afe5 100644 --- a/yarn-project/prover-node/src/config.ts +++ b/yarn-project/prover-node/src/config.ts @@ -1,5 +1,10 @@ import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver'; -import { type ConfigMappingsType } from '@aztec/foundation/config'; +import { + type ConfigMappingsType, + booleanConfigHelper, + getConfigFromMappings, + numberConfigHelper, +} from '@aztec/foundation/config'; import { type ProverClientConfig, getProverEnvVars, proverClientConfigMappings } from '@aztec/prover-client'; import { type PublisherConfig, @@ -18,7 +23,25 @@ export type ProverNodeConfig = ArchiverConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & - TxProviderConfig; + TxProviderConfig & { + proverNodeDisableAutomaticProving?: boolean; + proverNodeMaxPendingJobs?: number; + }; + +const specificProverNodeConfigMappings: ConfigMappingsType< + Pick +> = { + proverNodeDisableAutomaticProving: { + env: 'PROVER_NODE_DISABLE_AUTOMATIC_PROVING', + description: 'Whether to disable automatic proving of pending blocks seen on L1', + ...booleanConfigHelper(false), + }, + proverNodeMaxPendingJobs: { + env: 'PROVER_NODE_MAX_PENDING_JOBS', + description: 'The maximum number of pending jobs for the prover node', + ...numberConfigHelper(100), + }, +}; export const proverNodeConfigMappings: ConfigMappingsType = { ...archiverConfigMappings, @@ -27,6 +50,7 @@ export const proverNodeConfigMappings: ConfigMappingsType = { ...getPublisherConfigMappings('PROVER'), ...getTxSenderConfigMappings('PROVER'), ...txProviderConfigMappings, + ...specificProverNodeConfigMappings, }; export function getProverNodeConfigFromEnv(): ProverNodeConfig { @@ -37,5 +61,6 @@ export function getProverNodeConfigFromEnv(): ProverNodeConfig { ...getPublisherConfigFromEnv('PROVER'), ...getTxSenderConfigFromEnv('PROVER'), ...getTxProviderConfigFromEnv(), + ...getConfigFromMappings(specificProverNodeConfigMappings), }; } diff --git a/yarn-project/prover-node/src/factory.ts b/yarn-project/prover-node/src/factory.ts index f1e966de0911..ae6235af9d15 100644 --- a/yarn-project/prover-node/src/factory.ts +++ b/yarn-project/prover-node/src/factory.ts @@ -59,5 +59,9 @@ export async function createProverNode( txProvider, simulationProvider, telemetry, + { + disableAutomaticProving: config.proverNodeDisableAutomaticProving, + maxPendingJobs: config.proverNodeMaxPendingJobs, + }, ); } diff --git a/yarn-project/prover-node/src/job/block-proving-job.ts b/yarn-project/prover-node/src/job/block-proving-job.ts index dbf9d4bf9fec..25fe23ed990f 100644 --- a/yarn-project/prover-node/src/job/block-proving-job.ts +++ b/yarn-project/prover-node/src/job/block-proving-job.ts @@ -14,6 +14,8 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { type L1Publisher } from '@aztec/sequencer-client'; import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simulator'; +import * as crypto from 'node:crypto'; + /** * Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes, * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the @@ -22,6 +24,7 @@ import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simula export class BlockProvingJob { private state: BlockProvingJobState = 'initialized'; private log = createDebugLogger('aztec:block-proving-job'); + private uuid: string; constructor( private prover: BlockProver, @@ -30,8 +33,14 @@ export class BlockProvingJob { private l2BlockSource: L2BlockSource, private l1ToL2MessageSource: L1ToL2MessageSource, private txProvider: TxProvider, - private cleanUp: () => Promise = () => Promise.resolve(), - ) {} + private cleanUp: (job: BlockProvingJob) => Promise = () => Promise.resolve(), + ) { + this.uuid = crypto.randomUUID(); + } + + public getId(): string { + return this.uuid; + } public getState(): BlockProvingJobState { return this.state; @@ -42,7 +51,7 @@ export class BlockProvingJob { throw new Error(`Block ranges are not yet supported`); } - this.log.info(`Starting block proving job`, { fromBlock, toBlock }); + this.log.info(`Starting block proving job`, { fromBlock, toBlock, uuid: this.uuid }); this.state = 'processing'; try { let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header; @@ -61,6 +70,7 @@ export class BlockProvingJob { nullifierTreeRoot: block.header.state.partial.nullifierTree.root, publicDataTreeRoot: block.header.state.partial.publicDataTree.root, historicalHeader: historicalHeader?.hash(), + uuid: this.uuid, ...globalVariables, }); @@ -75,6 +85,7 @@ export class BlockProvingJob { this.log.verbose(`Processed all txs for block`, { blockNumber: block.number, blockHash: block.hash().toString(), + uuid: this.uuid, }); await this.prover.setBlockCompleted(); @@ -90,7 +101,7 @@ export class BlockProvingJob { } const { block, aggregationObject, proof } = await this.prover.finaliseBlock(); - this.log.info(`Finalised proof for block range`, { fromBlock, toBlock }); + this.log.info(`Finalised proof for block range`, { fromBlock, toBlock, uuid: this.uuid }); this.state = 'publishing-proof'; await this.publisher.submitProof( @@ -100,17 +111,21 @@ export class BlockProvingJob { aggregationObject, proof, ); - this.log.info(`Submitted proof for block range`, { fromBlock, toBlock }); + this.log.info(`Submitted proof for block range`, { fromBlock, toBlock, uuid: this.uuid }); this.state = 'completed'; } catch (err) { - this.log.error(`Error running block prover job: ${err}`); + this.log.error(`Error running block prover job`, err, { uuid: this.uuid }); this.state = 'failed'; } finally { - await this.cleanUp(); + await this.cleanUp(this); } } + public stop() { + this.prover.cancelBlock(); + } + private async getBlock(blockNumber: number): Promise { const block = await this.l2BlockSource.getBlock(blockNumber); if (!block) { diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts new file mode 100644 index 000000000000..65f24b5a2ff7 --- /dev/null +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -0,0 +1,179 @@ +import { + type L1ToL2MessageSource, + type L2BlockSource, + type MerkleTreeOperations, + type ProverClient, + type TxProvider, +} from '@aztec/circuit-types'; +import { type L1Publisher } from '@aztec/sequencer-client'; +import { type PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator'; +import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type ContractDataSource } from '@aztec/types/contracts'; +import { WorldStateRunningState, type WorldStateSynchronizer } from '@aztec/world-state'; + +import { type MockProxy, mock } from 'jest-mock-extended'; + +import { type BlockProvingJob } from './job/block-proving-job.js'; +import { ProverNode } from './prover-node.js'; + +describe('prover-node', () => { + let prover: MockProxy; + let publisher: MockProxy; + let l2BlockSource: MockProxy; + let l1ToL2MessageSource: MockProxy; + let contractDataSource: MockProxy; + let worldState: MockProxy; + let txProvider: MockProxy; + let simulator: MockProxy; + let telemetryClient: MockProxy; + + let proverNode: TestProverNode; + + // List of all jobs ever created by the test prover node and their dependencies + let jobs: { + job: MockProxy; + cleanUp: (job: BlockProvingJob) => Promise; + db: MerkleTreeOperations; + }[]; + + beforeEach(() => { + prover = mock(); + publisher = mock(); + l2BlockSource = mock(); + l1ToL2MessageSource = mock(); + contractDataSource = mock(); + worldState = mock(); + txProvider = mock(); + simulator = mock(); + telemetryClient = mock(); + + // World state returns a new mock db every time it is asked to fork + worldState.syncImmediateAndFork.mockImplementation(() => Promise.resolve(mock())); + + jobs = []; + proverNode = new TestProverNode( + prover, + publisher, + l2BlockSource, + l1ToL2MessageSource, + contractDataSource, + worldState, + txProvider, + simulator, + telemetryClient, + { maxPendingJobs: 3, pollingIntervalMs: 10 }, + ); + }); + + afterEach(async () => { + await proverNode.stop(); + }); + + const setBlockNumbers = (blockNumber: number, provenBlockNumber: number) => { + l2BlockSource.getBlockNumber.mockResolvedValue(blockNumber); + l2BlockSource.getProvenBlockNumber.mockResolvedValue(provenBlockNumber); + worldState.status.mockResolvedValue({ syncedToL2Block: provenBlockNumber, state: WorldStateRunningState.RUNNING }); + }; + + it('proves pending blocks', async () => { + setBlockNumbers(5, 3); + + await proverNode.work(); + await proverNode.work(); + await proverNode.work(); + + expect(jobs.length).toEqual(2); + expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); + expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); + }); + + it('stops proving when maximum jobs are reached', async () => { + setBlockNumbers(10, 3); + + await proverNode.work(); + await proverNode.work(); + await proverNode.work(); + await proverNode.work(); + + expect(jobs.length).toEqual(3); + expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); + expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); + expect(jobs[2].job.run).toHaveBeenCalledWith(6, 6); + }); + + it('reports on pending jobs', async () => { + setBlockNumbers(5, 3); + + await proverNode.work(); + await proverNode.work(); + + expect(jobs.length).toEqual(2); + expect(proverNode.getJobs().length).toEqual(2); + expect(proverNode.getJobs()).toEqual([ + { uuid: '0', status: 'processing' }, + { uuid: '1', status: 'processing' }, + ]); + }); + + it('cleans up jobs when completed', async () => { + setBlockNumbers(10, 3); + + await proverNode.work(); + await proverNode.work(); + await proverNode.work(); + await proverNode.work(); + + expect(jobs.length).toEqual(3); + expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); + expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); + expect(jobs[2].job.run).toHaveBeenCalledWith(6, 6); + + expect(proverNode.getJobs().length).toEqual(3); + + // Clean up the first job + await jobs[0].cleanUp(jobs[0].job); + expect(proverNode.getJobs().length).toEqual(2); + expect(jobs[0].db.delete).toHaveBeenCalled(); + + // Request another job to run and ensure it gets pushed + await proverNode.work(); + expect(jobs.length).toEqual(4); + expect(jobs[3].job.run).toHaveBeenCalledWith(7, 7); + expect(proverNode.getJobs().length).toEqual(3); + expect(proverNode.getJobs().map(({ uuid }) => uuid)).toEqual(['1', '2', '3']); + }); + + it('moves forward when proving fails', async () => { + setBlockNumbers(10, 3); + + // We trigger an error by setting world state past the block that the prover node will try proving + worldState.status.mockResolvedValue({ syncedToL2Block: 5, state: WorldStateRunningState.RUNNING }); + + // These two calls should return in failures + await proverNode.work(); + await proverNode.work(); + expect(jobs.length).toEqual(0); + + // But now the prover node should move forward + await proverNode.work(); + expect(jobs.length).toEqual(1); + expect(jobs[0].job.run).toHaveBeenCalledWith(6, 6); + }); + + class TestProverNode extends ProverNode { + protected override doCreateBlockProvingJob( + db: MerkleTreeOperations, + _publicProcessorFactory: PublicProcessorFactory, + cleanUp: (job: BlockProvingJob) => Promise, + ): BlockProvingJob { + const job = mock({ getState: () => 'processing' }); + job.getId.mockReturnValue(jobs.length.toString()); + jobs.push({ job, cleanUp, db }); + return job; + } + + public override work() { + return super.work(); + } + } +}); diff --git a/yarn-project/prover-node/src/prover-node.ts b/yarn-project/prover-node/src/prover-node.ts index 8c9f7a21fb12..ebae8b234f1a 100644 --- a/yarn-project/prover-node/src/prover-node.ts +++ b/yarn-project/prover-node/src/prover-node.ts @@ -1,13 +1,19 @@ -import { type L1ToL2MessageSource, type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types'; +import { + type L1ToL2MessageSource, + type L2BlockSource, + type MerkleTreeOperations, + type ProverClient, + type TxProvider, +} from '@aztec/circuit-types'; import { createDebugLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; import { type L1Publisher } from '@aztec/sequencer-client'; import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator'; import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type ContractDataSource } from '@aztec/types/contracts'; import { type WorldStateSynchronizer } from '@aztec/world-state'; -import { type ContractDataSource } from '../../types/src/contracts/contract_data_source.js'; -import { BlockProvingJob } from './job/block-proving-job.js'; +import { BlockProvingJob, type BlockProvingJobState } from './job/block-proving-job.js'; /** * An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks, @@ -18,6 +24,8 @@ export class ProverNode { private log = createDebugLogger('aztec:prover-node'); private runningPromise: RunningPromise | undefined; private latestBlockWeAreProving: number | undefined; + private jobs: Map = new Map(); + private options: { pollingIntervalMs: number; disableAutomaticProving: boolean; maxPendingJobs: number }; constructor( private prover: ProverClient, @@ -29,11 +37,15 @@ export class ProverNode { private txProvider: TxProvider, private simulator: SimulationProvider, private telemetryClient: TelemetryClient, - private options: { pollingIntervalMs: number; disableAutomaticProving: boolean } = { + options: { pollingIntervalMs?: number; disableAutomaticProving?: boolean; maxPendingJobs?: number } = {}, + ) { + this.options = { pollingIntervalMs: 1_000, disableAutomaticProving: false, - }, - ) {} + maxPendingJobs: 100, + ...options, + }; + } /** * Starts the prover node so it periodically checks for unproven blocks in the unfinalised chain from L1 and proves them. @@ -54,8 +66,8 @@ export class ProverNode { await this.prover.stop(); await this.l2BlockSource.stop(); this.publisher.interrupt(); + this.jobs.forEach(job => job.stop()); this.log.info('Stopped ProverNode'); - // TODO(palla/prover-node): Keep a reference to all ongoing ProvingJobs and stop them. } /** @@ -68,6 +80,14 @@ export class ProverNode { return; } + if (!this.checkMaximumPendingJobs()) { + this.log.debug(`Maximum pending proving jobs reached. Skipping work.`, { + maxPendingJobs: this.options.maxPendingJobs, + pendingJobs: this.jobs.size, + }); + return; + } + const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([ this.l2BlockSource.getBlockNumber(), this.l2BlockSource.getProvenBlockNumber(), @@ -88,8 +108,13 @@ export class ProverNode { const fromBlock = latestProven + 1; const toBlock = fromBlock; // We only prove one block at a time for now - await this.startProof(fromBlock, toBlock); - this.latestBlockWeAreProving = toBlock; + try { + await this.startProof(fromBlock, toBlock); + } finally { + // If we fail to create a proving job for the given block, skip it instead of getting stuck on it. + this.log.verbose(`Setting ${toBlock} as latest block we are proving`); + this.latestBlockWeAreProving = toBlock; + } } catch (err) { this.log.error(`Error in prover node work`, err); } @@ -118,7 +143,23 @@ export class ProverNode { return this.prover; } + /** + * Returns an array of jobs being processed. + */ + public getJobs(): { uuid: string; status: BlockProvingJobState }[] { + return Array.from(this.jobs.entries()).map(([uuid, job]) => ({ uuid, status: job.getState() })); + } + + private checkMaximumPendingJobs() { + const { maxPendingJobs } = this.options; + return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs; + } + private async createProvingJob(fromBlock: number) { + if (!this.checkMaximumPendingJobs()) { + throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`); + } + if ((await this.worldState.status()).syncedToL2Block >= fromBlock) { throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`); } @@ -134,6 +175,22 @@ export class ProverNode { this.telemetryClient, ); + const cleanUp = async () => { + await db.delete(); + this.jobs.delete(job.getId()); + }; + + const job = this.doCreateBlockProvingJob(db, publicProcessorFactory, cleanUp); + this.jobs.set(job.getId(), job); + return job; + } + + /** Extracted for testing purposes. */ + protected doCreateBlockProvingJob( + db: MerkleTreeOperations, + publicProcessorFactory: PublicProcessorFactory, + cleanUp: () => Promise, + ) { return new BlockProvingJob( this.prover.createBlockProver(db), publicProcessorFactory, @@ -141,7 +198,7 @@ export class ProverNode { this.l2BlockSource, this.l1ToL2MessageSource, this.txProvider, - () => db.delete(), + cleanUp, ); } } diff --git a/yarn-project/prover-node/tsconfig.json b/yarn-project/prover-node/tsconfig.json index 9f241158c417..ed7c2e5772e3 100644 --- a/yarn-project/prover-node/tsconfig.json +++ b/yarn-project/prover-node/tsconfig.json @@ -33,6 +33,9 @@ { "path": "../telemetry-client" }, + { + "path": "../types" + }, { "path": "../world-state" } diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 4793d815660b..ff3d962141e5 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -931,6 +931,7 @@ __metadata: "@aztec/sequencer-client": "workspace:^" "@aztec/simulator": "workspace:^" "@aztec/telemetry-client": "workspace:^" + "@aztec/types": "workspace:^" "@aztec/world-state": "workspace:^" "@jest/globals": ^29.5.0 "@types/jest": ^29.5.0 From 1753e18824f3df7d65360b8d966f10ff14dc969f Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Fri, 16 Aug 2024 14:19:50 -0300 Subject: [PATCH 07/17] chore: Set PROVER_NODE_MAX_PENDING_JOBS in prover node tf --- yarn-project/aztec/terraform/prover-node/main.tf | 1 + yarn-project/aztec/terraform/prover-node/variables.tf | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/yarn-project/aztec/terraform/prover-node/main.tf b/yarn-project/aztec/terraform/prover-node/main.tf index f4cc86600222..4ecfba4841b7 100644 --- a/yarn-project/aztec/terraform/prover-node/main.tf +++ b/yarn-project/aztec/terraform/prover-node/main.tf @@ -210,6 +210,7 @@ resource "aws_ecs_task_definition" "aztec-prover-node" { { name = "PROVER_REAL_PROOFS", value = tostring(var.PROVING_ENABLED) }, { name = "BB_WORKING_DIRECTORY", value = "${local.data_dir}/prover_node_${count.index + 1}/temp" }, { name = "ACVM_WORKING_DIRECTORY", value = "${local.data_dir}/prover_node_${count.index + 1}/temp" }, + { name = "PROVER_NODE_MAX_PENDING_JOBS", value = tostring(var.PROVER_NODE_MAX_PENDING_JOBS) } // Metrics { name = "OTEL_EXPORTER_OTLP_ENDPOINT", value = "http://aztec-otel.local:4318" }, diff --git a/yarn-project/aztec/terraform/prover-node/variables.tf b/yarn-project/aztec/terraform/prover-node/variables.tf index 2c8fc301f236..2f29c2f5b714 100644 --- a/yarn-project/aztec/terraform/prover-node/variables.tf +++ b/yarn-project/aztec/terraform/prover-node/variables.tf @@ -60,6 +60,11 @@ variable "PROVING_ENABLED" { default = false } +variable "PROVER_NODE_MAX_PENDING_JOBS" { + type = number + default = 16 +} + variable "BOOTSTRAP_NODES" { type = string default = "" From 9fa2f89e98da632e036dc5b560760c59cf7b3ac1 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 16 Aug 2024 17:51:08 +0000 Subject: [PATCH 08/17] TF fix --- yarn-project/aztec/terraform/prover-node/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec/terraform/prover-node/main.tf b/yarn-project/aztec/terraform/prover-node/main.tf index 3720fb6d9805..8de684fcd7f7 100644 --- a/yarn-project/aztec/terraform/prover-node/main.tf +++ b/yarn-project/aztec/terraform/prover-node/main.tf @@ -198,7 +198,7 @@ resource "aws_ecs_task_definition" "aztec-prover-node" { { name = "PROVER_REAL_PROOFS", value = tostring(var.PROVING_ENABLED) }, { name = "BB_WORKING_DIRECTORY", value = "${local.data_dir}/prover_node_${count.index + 1}/temp" }, { name = "ACVM_WORKING_DIRECTORY", value = "${local.data_dir}/prover_node_${count.index + 1}/temp" }, - { name = "PROVER_NODE_MAX_PENDING_JOBS", value = tostring(var.PROVER_NODE_MAX_PENDING_JOBS) } + { name = "PROVER_NODE_MAX_PENDING_JOBS", value = tostring(var.PROVER_NODE_MAX_PENDING_JOBS) }, // Metrics { name = "OTEL_EXPORTER_OTLP_ENDPOINT", value = "http://aztec-otel.local:4318" }, From 84444cfe505ed0f861c24ab6e0d2e9efd3f9926f Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 16 Aug 2024 18:04:42 +0000 Subject: [PATCH 09/17] Updated deployment config --- .github/workflows/devnet-deploys.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index 38a2952bb992..d1884892bb83 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -110,6 +110,7 @@ jobs: faucet_lb_priority: ${{ steps.set_network_vars.outputs.faucet_lb_priority }} bot_no_wait: ${{ steps.set_network_vars.outputs.bot_no_wait }} max_txs_per_block: ${{ steps.set_network_vars.outputs.max_txs_per_block }} + bot_follow_chain: ${{ steps.set_network_vars.outputs.bot_follow_chain }} steps: - name: Set network vars shell: bash @@ -133,6 +134,7 @@ jobs: echo "faucet_lb_priority=601" >> $GITHUB_OUTPUT echo "bot_no_wait=false" >> $GITHUB_OUTPUT echo "max_txs_per_block=64" >> $GITHUB_OUTPUT + echo "bot_follow_chain=PROVEN" >> $GITHUB_OUTPUT elif [ "$BRANCH_NAME" = "provernet" ] then echo "deploy_tag=provernet" >> $GITHUB_OUTPUT @@ -150,6 +152,7 @@ jobs: echo "faucet_lb_priority=602" >> $GITHUB_OUTPUT echo "bot_no_wait=true" >> $GITHUB_OUTPUT echo "max_txs_per_block=4" >> $GITHUB_OUTPUT + echo "bot_follow_chain=PENDING" >> $GITHUB_OUTPUT elif [ "$BRANCH_NAME" = "alphanet" ] then echo "deploy_tag=alphanet" >> $GITHUB_OUTPUT @@ -167,6 +170,7 @@ jobs: echo "faucet_lb_priority=600" >> $GITHUB_OUTPUT echo "bot_no_wait=false" >> $GITHUB_OUTPUT echo "max_txs_per_block=64" >> $GITHUB_OUTPUT + echo "bot_follow_chain=PROVEN" >> $GITHUB_OUTPUT else echo "Unrecognized Branch!!" exit 1 @@ -567,6 +571,7 @@ jobs: TF_VAR_PROVER_NODE_LB_RULE_PRIORITY: ${{ needs.set-network.outputs.prover_node_lb_priority_range_start }} TF_VAR_BOT_NO_WAIT_FOR_TRANSFERS: ${{ needs.set-network.outputs.bot_no_wait }} TF_VAR_SEQ_MAX_TX_PER_BLOCK: ${{ needs.set-network.outputs.max_txs_per_block }} + TF_VAR_BOT_FOLLOW_CHAIN: ${{ needs.set-network.outputs.bot_follow_chain }} TF_VAR_PROVING_ENABLED: true TF_VAR_BOT_NO_START: false steps: From aeb84f459e0f225cd5912b00e06d38ced64ce665 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 16 Aug 2024 18:24:08 +0000 Subject: [PATCH 10/17] Destroy PXE datastore --- .github/workflows/devnet-deploys.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index d1884892bb83..9886f411f68a 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -459,7 +459,7 @@ jobs: working-directory: ./yarn-project/aztec/terraform/pxe run: | terraform init -input=false -backend-config="key=${{ env.DEPLOY_TAG }}/pxe" - terraform apply -input=false -auto-approve + terraform apply -input=false -auto-approve -replace="aws_efs_file_system.pxe_data_store" bootstrap: runs-on: ubuntu-latest From 2f0e14850685fbce7f0cd89c55722cfda7f9a707 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 16 Aug 2024 18:49:08 +0000 Subject: [PATCH 11/17] Set prover node logging to verbose --- yarn-project/aztec/terraform/prover-node/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/aztec/terraform/prover-node/main.tf b/yarn-project/aztec/terraform/prover-node/main.tf index 8de684fcd7f7..6ef10064885b 100644 --- a/yarn-project/aztec/terraform/prover-node/main.tf +++ b/yarn-project/aztec/terraform/prover-node/main.tf @@ -170,7 +170,7 @@ resource "aws_ecs_task_definition" "aztec-prover-node" { environment = [ // General { name = "NODE_ENV", value = "production" }, - { name = "LOG_LEVEL", value = "debug" }, + { name = "LOG_LEVEL", value = "verbose" }, { name = "DEBUG", value = "aztec:*,-json-rpc:json_proxy:*,-aztec:avm_simulator:*" }, { name = "DEPLOY_TAG", value = var.DEPLOY_TAG }, { name = "NETWORK_NAME", value = "${var.DEPLOY_TAG}" }, From 1902209a4107d4287790625f2c4509ad149a7805 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 16 Aug 2024 19:15:00 +0000 Subject: [PATCH 12/17] Increased bot tx timeout --- .github/workflows/devnet-deploys.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index 9886f411f68a..6139b7745d2f 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -74,7 +74,7 @@ env: TF_VAR_BOT_NO_START: true TF_VAR_BOT_PRIVATE_TRANSFERS_PER_TX: 0 # no private transfers TF_VAR_BOT_PUBLIC_TRANSFERS_PER_TX: 1 - TF_VAR_BOT_TX_MINED_WAIT_SECONDS: 2400 + TF_VAR_BOT_TX_MINED_WAIT_SECONDS: 4800 TF_VAR_BOT_FOLLOW_CHAIN: "PROVEN" TF_VAR_BOT_TX_INTERVAL_SECONDS: 180 TF_VAR_BOT_COUNT: 1 From bed7bf92eac5add6ac52aa0aa892c533e59e2354 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Mon, 19 Aug 2024 16:10:59 +0000 Subject: [PATCH 13/17] Bot fixes --- yarn-project/bot/src/factory.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/yarn-project/bot/src/factory.ts b/yarn-project/bot/src/factory.ts index f4af49d1f1d7..e909590c268f 100644 --- a/yarn-project/bot/src/factory.ts +++ b/yarn-project/bot/src/factory.ts @@ -23,6 +23,8 @@ export class BotFactory { throw new Error(`Either a PXE client or a PXE URL must be provided`); } + this.node = dependencies.node; + if (dependencies.pxe) { this.log.info(`Using local PXE`); this.pxe = dependencies.pxe; @@ -30,7 +32,6 @@ export class BotFactory { } this.log.info(`Using remote PXE at ${config.pxeUrl!}`); this.pxe = createPXEClient(config.pxeUrl!); - this.node = dependencies.node; } /** @@ -60,6 +61,8 @@ export class BotFactory { } else { this.log.info(`Initializing account at ${account.getAddress().toString()}`); const sentTx = account.deploy(); + const txHash = await sentTx.getTxHash(); + this.log.info(`Sent tx with hash ${txHash.to0xString()}`); if (this.config.flushSetupTransactions) { this.log.verbose('Flushing transactions'); await this.node!.flushTxs(); @@ -93,6 +96,8 @@ export class BotFactory { } else { this.log.info(`Deploying token contract at ${address.toString()}`); const sentTx = deploy.send(deployOpts); + const txHash = await sentTx.getTxHash(); + this.log.info(`Sent tx with hash ${txHash.to0xString()}`); if (this.config.flushSetupTransactions) { this.log.verbose('Flushing transactions'); await this.node!.flushTxs(); @@ -123,6 +128,8 @@ export class BotFactory { return; } const sentTx = new BatchCall(token.wallet, calls).send(); + const txHash = await sentTx.getTxHash(); + this.log.info(`Sent tx with hash ${txHash.to0xString()}`); if (this.config.flushSetupTransactions) { this.log.verbose('Flushing transactions'); await this.node!.flushTxs(); From 677ebd0e166fd367f9ad575716beb1861a249106 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Mon, 19 Aug 2024 16:33:51 +0000 Subject: [PATCH 14/17] Don't destroy the prover-node efs volume --- .github/workflows/devnet-deploys.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index 61a093f4ae04..d7d7d1085ab6 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -462,7 +462,7 @@ jobs: working-directory: ./yarn-project/aztec/terraform/prover-node run: | terraform init -input=false -backend-config="key=${{ env.DEPLOY_TAG }}/aztec-prover-node" - terraform apply -input=false -auto-approve -replace="aws_efs_file_system.prover_node_data_store" -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" + terraform apply -input=false -auto-approve -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" - name: Deploy Provers working-directory: ./yarn-project/aztec/terraform/prover From 37bd2a30c15a8d6097be6823396de50778fc1696 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Mon, 19 Aug 2024 17:04:51 +0000 Subject: [PATCH 15/17] Re-instate efs destruction --- .github/workflows/devnet-deploys.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index d7d7d1085ab6..756b1b93abb4 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -456,13 +456,13 @@ jobs: working-directory: ./yarn-project/aztec/terraform/node run: | terraform init -input=false -backend-config="key=${{ env.DEPLOY_TAG }}/aztec-node" - terraform apply -input=false -auto-approve -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.node_udp_range_start }}" + terraform apply -input=false -auto-approve -replace="aws_efs_file_system.node_data_store" -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.node_udp_range_start }}" - name: Deploy Aztec Prover Nodes working-directory: ./yarn-project/aztec/terraform/prover-node run: | terraform init -input=false -backend-config="key=${{ env.DEPLOY_TAG }}/aztec-prover-node" - terraform apply -input=false -auto-approve -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" + terraform apply -input=false -auto-approve -replace="aws_efs_file_system.prover_node_data_store" -var="NODE_P2P_TCP_PORT=${{ needs.set-network.outputs.prover_node_tcp_range_start }}" -var="NODE_P2P_UDP_PORT=${{ needs.set-network.outputs.prover_node_udp_range_start }}" - name: Deploy Provers working-directory: ./yarn-project/aztec/terraform/prover From d024eb5765086a3e3a20030cc0e5e074fd30999d Mon Sep 17 00:00:00 2001 From: Santiago Palladino Date: Mon, 19 Aug 2024 14:38:36 -0300 Subject: [PATCH 16/17] fix: Deploy L1 rollup contract using salt if provided Fixes a bad merge that disabled the usage of deployment salt for rollup contract. --- l1-contracts/src/core/FeeJuicePortal.sol | 2 +- l1-contracts/test/Rollup.t.sol | 2 +- .../ethereum/src/deploy_l1_contracts.ts | 27 ++++++------------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/l1-contracts/src/core/FeeJuicePortal.sol b/l1-contracts/src/core/FeeJuicePortal.sol index 5b899bd577f2..00e166a51477 100644 --- a/l1-contracts/src/core/FeeJuicePortal.sol +++ b/l1-contracts/src/core/FeeJuicePortal.sol @@ -22,7 +22,7 @@ contract FeeJuicePortal is IFeeJuicePortal, Ownable { IERC20 public underlying; bytes32 public l2TokenAddress; - constructor() Ownable(msg.sender) {} + constructor(address owner) Ownable(owner) {} /** * @notice Initialize the FeeJuicePortal diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index c47e631adf4f..796d647ce453 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -56,7 +56,7 @@ contract RollupTest is DecoderBase { registry = new Registry(address(this)); availabilityOracle = new AvailabilityOracle(); portalERC20 = new PortalERC20(); - feeJuicePortal = new FeeJuicePortal(); + feeJuicePortal = new FeeJuicePortal(address(this)); portalERC20.mint(address(feeJuicePortal), Constants.FEE_JUICE_INITIAL_MINT); feeJuicePortal.initialize( address(registry), address(portalERC20), bytes32(Constants.FEE_JUICE_ADDRESS) diff --git a/yarn-project/ethereum/src/deploy_l1_contracts.ts b/yarn-project/ethereum/src/deploy_l1_contracts.ts index 9b63a51a5ae8..d009a5f570cb 100644 --- a/yarn-project/ethereum/src/deploy_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_l1_contracts.ts @@ -183,12 +183,7 @@ export const deployL1Contracts = async ( logger.info(`Deployed Fee Juice at ${feeJuiceAddress}`); - const feeJuicePortalAddress = await deployL1Contract( - walletClient, - publicClient, - contractsToDeploy.feeJuicePortal.contractAbi, - contractsToDeploy.feeJuicePortal.contractBytecode, - ); + const feeJuicePortalAddress = await deployer.deploy(contractsToDeploy.feeJuicePortal, [account.address.toString()]); logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`); @@ -224,19 +219,13 @@ export const deployL1Contracts = async ( `Initialized Gas Portal at ${feeJuicePortalAddress} to bridge between L1 ${feeJuiceAddress} to L2 ${args.l2FeeJuiceAddress}`, ); - const rollupAddress = await deployL1Contract( - walletClient, - publicClient, - contractsToDeploy.rollup.contractAbi, - contractsToDeploy.rollup.contractBytecode, - [ - getAddress(registryAddress.toString()), - getAddress(availabilityOracleAddress.toString()), - getAddress(feeJuicePortalAddress.toString()), - args.vkTreeRoot.toString(), - account.address.toString(), - ], - ); + const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [ + getAddress(registryAddress.toString()), + getAddress(availabilityOracleAddress.toString()), + getAddress(feeJuicePortalAddress.toString()), + args.vkTreeRoot.toString(), + account.address.toString(), + ]); logger.info(`Deployed Rollup at ${rollupAddress}`); // Set initial blocks as proven if requested From 7af8a209b5b47ec0fab39c181fd7c448dd006a70 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Mon, 19 Aug 2024 18:21:05 +0000 Subject: [PATCH 17/17] Provernet bot doesn't wait --- .github/workflows/devnet-deploys.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index 756b1b93abb4..da3d47bb0159 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -161,7 +161,7 @@ jobs: echo "bot_no_wait=true" >> $GITHUB_OUTPUT echo "min_txs_per_block=4" >> $GITHUB_OUTPUT echo "max_txs_per_block=4" >> $GITHUB_OUTPUT - echo "bot_follow_chain=PENDING" >> $GITHUB_OUTPUT + echo "bot_follow_chain=NONE" >> $GITHUB_OUTPUT echo "bot_flush_setup_txs=true" >> $GITHUB_OUTPUT echo "bot_max_pending_txs=20" >> $GITHUB_OUTPUT elif [ "$BRANCH_NAME" = "alphanet" ]