diff --git a/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts b/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts index 58b29323712..2738dbc99e0 100644 --- a/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts +++ b/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts @@ -220,6 +220,9 @@ export interface MerkleTreeOperations { * Rolls back pending changes. */ rollback(): Promise; + + /** Deletes this database. Useful for cleaning up forks. */ + delete(): Promise; } /** Return type for handleL2BlockAndMessages */ diff --git a/yarn-project/kv-store/src/interfaces/store.ts b/yarn-project/kv-store/src/interfaces/store.ts index 076d39da1e0..36874f804c0 100644 --- a/yarn-project/kv-store/src/interfaces/store.ts +++ b/yarn-project/kv-store/src/interfaces/store.ts @@ -55,7 +55,7 @@ export interface AztecKVStore { transaction>>(callback: () => T): Promise; /** - * Clears the store + * Clears all entries in the store */ clear(): Promise; @@ -63,4 +63,9 @@ export interface AztecKVStore { * Forks the store. */ fork(): Promise; + + /** + * Deletes the store + */ + delete(): Promise; } diff --git a/yarn-project/kv-store/src/lmdb/store.test.ts b/yarn-project/kv-store/src/lmdb/store.test.ts index f6babd0cb67..dc6f5f67755 100644 --- a/yarn-project/kv-store/src/lmdb/store.test.ts +++ b/yarn-project/kv-store/src/lmdb/store.test.ts @@ -14,6 +14,9 @@ describe('AztecLmdbStore', () => { expect(forkedSingleton.get()).toEqual('foo'); await forkedSingleton.set('bar'); expect(singleton.get()).toEqual('foo'); + expect(forkedSingleton.get()).toEqual('bar'); + await forkedSingleton.delete(); + expect(singleton.get()).toEqual('foo'); }; it('forks a persistent store', async () => { diff --git a/yarn-project/kv-store/src/lmdb/store.ts b/yarn-project/kv-store/src/lmdb/store.ts index cb6ee87d7d7..9bad4b32bc4 100644 --- a/yarn-project/kv-store/src/lmdb/store.ts +++ b/yarn-project/kv-store/src/lmdb/store.ts @@ -134,9 +134,14 @@ export class AztecLmdbStore implements AztecKVStore { } /** - * Clears the store + * Clears all entries in the store */ async clear() { await this.#rootDb.clearAsync(); } + + /** Deletes this store */ + async delete() { + await this.#rootDb.drop(); + } } 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 111651868aa..dbf9d4bf9fe 100644 --- a/yarn-project/prover-node/src/job/block-proving-job.ts +++ b/yarn-project/prover-node/src/job/block-proving-job.ts @@ -30,6 +30,7 @@ export class BlockProvingJob { private l2BlockSource: L2BlockSource, private l1ToL2MessageSource: L1ToL2MessageSource, private txProvider: TxProvider, + private cleanUp: () => Promise = () => Promise.resolve(), ) {} public getState(): BlockProvingJobState { @@ -105,6 +106,8 @@ export class BlockProvingJob { } catch (err) { this.log.error(`Error running block prover job: ${err}`); this.state = 'failed'; + } finally { + await this.cleanUp(); } } diff --git a/yarn-project/prover-node/src/prover-node.ts b/yarn-project/prover-node/src/prover-node.ts index ca4b3042913..1e1c5c06bbd 100644 --- a/yarn-project/prover-node/src/prover-node.ts +++ b/yarn-project/prover-node/src/prover-node.ts @@ -133,6 +133,7 @@ export class ProverNode { this.l2BlockSource, this.l1ToL2MessageSource, this.txProvider, + () => db.delete(), ); } } diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_db.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_db.ts index d31ba02339c..6471a3e6e03 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_db.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_db.ts @@ -66,4 +66,7 @@ export type MerkleTreeDb = { * Forks the database at its current state. */ fork(): Promise; + + /** Deletes this database. */ + delete(): Promise; }; diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts index ae014d7d122..b96fc441178 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts @@ -204,4 +204,8 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations { ): Promise> { return this.trees.batchInsert(treeId, leaves, subtreeHeight); } + + public delete(): Promise { + return this.trees.delete(); + } } diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts index a25037b3d68..2b56332a87a 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts @@ -159,6 +159,10 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations return Promise.reject(new Error('Tree snapshot operations are read-only')); } + delete(): Promise { + return Promise.reject(new Error('Tree snapshot operations are read-only')); + } + updateHistoricArchive(): Promise { return Promise.reject(new Error('Tree snapshot operations are read-only')); } diff --git a/yarn-project/world-state/src/world-state-db/merkle_trees.ts b/yarn-project/world-state/src/world-state-db/merkle_trees.ts index 8db05dc8119..6f41f377f14 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_trees.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_trees.ts @@ -189,6 +189,10 @@ export class MerkleTrees implements MerkleTreeDb { return MerkleTrees.new(forked, this.log); } + public async delete() { + await this.store.delete(); + } + public getInitialHeader(): Header { return Header.empty({ state: this.#loadInitialStateReference() }); }