From ec5a5fb8fd9c344bcb0d33a4e9f07300d3317bf2 Mon Sep 17 00:00:00 2001 From: Alex Gherghisan Date: Fri, 16 Aug 2024 18:40:52 +0100 Subject: [PATCH] feat: add a prover-node to the proving e2e tests (#7952) Please read [contributing guidelines](CONTRIBUTING.md) and remove this line. --------- Co-authored-by: Santiago Palladino Co-authored-by: PhilWindle Co-authored-by: PhilWindle <60546371+PhilWindle@users.noreply.github.com> --- .github/workflows/devnet-deploys.yml | 2 +- barretenberg/cpp/src/barretenberg/bb/main.cpp | 3 + yarn-project/aztec/terraform/bot/main.tf | 2 +- yarn-project/aztec/terraform/bot/variables.tf | 5 +- yarn-project/bot/src/bot.ts | 13 +++- yarn-project/bot/src/config.ts | 20 +++-- .../src/e2e_prover/e2e_prover_test.ts | 73 ++++++++++++++++--- .../end-to-end/src/e2e_prover/full.test.ts | 6 +- .../src/e2e_prover/with_padding.test.ts | 2 +- .../end-to-end/src/e2e_prover_node.test.ts | 52 ++++++------- .../src/fixtures/dumps/block_result.json | 23 +++++- .../src/fixtures/snapshot_manager.ts | 73 ++++++++++++++++++- yarn-project/foundation/src/config/env_var.ts | 1 + .../src/client_ivc_integration.test.ts | 2 +- 14 files changed, 215 insertions(+), 62 deletions(-) diff --git a/.github/workflows/devnet-deploys.yml b/.github/workflows/devnet-deploys.yml index a85c040f70f..4003544e30b 100644 --- a/.github/workflows/devnet-deploys.yml +++ b/.github/workflows/devnet-deploys.yml @@ -75,7 +75,7 @@ env: 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_NO_WAIT_FOR_TRANSFERS: true + TF_VAR_BOT_FOLLOW_CHAIN: "PROVEN" TF_VAR_BOT_TX_INTERVAL_SECONDS: 180 TF_VAR_BOT_COUNT: 1 diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 9772d63c2ba..22e588bff27 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -1447,6 +1447,9 @@ int main(int argc, char* argv[]) } else if (command == "prove_keccak_ultra_honk") { std::string output_path = get_option(args, "-o", "./proofs/proof"); prove_honk(bytecode_path, witness_path, output_path); + } else if (command == "prove_keccak_ultra_honk_output_all") { + std::string output_path = get_option(args, "-o", "./proofs/proof"); + prove_honk_output_all(bytecode_path, witness_path, output_path); } else if (command == "verify_ultra_honk") { return verify_honk(proof_path, vk_path) ? 0 : 1; } else if (command == "verify_keccak_ultra_honk") { diff --git a/yarn-project/aztec/terraform/bot/main.tf b/yarn-project/aztec/terraform/bot/main.tf index 4871cd18eef..03a1c4a58cf 100644 --- a/yarn-project/aztec/terraform/bot/main.tf +++ b/yarn-project/aztec/terraform/bot/main.tf @@ -167,7 +167,7 @@ resource "aws_ecs_task_definition" "aztec-bot" { { name = "BOT_PRIVATE_TRANSFERS_PER_TX", value = var.BOT_PRIVATE_TRANSFERS_PER_TX }, { name = "BOT_PUBLIC_TRANSFERS_PER_TX", value = var.BOT_PUBLIC_TRANSFERS_PER_TX }, { name = "BOT_TX_MINED_WAIT_SECONDS", value = var.BOT_TX_MINED_WAIT_SECONDS }, - { name = "BOT_NO_WAIT_FOR_TRANSFERS", value = var.BOT_NO_WAIT_FOR_TRANSFERS }, + { name = "BOT_FOLLOW_CHAIN", value = var.BOT_FOLLOW_CHAIN }, { name = "AZTEC_NODE_URL", value = "http://${var.DEPLOY_TAG}-aztec-node-1.local/${var.DEPLOY_TAG}/aztec-node-1/${var.API_KEY}" }, { name = "PXE_PROVER_ENABLED", value = tostring(var.PROVING_ENABLED) }, { name = "NETWORK", value = var.DEPLOY_TAG } diff --git a/yarn-project/aztec/terraform/bot/variables.tf b/yarn-project/aztec/terraform/bot/variables.tf index e323540fde2..ecf275a84d2 100644 --- a/yarn-project/aztec/terraform/bot/variables.tf +++ b/yarn-project/aztec/terraform/bot/variables.tf @@ -43,9 +43,8 @@ variable "BOT_TX_MINED_WAIT_SECONDS" { type = string } -variable "BOT_NO_WAIT_FOR_TRANSFERS" { - type = string - default = true +variable "BOT_FOLLOW_CHAIN" { + type = string } variable "PROVING_ENABLED" { diff --git a/yarn-project/bot/src/bot.ts b/yarn-project/bot/src/bot.ts index 4c9d399da61..acba73ddfce 100644 --- a/yarn-project/bot/src/bot.ts +++ b/yarn-project/bot/src/bot.ts @@ -71,13 +71,20 @@ export class Bot { const txHash = await tx.getTxHash(); - if (this.config.noWaitForTransfers) { + if (this.config.followChain === 'NONE') { this.log.info(`Transaction ${txHash} sent, not waiting for it to be mined`); return; } - this.log.verbose(`Awaiting tx ${txHash} to be mined (timeout ${this.config.txMinedWaitSeconds}s)`, logCtx); - const receipt = await tx.wait({ timeout: this.config.txMinedWaitSeconds }); + this.log.verbose( + `Awaiting tx ${txHash} to be on the ${this.config.followChain} (timeout ${this.config.txMinedWaitSeconds}s)`, + logCtx, + ); + const receipt = await tx.wait({ + timeout: this.config.txMinedWaitSeconds, + provenTimeout: this.config.txMinedWaitSeconds, + proven: this.config.followChain === 'PROVEN', + }); this.log.info(`Tx ${receipt.txHash} mined in block ${receipt.blockNumber}`, logCtx); } diff --git a/yarn-project/bot/src/config.ts b/yarn-project/bot/src/config.ts index 01f38ce3e7a..4512902f7c1 100644 --- a/yarn-project/bot/src/config.ts +++ b/yarn-project/bot/src/config.ts @@ -7,6 +7,9 @@ import { numberConfigHelper, } from '@aztec/foundation/config'; +const botFollowChain = ['NONE', 'PENDING', 'PROVEN'] as const; +type BotFollowChain = (typeof botFollowChain)[number]; + export type BotConfig = { /** URL to the PXE for sending txs, or undefined if an in-proc PXE is used. */ pxeUrl: string | undefined; @@ -28,8 +31,7 @@ export type BotConfig = { noStart: boolean; /** How long to wait for a tx to be mined before reporting an error. */ txMinedWaitSeconds: number; - /** Don't wait for transfer transactions. */ - noWaitForTransfers: boolean; + followChain: BotFollowChain; }; export const botConfigMappings: ConfigMappingsType = { @@ -86,10 +88,16 @@ export const botConfigMappings: ConfigMappingsType = { description: 'How long to wait for a tx to be mined before reporting an error.', ...numberConfigHelper(180), }, - noWaitForTransfers: { - env: 'BOT_NO_WAIT_FOR_TRANSFERS', - description: "Don't wait for transfer transactions.", - ...booleanConfigHelper(), + followChain: { + env: 'BOT_FOLLOW_CHAIN', + description: 'Which chain the bot follows', + defaultValue: 'none', + parseEnv(val) { + if (!botFollowChain.includes(val as any)) { + throw new Error(`Invalid value for BOT_FOLLOW_CHAIN: ${val}`); + } + return val as BotFollowChain; + }, }, }; diff --git a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts index 65bc3b987a6..209bbce574e 100644 --- a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts @@ -1,9 +1,11 @@ import { SchnorrAccountContractArtifact, getSchnorrAccount } from '@aztec/accounts/schnorr'; +import { type Archiver, createArchiver } from '@aztec/archiver'; import { type AccountWalletWithSecretKey, type AztecNode, type CompleteAddress, type DebugLogger, + type DeployL1Contracts, ExtendedNote, type Fq, Fr, @@ -15,9 +17,12 @@ import { deployL1Contract, } from '@aztec/aztec.js'; import { BBCircuitVerifier } from '@aztec/bb-prover'; +import { createStore } from '@aztec/kv-store/utils'; import { RollupAbi } from '@aztec/l1-artifacts'; import { TokenContract } from '@aztec/noir-contracts.js'; +import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; import { type PXEService } from '@aztec/pxe'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; // TODO(#7373): Deploy honk solidity verifier // @ts-expect-error solc-js doesn't publish its types https://github.com/ethereum/solc-js/issues/689 @@ -34,7 +39,7 @@ import { createSnapshotManager, publicDeployAccounts, } from '../fixtures/snapshot_manager.js'; -import { setupPXEService } from '../fixtures/utils.js'; +import { getPrivateKeyFromIndex, setupPXEService } from '../fixtures/utils.js'; import { TokenSimulator } from '../simulators/token_simulator.js'; const { E2E_DATA_PATH: dataPath } = process.env; @@ -72,6 +77,9 @@ export class FullProverTest { circuitProofVerifier?: BBCircuitVerifier; provenAssets: TokenContract[] = []; private context!: SubsystemsContext; + private proverNode!: ProverNode; + private simulatedProverNode!: ProverNode; + private l1Contracts!: DeployL1Contracts; constructor(testName: string, private minNumberOfTxsPerBlock: number) { this.logger = createDebugLogger(`aztec:full_prover_test:${testName}`); @@ -109,7 +117,7 @@ export class FullProverTest { FullProverTest.TOKEN_DECIMALS, ) .send() - .deployed(); + .deployed({ proven: true }); this.logger.verbose(`Token deployed to ${asset.address}`); return { tokenContractAddress: asset.address }; @@ -133,7 +141,12 @@ export class FullProverTest { async setup() { this.context = await this.snapshotManager.setup(); - ({ pxe: this.pxe, aztecNode: this.aztecNode } = this.context); + ({ + pxe: this.pxe, + aztecNode: this.aztecNode, + proverNode: this.simulatedProverNode, + deployL1ContractsValues: this.l1Contracts, + } = this.context); // Configure a full prover PXE @@ -153,12 +166,11 @@ export class FullProverTest { this.logger.debug(`Configuring the node for real proofs...`); await this.aztecNode.setConfig({ - proverAgentConcurrency: 2, realProofs: true, minTxsPerBlock: this.minNumberOfTxsPerBlock, }); - this.logger.debug(`Main setup completed, initializing full prover PXE and Node...`); + this.logger.debug(`Main setup completed, initializing full prover PXE, Node, and Prover Node...`); for (let i = 0; i < 2; i++) { const result = await setupPXEService( @@ -204,7 +216,45 @@ export class FullProverTest { this.provenAssets.push(asset); } - this.logger.debug(`Full prover PXE started!!`); + this.logger.info(`Full prover PXE started`); + + // Shutdown the current, simulated prover node + this.logger.verbose('Shutting down simulated prover node'); + await this.simulatedProverNode.stop(); + + // Creating temp store and archiver for fully proven prover node + + this.logger.verbose('Starting archiver for new prover node'); + const store = await createStore({ dataDirectory: undefined }, this.l1Contracts.l1ContractAddresses.rollupAddress); + + const archiver = await createArchiver( + { ...this.context.aztecNodeConfig, dataDirectory: undefined }, + store, + new NoopTelemetryClient(), + { blockUntilSync: true }, + ); + + // The simulated prover node (now shutdown) used private key index 2 + const proverNodePrivateKey = getPrivateKeyFromIndex(2); + + this.logger.verbose('Starting fully proven prover node'); + const proverConfig: ProverNodeConfig = { + ...this.context.aztecNodeConfig, + txProviderNodeUrl: undefined, + dataDirectory: undefined, + proverId: new Fr(81), + realProofs: true, + proverAgentConcurrency: 2, + publisherPrivateKey: `0x${proverNodePrivateKey!.toString('hex')}`, + }; + this.proverNode = await createProverNode(proverConfig, { + aztecNodeTxProvider: this.aztecNode, + archiver: archiver as Archiver, + }); + this.proverNode.start(); + + this.logger.info('Prover node started'); + return this; } @@ -222,6 +272,9 @@ export class FullProverTest { await this.provenComponents[i].teardown(); } + // clean up the full prover node + await this.proverNode.stop(); + await this.bbConfigCleanup?.(); await this.acvmConfigCleanup?.(); } @@ -246,17 +299,19 @@ export class FullProverTest { const { fakeProofsAsset: asset, accounts } = this; const amount = 10000n; + const waitOpts = { proven: true }; + this.logger.verbose(`Minting ${amount} publicly...`); - await asset.methods.mint_public(accounts[0].address, amount).send().wait(); + await asset.methods.mint_public(accounts[0].address, amount).send().wait(waitOpts); this.logger.verbose(`Minting ${amount} privately...`); const secret = Fr.random(); const secretHash = computeSecretHash(secret); - const receipt = await asset.methods.mint_private(amount, secretHash).send().wait(); + const receipt = await asset.methods.mint_private(amount, secretHash).send().wait(waitOpts); await this.addPendingShieldNoteToPXE(0, amount, secretHash, receipt.txHash); const txClaim = asset.methods.redeem_shield(accounts[0].address, amount, secret).send(); - await txClaim.wait({ debug: true }); + await txClaim.wait({ debug: true, proven: true }); this.logger.verbose(`Minting complete.`); return { amount }; diff --git a/yarn-project/end-to-end/src/e2e_prover/full.test.ts b/yarn-project/end-to-end/src/e2e_prover/full.test.ts index 485c6d3d847..926e19d98ff 100644 --- a/yarn-project/end-to-end/src/e2e_prover/full.test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/full.test.ts @@ -18,7 +18,7 @@ describe('full_prover', () => { await t.applyBaseSnapshots(); await t.applyMintSnapshot(); await t.setup(); - await t.deployVerifier(); + // await t.deployVerifier(); ({ provenAssets, accounts, tokenSim, logger } = t); }); @@ -63,8 +63,8 @@ describe('full_prover', () => { const sentPrivateTx = privateInteraction.send({ skipPublicSimulation: true }); const sentPublicTx = publicInteraction.send({ skipPublicSimulation: true }); await Promise.all([ - sentPrivateTx.wait({ timeout: 1200, interval: 10 }), - sentPublicTx.wait({ timeout: 1200, interval: 10 }), + sentPrivateTx.wait({ timeout: 60, interval: 10, proven: true, provenTimeout: 1200 }), + sentPublicTx.wait({ timeout: 60, interval: 10, proven: true, provenTimeout: 1200 }), ]); tokenSim.transferPrivate(accounts[0].address, accounts[1].address, privateSendAmount); tokenSim.transferPublic(accounts[0].address, accounts[1].address, publicSendAmount); diff --git a/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts b/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts index ec2e3ddee5d..30e507012ab 100644 --- a/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts @@ -10,7 +10,7 @@ describe('full_prover_with_padding_tx', () => { await t.applyBaseSnapshots(); await t.applyMintSnapshot(); await t.setup(); - await t.deployVerifier(); + // await t.deployVerifier(); ({ provenAssets, accounts, tokenSim, logger } = t); }); 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 b300dc8dac2..518c1ad6c39 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 @@ -5,10 +5,8 @@ import { type AztecAddress, type DebugLogger, EthAddress, - type FieldsOf, Fr, SignerlessWallet, - type TxReceipt, computeSecretHash, createDebugLogger, retryUntil, @@ -35,7 +33,6 @@ describe('e2e_prover_node', () => { let recipient: AztecAddress; let contract: StatefulTestContract; let msgTestContract: TestContract; - let txReceipts: FieldsOf[]; let logger: DebugLogger; let snapshotManager: ISnapshotManager; @@ -84,42 +81,28 @@ describe('e2e_prover_node', () => { }, ); - await snapshotManager.snapshot( - 'create-blocks', - async ctx => { - const msgSender = ctx.deployL1ContractsValues.walletClient.account.address; - const txReceipt1 = await msgTestContract.methods - .consume_message_from_arbitrary_sender_private(msgContent, msgSecret, EthAddress.fromString(msgSender)) - .send() - .wait(); - const txReceipt2 = await contract.methods.create_note(recipient, recipient, 10).send().wait(); - const txReceipt3 = await contract.methods.increment_public_value(recipient, 20).send().wait(); - return { txReceipts: [txReceipt1, txReceipt2, txReceipt3] }; - }, - data => { - txReceipts = data.txReceipts; - return Promise.resolve(); - }, - ); - ctx = await snapshotManager.setup(); }); it('submits three blocks, then prover proves the first two', async () => { + // Stop the current prover node + await ctx.proverNode.stop(); + + const msgSender = ctx.deployL1ContractsValues.walletClient.account.address; + const txReceipt1 = await msgTestContract.methods + .consume_message_from_arbitrary_sender_private(msgContent, msgSecret, EthAddress.fromString(msgSender)) + .send() + .wait(); + const txReceipt2 = await contract.methods.create_note(recipient, recipient, 10).send().wait(); + const txReceipt3 = await contract.methods.increment_public_value(recipient, 20).send().wait(); + // Check everything went well during setup and txs were mined in two different blocks - const [txReceipt1, txReceipt2, txReceipt3] = txReceipts; const firstBlock = txReceipt1.blockNumber!; const secondBlock = firstBlock + 1; expect(txReceipt2.blockNumber).toEqual(secondBlock); expect(txReceipt3.blockNumber).toEqual(firstBlock + 2); expect(await contract.methods.get_public_value(recipient).simulate()).toEqual(20n); expect(await contract.methods.summed_values(recipient).simulate()).toEqual(10n); - expect(await ctx.aztecNode.getProvenBlockNumber()).toEqual(0); - - // Trick archiver into thinking everything has been proven up to this point. - // TODO: Add cheat code to flag current block as proven on L1, which will be needed when we assert on L1 that proofs do not have any gaps. - await (ctx.aztecNode.getBlockSource() as Archiver).setProvenBlockNumber(firstBlock - 1); - expect(await ctx.aztecNode.getProvenBlockNumber()).toEqual(firstBlock - 1); // Kick off a prover node await sleep(1000); @@ -147,13 +130,20 @@ describe('e2e_prover_node', () => { await expect(proverNode.startProof(firstBlock, firstBlock)).rejects.toThrow(/behind the current world state/i); // Await until proofs get submitted - await retryUntil(async () => (await ctx.aztecNode.getProvenBlockNumber()) === secondBlock, 'proven', 10, 1); + await retryUntil(async () => (await ctx.aztecNode.getProvenBlockNumber()) === secondBlock, 'proven', 60, 1); expect(await ctx.aztecNode.getProvenBlockNumber()).toEqual(secondBlock); // Check that the prover id made it to the emitted event const { publicClient, l1ContractAddresses } = ctx.deployL1ContractsValues; const logs = await retrieveL2ProofVerifiedEvents(publicClient, l1ContractAddresses.rollupAddress, 1n); - expect(logs[0].l2BlockNumber).toEqual(BigInt(firstBlock)); - expect(logs[0].proverId.toString()).toEqual(proverId.toString()); + expect(logs.length).toEqual(secondBlock); + + const expectedBlockNumbers = [firstBlock, secondBlock]; + const logsSlice = logs.slice(firstBlock - 1); + for (let i = 0; i < 2; i++) { + const log = logsSlice[i]; + expect(log.l2BlockNumber).toEqual(BigInt(expectedBlockNumbers[i])); + expect(log.proverId.toString()).toEqual(proverId.toString()); + } }); }); diff --git a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json b/yarn-project/end-to-end/src/fixtures/dumps/block_result.json index 8243c7cfef2..ac42be5f64a 100644 --- a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json +++ b/yarn-project/end-to-end/src/fixtures/dumps/block_result.json @@ -1 +1,22 @@ -{"block":"06a48c149b9f07a40484e8ee3f4dc4bddfef61b72cb406c004c2e78409a4195000000009000000000000000000000000000000000000000000000000000000000000000200d4a6b1654c63744d273f4cb9c8cd2e9028912b3c980133873a7d26f9c98efd00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000901cdfa98dc0dcee5ce093e93988a6288fbcada0b334e5687bd452b8e35a76c4f800000480015cfc7c3c062b1ebad0d4222886a8a2e39983ec113de881c4b858269b6f6c8e000005002353fa6fc72e1c9b59cc203024bcdf2f61090ae8ff71ef1c7f9d426aaa31fb3d000005000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000066879d7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000017d862421cd30d89eda9aec991cbed0e0815bbf9ab46cef6b0f99d2c2c2254a543287c9c0000000a0000000200000000000000000000000000000000000000000000000000000000000bec56b002019c23681b804d9612e0f41081b746a3647b3c4d8074c5d9c5a661c9bd02f48d1f1d4ca452d4f6f8e74f48f02088b7a916a8b3a0548e13c301a6271df0db48aa022ba8f0ef06ee82d116708a3587cb5b01f70cee9b3eb80d07be5fae008226f13f2bb71c545b12dc3f635740f896dc3bda87e9f4c944f74734e99515490eb4026000000000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000000000000048c00000488000002400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b9f587da4ef3fcf590c8ac5acc12610f4b4667b24ed14682f3ae7bc8d7eb2c2db533ef73c5205a40e838722f0cd595a9c10296baea5b707aa82456902e8918cd58639f1409dba7d1351c0bbf3848add8bf2fb24562b0f4426086629c5d16399ba064d36462f25fbd4d9b9b52087cba20bfe599210c6ebe49d6644408ef8ce5c2d0a1ca96b340379a89ca294850401282ce8a7aee5df23f93e1c9383a317bd7ce8c6e2049eae65c850eb43ef4c2f53013ec3fde59903094b231a1289f21c800ffdef142b1f8a14392f22d4ebaa3c599d259662dbcfe0b693a4be216b94345f2e9505ab9b24d30aa04b0b4865e008ceb42a47339f06157a88b3a0b1eb835a287f2a09c1119af2062f4e3f0cc92bfda0cdd82cc8e8c22e7c22d973a93e2866123ac74f5c390868bfd6a79acc92e7dd9a973e191986b3cc62cacb95859a3c0b513a55cbe462fedac523df639c546a5db7eadb24ed8219e0653e209438b8cc08ee455493cfb0bb0fefa3011ff8e731939fe2cab4388923e89d1ed932f2e064814bf00343c3a3b88eb874ad97336a50d511c5f155228bea1b71493492a100a51a53da8f8a22284801dc9fbd36ca19b7c9593399726288b250d8b7d082cde2633da4624cea927a618e18b7e42fd47c8266963edbb428d8cd5fd4f93916db1559eb2b9347f2661696dff0b9b52b76ce32c3f696077d82c8430ad248cabc27bb44d52eb0000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e4a1bebea81168dafad6f2bdacfd40372f7cfc05e70bdf0c92ff2f747471900a2689abc0d110423a66df61236b315d408226743794d09794a29a241abbeb3ac55db0434f6cae603c7fe0c54124454cc861194edac1103313247cd1751aa68b6a5ef176e99741e409f86a37acb1723959ec30138ed02d89c225308a5e68cacec067e6eee13e8d7cf4d7997088c2d63aa7189db1ee5d3fb99883e39dedbe57e0a7c5bc24391063ed8d31b792b12a686467fe5879601c30c553e514b9d16ebebbcce13e92fcc3ccd1445f9db1a68175ee962620c33e379ca37b3e2ea6ca779b74aa0e11bf13211632d7a76fdae54b6cc05ada9960126d89d7b1f5f1ebd5b7236ff3571930ebdd0676d32b4743fbd11d12de06c07af8a90436cc54754f8f4cb70830302b5084eab0c14f479dfbc474f856a2c1965abdf571a218185487fca384e76535ecd0f612dea66fdc71008e9bf314874f93cf5b68bfacf4ddbce9a58b5b626bcefac5c65aab79609bbc60a242da8ad318580a8cac02f697e6b6397cc73063bab35779d1dfc476fca8c73cc3f99275d7f2397d0e1c0ae46b62b3ed239e6cc3a449e197f03d0930242f92ac90076d4f4e22f84ae7e0b5fa47c65569522c52ed8ef75341667ede3802c2308b79eae9c594dc8d40d79d5f448aec20611f76954c534e2d8d653b38a614731a6ba0dd4d1cf3e66efce3b855b209fce80dbcc8b59000002680000026400000260066eff2be6545b71613ee324b4f7644bd07f479ff27f1427c6d2036b094b753f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091fa823c9d4dad62d349aedc826c1f76d266583a684b2507963c46f06253de1fb741366cb341eb5b6fb18f435dde9b016d2745b4e670b736da74ab04619d105b47a9d0a900ca3e6b9a495200d360e5f56c062979e3dfc01a88d31b8288f18843b10b69dfb1ec05fd47eabafc3247ea5f86b747611d6dbc4e78468fd6b1495cb8ac0e4e16e671432e3034ad004e91bdae4e6f6af41927d94662b02cfc8e489a080edb2f22ca1adbb11618dce8698662de3fb8eb1db97f4a25762d8f23641aedca6bbd1697f104e9a9e7e9110dab84316461573a64f2f9bf67644f378327a3343591585b9080e7db0a329aa1f9372d1ecb1df51c7b43deb155e18f90e5ea05688f7502e7fa30e8ccbfe91ffbfb2ac7000599c4569f909e3e1c64468fd476db3ed58de5cec7b6967a787ee0f28520e6b2ec5cb19764c284315f04f57e946a376b843193ab4ec31c5faf18119a8ffdaea3048c7a2b47b9ddf05102ed1e43ad10d557a652cbe6b0fe7d2feb082f62cb549538d3ec955919d5a382ec815c4a5876a4ed6cd271ccdf9242d9f7a3265c7b2856c1a78aa429667a687f0652bc451f2df88f0845b7e8226edef077685bd47b157f3fc2e84c308faaf5b9c18c13d1bbc06b01b43db5d68d0eb18611505abd4d9ab7b0ad47b1635bb2c831e53e3db2642ca291de395097a8c19edade1938ffec82b7b74c04f0744d163d73e62ca1b6f6cc04000000040000000000000000000000000000000000000000000000000000000000000000000bec0b9200012cd62e91677d9cba2fee4932c0ac07f9bda9f4c0222114798a062fcbe00384e200021c771b1eec4a4b2be897e26cb9331e02654645ea883d6c4e6f4e664f4e2bd14500000000000000000000000000000000000000000000000000000000000013881d6a2422e2bd4b148e058c92a0ae0247efd5164686bc35d166ea6b653ff8cdc5000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000","proof":"00000da01cd30d89eda9aec991cbed0e0815bbf9ab46cef6b0f99d2c2c2254a543287c9c000000000000000000000000000000000000000000000000000000000000000a27baa73f715e0ecd7832b9f655a8543cef524f772a37cdbbb1f64b0eb31e922606a48c149b9f07a40484e8ee3f4dc4bddfef61b72cb406c004c2e78409a419500000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000200d4a6b1654c63744d273f4cb9c8cd2e9028912b3c980133873a7d26f9c98efd00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f8000000000000000000000000000000000000000000000000000000000000000901cdfa98dc0dcee5ce093e93988a6288fbcada0b334e5687bd452b8e35a76c4f80000000000000000000000000000000000000000000000000000000000000480015cfc7c3c062b1ebad0d4222886a8a2e39983ec113de881c4b858269b6f6c8e00000000000000000000000000000000000000000000000000000000000005002353fa6fc72e1c9b59cc203024bcdf2f61090ae8ff71ef1c7f9d426aaa31fb3d00000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000066879d7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000017d8624200000000000000000000000000000000000000000000000411700d6c4cf14ec00000000000000000000000000000000000000000000000092a9c3224b018d49d0000000000000000000000000000000000000000000000072d1022a88f16c52b0000000000000000000000000000000000000000000000000001b36811921c81000000000000000000000000000000000000000000000007f0819be5758c25f20000000000000000000000000000000000000000000000007fc055b30fc5cf6400000000000000000000000000000000000000000000000316c9c3b0385c17680000000000000000000000000000000000000000000000000001cd75bd2f36640000000000000000000000000000000000000000000000032f5395931eb1209800000000000000000000000000000000000000000000000f9a88d0be49ab9d4b00000000000000000000000000000000000000000000000d077fab6d15e7029f00000000000000000000000000000000000000000000000000018a72eb3d3bf500000000000000000000000000000000000000000000000446902910332b16570000000000000000000000000000000000000000000000046419b3737fd0a12000000000000000000000000000000000000000000000000c8b87236ac632c8e3000000000000000000000000000000000000000000000000000056b92ff0f1fa0e2d5505193cae745bc5092945b9a60d066ac943b8a21bb7b03cafe1adc3a81326bf7788363144636bd31e3ff842b0a0b925d4b95a5dc9f1210062210e64c85221e2504c667027cd92a45f3cabad887878c49f2ec8faa976a87e185eeac3e44529fa5d26b91c3cd82e5c9c9b14cf51e6515bbdb1d161a2049cdce317dbf5f45b1b120471e41662fc0d4554af553b40a6af62221fc076fdbe8d369b3b997a7d7c26cc2fa11b4a73b65698af048ee23ec107c23b2b2fca160b8590b5e9964f1609047e8037729cd2a3395b53c7ad5530b60a385308d5d0562e535192cfe0f3dee016f14f0193371e7a9a0908e91728d46479e74e6bc12da1444181a1115c2557a5035d1775ad4e31b5b2385a154395d57c1bdf95ba209d525e1f77f6f3fd6749b227b66a096eb901513ac2df36a01d0b2b61616a3a300b85b281a8339571cc133c0a067e38200b49fb3dc8a571102fac8bb1f479ddfac959f9cdacf099ae17690002eb36b1043bc31379ef93bb1cfd27b1d29e80bf08a9c9786efbfd63b52fe8e31dfc8205fb56d490a669a177d0aef3312c5eb05e944ac5eb8b0b50c82bbbf7122bec29e61578e5b4c075ed7cade1fe328c1d9f4c23eff59db2b2edf335216d770d75b68ccea64ecf3cef78b5324242bfbb54a76ccae1dbeb7a624bfede327cb314516b283acf07ecf6be4ac2bef91e5b22ad0f247a664787cb724ae3d79823e106de91200c3e92c83693c7e6414954a14a3dc35afa9d5b45807ed6fa7ae4102b0129fc50bb8e6f77ffb4d5dca652851dbb5d23411fb850f5fbddb3ea211354170f9f9c2e5e8fd54a6c6ccfc213418b6530eb19a932f86425bff044ad32c9b2d0304fed62357f5030b417b3e9e76dead3e66adbf3b1e211f49dda0cabc48d154d0ccc9acaf558ffeba06af0dc1ee6250ad9dc0d9ed8312c3f4ec53d161e338c5f2a448e2add29ebab3ebb8c4591debfb6cec707b05858b2e6ab7143adb15c7c461496ab69f2caf2183869fa5fab4dc6b29a4d5a50d5b82e4efb2f7f9e0380fa0c2473d9e1841b30f99c6745914bee99336bc088e7c6472ced3f1bb25b72c3f77c208fa4ceb955c724657c9acced1375e687d05db1173a8146524b1742e51d32512385322a7a81de13f746a35f0baa26557e587ed5fa076ff78eee942c1f88830f065e47fdb4299a74c53da88ff464f6f253cd53b577d16613b4a39c4f3025245e27460bc3f12606c463528fcc9d9726af32c37d6a5a34b76eecbf6338a6ed446a23f78856d66bf869df8a4f8025686379fdbeb4f4ced6dad072724077370c3a242cf331a3c5f0b1b5cefa491079f6a35b07810356fdecafc90ff2a589bc8816c921c4f77f4ae4af1ddd7f956dbb76aa3bed103948363fbd07ff8b5dce5705c2fd151b8e7f353f3c13cfaae537337b0614da5aaaa15a78088deee5fa8aeba9a0241c1d69145fabdf57d423b64c30faeb7c53bfe606a645baedbc3744704d34e9ce05043fe94f5bbd2eb6e62f4d9489886f83cb9e148f84f290c4af27e72f7b7227106ec3a43ba875f8baaa564bf6ddf14698c9fed648dd068d59ca1e2e1b4f11a91d4a70ae8ecb1efca06212cd9f1a40eb3129650e5ea75119576075449aa890250772b1d8c93aade60080813d124a6b40eb863653ad2cc9a255dbf12adcae984b137448b0473b3600af40a464cae3fddda2b1f208f2c71892bee6892cac7251bf150c25a3325c17faa3ca7b695f331d7815d45cb748fcf440e1670ded9224ccc412cf6358db1109fcb48a5365aec60f83d7d312de326a47d2f62bdf50b420b71a0cbd3784b5203622a2d1a63c883b46d25951407e69911605a78bee23d4c233650179d25e63bc5ada8bd4f17caf1f2b3f526f3b516ec384cb03554b90ead4f1d6111f8031a4f4e763e3ee95112a81553441b3a4033a5da8387876180b38f7555b20d511ce4f33591c3d42075acd495ba62329aeb2060946d9fb53c4dae4f3e9c9073952c4c4a245392f308db379cd56f98cba838d396fc475c900e1bea96e8ae004005be1b59c833be1302c8399e12cda0747b59f287f7777d9e601df7112175a15a2fce62a1e43faaaa03df8163c27aafa675053d618b75366c72460d5f4a61523530dacd57684ec5c31bb63ca2efb5747438c482343a601f660d4f077dd06221db045d47a19b484e375f71317401c1ab96bfd8612799eb9883e0c4dc8294a3526e0f3465cbdc5c37d8be48b9df7e4ba02ca5b435e9d01a8acf344a00b759f0d12197b0a0bb19857762dbac1708a31772bb82ba8adc61a608a971ad7d5a74d880154d930e320618d39639ee341747abbd5508e9eb2b063ccd688b3f4b6e80dce2a8b9216a0ae38a90dcfe52effe789ee3500a2887ddb763ff1d48e48abebb6d32c7aa47d2b16e079ee3fa0d5435036875a6f88fe489060bbc4151b7671b1468f23552f614c78ffaa65942f5052f43d75adf499eedfa30915b8b8c82638134c5707b54757110744d89ccef92a43de0fa32d856e46352e57456f6e89ffee1074f701e5df46eb2b01c5beef8b3914526c057ef9873f357c3012305a3905bbd5037a286a7328d181da93ef085f81267c0f06fa45b8bc0e5f829f869956aeba201e2e21c65d131c30cc048becd93ba38f04bf6bb19aeb8dde081286441dbb5fdf364625c407db9d2ae61d08e4ccfc18ef9d1fcdf07ba1b416e4377eebea37a94d417a1736dace8ac0239bc23b1fbf3ddfe110376a4f01057e86f4a3a2e45dd3ac319401fa82aec40fd865fbc390f7bfc2fd77b97ffef00baab3a92d7654b8d790782a2e8072801bb9eaff2344f5fc5bb0e79260021448d445eefb1bd50ba2d0328ed9177605fc3af5c836b06018e67e213f35d8df27913b3aa20f3667a9db14eca25e255f9fd38c5a1a40e1b89f306091330873ce312919fffc589bce4c826c58ece3229b471a1d8780c4f81390bd8275eccdc5cae9515a1d821213d02a2cbddf9af12a6f84e7fae74f3ff9637b143fc8d425cccbdfb6945005c400206f4cc5c8e2720000002a","aggregationObject":["0x00000000000000000000000000000000000000000000000411700d6c4cf14ec0","0x0000000000000000000000000000000000000000000000092a9c3224b018d49d","0x0000000000000000000000000000000000000000000000072d1022a88f16c52b","0x0000000000000000000000000000000000000000000000000001b36811921c81","0x000000000000000000000000000000000000000000000007f0819be5758c25f2","0x0000000000000000000000000000000000000000000000007fc055b30fc5cf64","0x00000000000000000000000000000000000000000000000316c9c3b0385c1768","0x0000000000000000000000000000000000000000000000000001cd75bd2f3664","0x0000000000000000000000000000000000000000000000032f5395931eb12098","0x00000000000000000000000000000000000000000000000f9a88d0be49ab9d4b","0x00000000000000000000000000000000000000000000000d077fab6d15e7029f","0x00000000000000000000000000000000000000000000000000018a72eb3d3bf5","0x00000000000000000000000000000000000000000000000446902910332b1657","0x0000000000000000000000000000000000000000000000046419b3737fd0a120","0x00000000000000000000000000000000000000000000000c8b87236ac632c8e3","0x000000000000000000000000000000000000000000000000000056b92ff0f1fa"]} \ No newline at end of file +{ + "block": "10e008bcf207d63bd25e82e72644aa35f6bfb1b8827bb9c7a7a3ce5288d6a22900000009000000000000000000000000000000000000000000000000000000000000000200e637eadc87f80d3e574218461b3a9919c965f3ea08d1c282de05c19c28ada100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c314f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000902b6118e9af4cf0cc12d53eea4d7095cde7944cff4505a918266f9fa51d6ce3aa000004801c17581727b72ab3a225b6a1e750391cf771e2e8ef6f39847862b6e6ae265496000005002ab90d519c7d55bb710ba7ea8a17ff66f07890b3b25957a6f588e82c240f8f83000005000000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000066bb844a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000017d838b22e8e05b3bb1478f7158f8d7d86e8afebd8eb1228012f722663cbca9c257058e10000000a0000000200000000000000000000000000000000000000000000000000000000000bec47b00205f15d1a73672a4c8bf09360ad0182a56cded22fedf1e0d1e32d49b5fdbbda13041d013fce38a2244102529a0bcf81e16635536b0eaef4f4a221610b5df89524020bd8b3d97120eff1d091b4dde76e63996616d6ca0032dbb54d6d9b0732f1bd6f0bae0ba644d22b9c76fbd3d99b13442af7382d686d49622ea3b83fe90679d57700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a088d80f95d8a41d57e710d5e41c7520def4677a1fd79ef3ef4f69b391e49c1e2f507cddf70154642d6b191401d1e19d088fd211a401899df7eec5c49b4070f8f60105345d7d143d073221aa533d90a989b0173edc1cc3b972bdb39f84808b1960698e4f7524852fae8b3480494e031e55958a537c167b7c02c51334c7eeeec057f2d97805fe5f71eef8089f66ac2e65478387deee4218be94ad9fb05eb2312eea650721c25ae1f827fd0121ae4f74459751fd1914518b835c2acf54d2442df604ec7cdf852a4f06514274766748f087e3e1763a3d90eae579b1d575df22dbfe05edc979870cac6b3448a90b85fb6afe093ee07d38dc8a3b38828202b8ffb3214db1dcda737e3a532c9473a8659a834350f7c49df05eeb597ef4483a4cf231097eb94089565a372800e383bf52322f69d3050f30308afff240a264ffadaba3656047c188f0b64f72607d36edf5c1587bf7ca66a3ab52316aee168abbc4ee51b63601230e5b72a9f5cd280dff949a0fdc9e9037a4ab3a8ba10ad7f202ad85f4972ddb62dbe8b791b53e472628816f2aa325540b252976ca7cecd12ebaafde40066869c9eaee1332818fb4ecebf27f18954e3aca8175c0fd4c69d0af6ded472949000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000457f49b5a30ec53d2e0d18aab91fe8754da77e473da748f12b230ebf3d0968e29592a172aa9db76148355da21adc1729c0d8159ffb95b88fa0de91467f7b9fc42a6a433f485684596b0fde220a98004d69272b9a24899ea6e96570a0db5c4cc49db99d1e99c812540218c419dc91efa4922a7f64680956b69488c296061934163fe309dda2d44432fb2dfba215ce3fd02ad0764b35eef08376c6a69cd1aa959d7955310944775d0e7343a3c7168bd644b3f34fe197e523717c48f7e581ab3055875325e43d12ce5852e2e6d2fcea0d3ab2c0c27193bcd6710bc411c40977fdc841443757506c225b2488da4ec24b4085bbba09093f08abe767630f77f957823941dfe2993bd279b28821d4003d3fa0b36bb41df35ef738e7643e9566975cd6c2dfa09ce433ffb3748886ddbe3840cee01f5efa1835c31a587dc62466d02066901fb44754e26a1195c766230c8087b83b909ed2f5efc0650f4dcd7abacff4d52c85c33380bb40cef56c71f77ba0fea8690da9faaf0e5222e9ed285c7db18a9c20d2f1595f03f06d2bdafe3083d578fcd997215c8d4ff97b140637254c3484cd81604b4342e5d3bd98ec7c406999c1577fc0105606116d24d5df98907586ab820000022800000224000002201e39f75b5116a9749fb322176027b1ad85a1f7e1e35e69bb6c31a3a364410f5d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086c793a719632385d608e782944590323a7ef4ce6a3e5cb931ffc0bc228474231ade4b511273e4bcb24b908d97ccc415a2c025ce26510473ebbe9a0c3343007654e0b62791d4a34862530e4095534cc0a23d25cd3b687aefeb14f9456e8653ad86fd417c743ebedba7a2cf48fd5c74538cbea0951e32c56527bc0b673b657de25d5687a49569f8f5b797a88d76ea35723771119aad9b33bad94a7ba9667e7dcf7013c4819a6000f73f7e1a2a40a2df12f9430c91db454a6931941f6b5a17c4436c6f0e0d106dc22be4891a265609e21c27742f187eaf36a3e364e49d781733e347337c80dea9988b12d06d37c14ed999979b6586c4b6224d81ef195d8df4ace9122c58d5fa756d0fabb7640de2c289e053557691019c73dbb83b8c19053249f7344f9b767ee9583d7275a0f4370003bc6657b07d5debcdcb317bfef4e668ccad714e7e703eeaba0c4dac442ea11e028489846c5817d43b59a30c005d8d7fde7236c46eb661c4118042976b51607bab139e5d312a39a6967928d493b29ccdc3904b8d1b526352a1f649ca7b1bf9d8958373b45e5e9b89d4d2fa9b7d221333e96b58de23c2a55ddc33c691d2fe2f2ff81f51cfb5faa2fa843a04cd682a9df73e40000000040000000000000000000000000000000000000000000000000000000000000000000bebf10200012ad84fd7d4a3f745e53ed5087cacf6f0509b08f404e19329a414abee51aaaa770002119f2715291daa2ec939db36562f9ad86025e8646272bdd8d058de8d38e2c166000000000000000000000000000000000000000000000000000000000000138816bd76ba818bc49e3e364b1592b2a5501f8ca6c04229cde3fc4f58b7c19a1f84000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000", + "proof": "0000002a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "aggregationObject": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] +} diff --git a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts index 8f4a9f65aca..ef5b7b56915 100644 --- a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts +++ b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts @@ -1,4 +1,5 @@ import { SchnorrAccountContractArtifact, getSchnorrAccount } from '@aztec/accounts/schnorr'; +import { type Archiver, createArchiver } from '@aztec/archiver'; import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node'; import { type AztecAddress, @@ -19,7 +20,10 @@ import { asyncMap } from '@aztec/foundation/async-map'; import { type Logger, createDebugLogger } from '@aztec/foundation/log'; import { makeBackoff, retry } from '@aztec/foundation/retry'; import { resolver, reviver } from '@aztec/foundation/serialize'; +import { createStore } from '@aztec/kv-store/utils'; +import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; import { type PXEService, createPXEService, getPXEServiceConfig } from '@aztec/pxe'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { createAndStartTelemetryClient, getConfigEnvVars as getTelemetryConfig } from '@aztec/telemetry-client/start'; import { type Anvil, createAnvil } from '@viem/anvil'; @@ -43,6 +47,7 @@ export type SubsystemsContext = { aztecNodeConfig: AztecNodeConfig; pxe: PXEService; deployL1ContractsValues: DeployL1Contracts; + proverNode: ProverNode; }; type SnapshotEntry = { @@ -216,6 +221,7 @@ async function teardown(context: SubsystemsContext | undefined) { if (!context) { return; } + await context.proverNode.stop(); await context.aztecNode.stop(); await context.pxe.stop(); await context.acvmConfig?.cleanup(); @@ -260,6 +266,7 @@ async function setupFromFresh( const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw); const validatorPrivKey = getPrivateKeyFromIndex(1); + const proverNodePrivateKey = getPrivateKeyFromIndex(2); aztecNodeConfig.publisherPrivateKey = `0x${publisherPrivKey!.toString('hex')}`; aztecNodeConfig.validatorPrivateKey = `0x${validatorPrivKey!.toString('hex')}`; @@ -284,6 +291,38 @@ async function setupFromFresh( logger.verbose('Creating and synching an aztec node...'); const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, telemetry); + // Creating temp store and archiver for simulated prover node + + const store = await createStore( + { dataDirectory: undefined }, + deployL1ContractsValues.l1ContractAddresses.rollupAddress, + ); + + const archiver = await createArchiver( + { ...aztecNodeConfig, dataDirectory: undefined }, + store, + new NoopTelemetryClient(), + { blockUntilSync: true }, + ); + + // Prover node config is for simulated proofs + const proverConfig: ProverNodeConfig = { + ...aztecNodeConfig, + txProviderNodeUrl: undefined, + dataDirectory: undefined, + proverId: new Fr(42), + realProofs: false, + proverAgentConcurrency: 2, + publisherPrivateKey: `0x${proverNodePrivateKey!.toString('hex')}`, + }; + const proverNode = await createProverNode(proverConfig, { + aztecNodeTxProvider: aztecNode, + archiver: archiver as Archiver, + }); + proverNode.start(); + + logger.verbose('Prover node started'); + logger.verbose('Creating pxe...'); const pxeConfig = getPXEServiceConfig(); pxeConfig.dataDirectory = statePath; @@ -310,6 +349,7 @@ async function setupFromFresh( acvmConfig, bbConfig, deployL1ContractsValues, + proverNode, }; } @@ -357,6 +397,34 @@ async function setupFromState(statePath: string, logger: Logger): Promise account.deploy())); - await Promise.all(txs.map(tx => tx.wait({ interval: 0.1 }))); + await Promise.all(txs.map(tx => tx.wait({ interval: 0.1, proven: true }))); return { accountKeys }; }; @@ -427,5 +496,5 @@ export async function publicDeployAccounts(sender: Wallet, accountsToDeploy: (Co (await registerContractClass(sender, SchnorrAccountContractArtifact)).request(), ...instances.map(instance => deployInstance(sender, instance!).request()), ]); - await batch.send().wait(); + await batch.send().wait({ proven: true }); } diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index 6dd924eae74..438571ed225 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -96,6 +96,7 @@ export type EnvVar = | 'BB_WORKING_DIRECTORY' | 'BB_SKIP_CLEANUP' | 'PXE_PROVER_ENABLED' + | 'BOT_FOLLOW_CHAIN' | 'VALIDATOR_PRIVATE_KEY' | 'VALIDATOR_DISABLED' | 'PROVER_NODE_DISABLE_AUTOMATIC_PROVING' diff --git a/yarn-project/ivc-integration/src/client_ivc_integration.test.ts b/yarn-project/ivc-integration/src/client_ivc_integration.test.ts index c929ca37091..bf2218ddeed 100644 --- a/yarn-project/ivc-integration/src/client_ivc_integration.test.ts +++ b/yarn-project/ivc-integration/src/client_ivc_integration.test.ts @@ -29,7 +29,7 @@ import { const logger = createDebugLogger('aztec:clientivc-integration'); -jest.setTimeout(60_000); +jest.setTimeout(120_000); describe('Client IVC Integration', () => { let bbWorkingDirectory: string;