From 48a715b6a11a07af7f9adce7a1049cf5e81a933d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 00:54:55 +0200 Subject: [PATCH] fix: Quick TXE after public executor changes (#8661) This PR https://github.com/AztecProtocol/aztec-packages/pull/8585/files made it so the TXE uses a world state db. But a fresh one is created for every call so all the changes uncommited to the tree were lost. --------- Co-authored-by: ludamad --- .github/workflows/ci.yml | 1 + yarn-project/txe/src/oracle/txe_oracle.ts | 4 +- .../txe/src/util/txe_public_state_db.ts | 57 ------------------- .../txe/src/util/txe_world_state_db.ts | 55 ++++++++++++++++++ 4 files changed, 58 insertions(+), 59 deletions(-) delete mode 100644 yarn-project/txe/src/util/txe_public_state_db.ts create mode 100644 yarn-project/txe/src/util/txe_world_state_db.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ecae0bf8c4b..71c81c11206 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,6 +55,7 @@ jobs: barretenberg-cpp: ${{ steps.filter.outputs.barretenberg-cpp }} noir: ${{ steps.filter.outputs.noir }} noir-projects: ${{ steps.filter.outputs.noir-projects }} + txe: ${{ steps.filter.outputs.txe }} l1-contracts: ${{ steps.filter.outputs.l1-contracts }} non-docs: ${{ steps.filter.outputs.non-docs }} non-misc-ci: ${{ steps.filter.outputs.non-misc-ci }} diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index cccf85cef4a..8c2a8de63e0 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -59,7 +59,6 @@ import { type PackedValuesCache, PublicExecutor, type TypedOracle, - WorldStateDB, acvm, createSimulationError, extractCallStack, @@ -73,6 +72,7 @@ import { MerkleTreeSnapshotOperationsFacade, type MerkleTrees } from '@aztec/wor import { type TXEDatabase } from '../util/txe_database.js'; import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js'; +import { TXEWorldStateDB } from '../util/txe_world_state_db.js'; export class TXE implements TypedOracle { private blockNumber = 0; @@ -717,7 +717,7 @@ export class TXE implements TypedOracle { header.globalVariables.blockNumber = new Fr(await this.getBlockNumber()); const executor = new PublicExecutor( - new WorldStateDB(this.trees.asLatest(), new TXEPublicContractDataSource(this)), + new TXEWorldStateDB(this.trees.asLatest(), new TXEPublicContractDataSource(this)), header, new NoopTelemetryClient(), ); diff --git a/yarn-project/txe/src/util/txe_public_state_db.ts b/yarn-project/txe/src/util/txe_public_state_db.ts deleted file mode 100644 index 62bdbaf7e5b..00000000000 --- a/yarn-project/txe/src/util/txe_public_state_db.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { MerkleTreeId } from '@aztec/circuit-types'; -import { - type AztecAddress, - Fr, - PUBLIC_DATA_SUBTREE_HEIGHT, - PublicDataTreeLeaf, - type PublicDataTreeLeafPreimage, -} from '@aztec/circuits.js'; -import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; -import { type PublicStateDB } from '@aztec/simulator'; - -import { type TXE } from '../oracle/txe_oracle.js'; - -export class TXEPublicStateDB implements PublicStateDB { - constructor(private txeOracle: TXE) {} - - async storageRead(contract: AztecAddress, slot: Fr): Promise { - const db = this.txeOracle.getTrees().asLatest(); - const leafSlot = computePublicDataTreeLeafSlot(contract, slot).toBigInt(); - - const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot); - - let value = Fr.ZERO; - if (lowLeafResult && lowLeafResult.alreadyPresent) { - const preimage = (await db.getLeafPreimage( - MerkleTreeId.PUBLIC_DATA_TREE, - lowLeafResult.index, - )) as PublicDataTreeLeafPreimage; - value = preimage.value; - } - return value; - } - - async storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise { - const db = this.txeOracle.getTrees().asLatest(); - - await db.batchInsert( - MerkleTreeId.PUBLIC_DATA_TREE, - [new PublicDataTreeLeaf(computePublicDataTreeLeafSlot(contract, slot), newValue).toBuffer()], - PUBLIC_DATA_SUBTREE_HEIGHT, - ); - return newValue.toBigInt(); - } - - checkpoint(): Promise { - return Promise.resolve(); - } - rollbackToCheckpoint(): Promise { - throw new Error('Cannot rollback'); - } - commit(): Promise { - return Promise.resolve(); - } - rollbackToCommit(): Promise { - throw new Error('Cannot rollback'); - } -} diff --git a/yarn-project/txe/src/util/txe_world_state_db.ts b/yarn-project/txe/src/util/txe_world_state_db.ts new file mode 100644 index 00000000000..338962fefd9 --- /dev/null +++ b/yarn-project/txe/src/util/txe_world_state_db.ts @@ -0,0 +1,55 @@ +import { MerkleTreeId, type MerkleTreeOperations } from '@aztec/circuit-types'; +import { + type AztecAddress, + Fr, + PUBLIC_DATA_SUBTREE_HEIGHT, + PublicDataTreeLeaf, + type PublicDataTreeLeafPreimage, +} from '@aztec/circuits.js'; +import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; +import { WorldStateDB } from '@aztec/simulator'; +import { type ContractDataSource } from '@aztec/types/contracts'; + +export class TXEWorldStateDB extends WorldStateDB { + constructor(private merkleDb: MerkleTreeOperations, dataSource: ContractDataSource) { + super(merkleDb, dataSource); + } + + override async storageRead(contract: AztecAddress, slot: Fr): Promise { + const leafSlot = computePublicDataTreeLeafSlot(contract, slot).toBigInt(); + + const lowLeafResult = await this.merkleDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot); + + let value = Fr.ZERO; + if (lowLeafResult && lowLeafResult.alreadyPresent) { + const preimage = (await this.merkleDb.getLeafPreimage( + MerkleTreeId.PUBLIC_DATA_TREE, + lowLeafResult.index, + )) as PublicDataTreeLeafPreimage; + value = preimage.value; + } + return value; + } + + override async storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise { + await this.merkleDb.batchInsert( + MerkleTreeId.PUBLIC_DATA_TREE, + [new PublicDataTreeLeaf(computePublicDataTreeLeafSlot(contract, slot), newValue).toBuffer()], + PUBLIC_DATA_SUBTREE_HEIGHT, + ); + return newValue.toBigInt(); + } + + override checkpoint(): Promise { + return Promise.resolve(); + } + override rollbackToCheckpoint(): Promise { + throw new Error('Cannot rollback'); + } + override commit(): Promise { + return Promise.resolve(); + } + override rollbackToCommit(): Promise { + throw new Error('Cannot rollback'); + } +}