From 2692c33e029c2e043728fed91a4c977645576a9f Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 2 Jan 2026 18:14:22 +0000 Subject: [PATCH] refactor: data provider --> store --- .../block_synchronizer.test.ts | 18 +- .../block_synchronizer/block_synchronizer.ts | 20 +- .../contract_function_simulator.ts | 90 +++---- .../oracle/oracle_version_is_checked.test.ts | 100 +++---- .../oracle/private_execution.test.ts | 118 ++++----- .../oracle/private_execution.ts | 8 +- .../oracle/private_execution_oracle.ts | 87 +++--- .../oracle/utility_execution.test.ts | 120 ++++----- .../oracle/utility_execution_oracle.ts | 102 +++---- .../proxied_contract_data_source.ts | 14 +- yarn-project/pxe/src/debug/pxe_debug_utils.ts | 12 +- yarn-project/pxe/src/error_enriching.ts | 22 +- .../pxe/src/events/event_service.test.ts | 18 +- yarn-project/pxe/src/events/event_service.ts | 12 +- .../private_event_filter_validator.test.ts | 10 +- .../events/private_event_filter_validator.ts | 10 +- yarn-project/pxe/src/logs/log_service.test.ts | 40 +-- yarn-project/pxe/src/logs/log_service.ts | 30 +-- .../pxe/src/notes/note_service.test.ts | 48 ++-- yarn-project/pxe/src/notes/note_service.ts | 26 +- .../private_kernel_oracle_impl.ts | 12 +- .../public_storage/public_storage_service.ts | 6 +- yarn-project/pxe/src/pxe.test.ts | 10 +- yarn-project/pxe/src/pxe.ts | 170 ++++++------ .../storage/address_data_provider/index.ts | 1 - .../address_store.test.ts} | 32 +-- .../address_store.ts} | 2 +- .../pxe/src/storage/address_store/index.ts | 1 + .../anchor_block_data_provider/index.ts | 1 - .../anchor_block_store.test.ts} | 14 +- .../anchor_block_store.ts} | 2 +- .../src/storage/anchor_block_store/index.ts | 1 + .../storage/capsule_data_provider/index.ts | 1 - .../capsule_store.test.ts} | 184 +++++++------ .../capsule_store.ts} | 2 +- .../pxe/src/storage/capsule_store/index.ts | 1 + .../storage/contract_data_provider/index.ts | 1 - .../contract_store.test.ts} | 20 +- .../contract_store.ts} | 4 +- .../pxe/src/storage/contract_store/index.ts | 1 + .../private_functions_tree.ts | 0 yarn-project/pxe/src/storage/index.ts | 14 +- .../src/storage/note_data_provider/index.ts | 2 - .../pxe/src/storage/note_store/index.ts | 2 + .../note_store.test.ts} | 54 ++-- .../note_store.ts} | 14 +- .../private_event_store.test.ts} | 48 ++-- .../private_event_store.ts} | 8 +- .../storage/tagging_data_provider/index.ts | 3 - .../pxe/src/storage/tagging_store/index.ts | 3 + .../recipient_tagging_store.ts} | 6 +- .../sender_address_book_store.ts} | 2 +- .../sender_tagging_store.test.ts} | 248 +++++++++--------- .../sender_tagging_store.ts} | 4 +- ...ate_logs_for_sender_recipient_pair.test.ts | 34 +-- ..._private_logs_for_sender_recipient_pair.ts | 12 +- .../sync_sender_tagging_indexes.test.ts | 36 +-- .../sync_sender_tagging_indexes.ts | 16 +- ...load_and_store_new_tagging_indexes.test.ts | 64 ++--- .../load_and_store_new_tagging_indexes.ts | 8 +- .../tree_membership_service.ts | 8 +- yarn-project/txe/src/index.ts | 2 +- .../oracle/txe_oracle_top_level_context.ts | 119 ++++----- yarn-project/txe/src/state_machine/index.ts | 10 +- yarn-project/txe/src/txe_session.test.ts | 16 +- yarn-project/txe/src/txe_session.ts | 156 +++++------ ..._data_provider.ts => txe_account_store.ts} | 2 +- ...data_provider.ts => txe_contract_store.ts} | 6 +- .../util/txe_public_contract_data_source.ts | 18 +- 69 files changed, 1122 insertions(+), 1164 deletions(-) delete mode 100644 yarn-project/pxe/src/storage/address_data_provider/index.ts rename yarn-project/pxe/src/storage/{address_data_provider/address_data_provider.test.ts => address_store/address_store.test.ts} (57%) rename yarn-project/pxe/src/storage/{address_data_provider/address_data_provider.ts => address_store/address_store.ts} (98%) create mode 100644 yarn-project/pxe/src/storage/address_store/index.ts delete mode 100644 yarn-project/pxe/src/storage/anchor_block_data_provider/index.ts rename yarn-project/pxe/src/storage/{anchor_block_data_provider/anchor_block_data_provider.test.ts => anchor_block_store/anchor_block_store.test.ts} (55%) rename yarn-project/pxe/src/storage/{anchor_block_data_provider/anchor_block_data_provider.ts => anchor_block_store/anchor_block_store.ts} (95%) create mode 100644 yarn-project/pxe/src/storage/anchor_block_store/index.ts delete mode 100644 yarn-project/pxe/src/storage/capsule_data_provider/index.ts rename yarn-project/pxe/src/storage/{capsule_data_provider/capsule_data_provider.test.ts => capsule_store/capsule_store.test.ts} (51%) rename yarn-project/pxe/src/storage/{capsule_data_provider/capsule_data_provider.ts => capsule_store/capsule_store.ts} (99%) create mode 100644 yarn-project/pxe/src/storage/capsule_store/index.ts delete mode 100644 yarn-project/pxe/src/storage/contract_data_provider/index.ts rename yarn-project/pxe/src/storage/{contract_data_provider/contract_data_provider.test.ts => contract_store/contract_store.test.ts} (64%) rename yarn-project/pxe/src/storage/{contract_data_provider/contract_data_provider.ts => contract_store/contract_store.ts} (99%) create mode 100644 yarn-project/pxe/src/storage/contract_store/index.ts rename yarn-project/pxe/src/storage/{contract_data_provider => contract_store}/private_functions_tree.ts (100%) delete mode 100644 yarn-project/pxe/src/storage/note_data_provider/index.ts create mode 100644 yarn-project/pxe/src/storage/note_store/index.ts rename yarn-project/pxe/src/storage/{note_data_provider/note_data_provider.test.ts => note_store/note_store.test.ts} (94%) rename yarn-project/pxe/src/storage/{note_data_provider/note_data_provider.ts => note_store/note_store.ts} (97%) rename yarn-project/pxe/src/storage/{private_event_data_provider/private_event_data_provider.test.ts => private_event_store/private_event_store.test.ts} (70%) rename yarn-project/pxe/src/storage/{private_event_data_provider/private_event_data_provider.ts => private_event_store/private_event_store.ts} (96%) delete mode 100644 yarn-project/pxe/src/storage/tagging_data_provider/index.ts create mode 100644 yarn-project/pxe/src/storage/tagging_store/index.ts rename yarn-project/pxe/src/storage/{tagging_data_provider/recipient_tagging_data_provider.ts => tagging_store/recipient_tagging_store.ts} (93%) rename yarn-project/pxe/src/storage/{tagging_data_provider/sender_address_book.ts => tagging_store/sender_address_book_store.ts} (96%) rename yarn-project/pxe/src/storage/{tagging_data_provider/sender_tagging_data_provider.test.ts => tagging_store/sender_tagging_store.test.ts} (50%) rename yarn-project/pxe/src/storage/{tagging_data_provider/sender_tagging_data_provider.ts => tagging_store/sender_tagging_store.ts} (98%) rename yarn-project/txe/src/util/{txe_account_data_provider.ts => txe_account_store.ts} (95%) rename yarn-project/txe/src/util/{txe_contract_data_provider.ts => txe_contract_store.ts} (85%) diff --git a/yarn-project/pxe/src/block_synchronizer/block_synchronizer.test.ts b/yarn-project/pxe/src/block_synchronizer/block_synchronizer.test.ts index 83a86b48984b..7ab6438055bd 100644 --- a/yarn-project/pxe/src/block_synchronizer/block_synchronizer.test.ts +++ b/yarn-project/pxe/src/block_synchronizer/block_synchronizer.test.ts @@ -9,15 +9,15 @@ import { randomPublishedL2Block } from '@aztec/stdlib/testing'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { NoteStore } from '../storage/note_store/note_store.js'; import { BlockSynchronizer } from './block_synchronizer.js'; describe('BlockSynchronizer', () => { let synchronizer: BlockSynchronizer; let tipsStore: L2TipsKVStore; - let anchorBlockDataProvider: AnchorBlockDataProvider; - let noteDataProvider: NoteDataProvider; + let anchorBlockStore: AnchorBlockStore; + let noteStore: NoteStore; let aztecNode: MockProxy; let blockStream: MockProxy; @@ -32,22 +32,22 @@ describe('BlockSynchronizer', () => { blockStream = mock(); aztecNode = mock(); tipsStore = new L2TipsKVStore(store, 'pxe'); - anchorBlockDataProvider = new AnchorBlockDataProvider(store); - noteDataProvider = await NoteDataProvider.create(store); - synchronizer = new TestSynchronizer(aztecNode, anchorBlockDataProvider, noteDataProvider, tipsStore); + anchorBlockStore = new AnchorBlockStore(store); + noteStore = await NoteStore.create(store); + synchronizer = new TestSynchronizer(aztecNode, anchorBlockStore, noteStore, tipsStore); }); it('sets header from latest block', async () => { const block = await randomPublishedL2Block(1); await synchronizer.handleBlockStreamEvent({ type: 'blocks-added', blocks: [block] }); - const obtainedHeader = await anchorBlockDataProvider.getBlockHeader(); + const obtainedHeader = await anchorBlockStore.getBlockHeader(); expect(obtainedHeader).toEqual(block.block.getBlockHeader()); }); it('removes notes from db on a reorg', async () => { const rollbackNotesAndNullifiers = jest - .spyOn(noteDataProvider, 'rollbackNotesAndNullifiers') + .spyOn(noteStore, 'rollbackNotesAndNullifiers') .mockImplementation(() => Promise.resolve()); aztecNode.getBlockHeader.mockImplementation(async blockNumber => (await L2Block.random(BlockNumber(blockNumber as number))).getBlockHeader(), diff --git a/yarn-project/pxe/src/block_synchronizer/block_synchronizer.ts b/yarn-project/pxe/src/block_synchronizer/block_synchronizer.ts index c6d1f5892799..a14eaddbd710 100644 --- a/yarn-project/pxe/src/block_synchronizer/block_synchronizer.ts +++ b/yarn-project/pxe/src/block_synchronizer/block_synchronizer.ts @@ -5,8 +5,8 @@ import { L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler import type { AztecNode } from '@aztec/stdlib/interfaces/client'; import type { PXEConfig } from '../config/index.js'; -import type { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; +import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import type { NoteStore } from '../storage/note_store/note_store.js'; /** * The BlockSynchronizer class orchestrates synchronization between PXE and Aztec node, maintaining an up-to-date @@ -20,8 +20,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler { constructor( private node: AztecNode, - private anchorBlockDataProvider: AnchorBlockDataProvider, - private noteDataProvider: NoteDataProvider, + private anchorBlockStore: AnchorBlockStore, + private noteStore: NoteStore, private l2TipsStore: L2TipsKVStore, config: Partial> = {}, loggerOrSuffix?: string | Logger, @@ -54,20 +54,20 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler { archive: lastBlock.archive.root.toString(), header: lastBlock.header.toInspect(), }); - await this.anchorBlockDataProvider.setHeader(lastBlock.getBlockHeader()); + await this.anchorBlockStore.setHeader(lastBlock.getBlockHeader()); break; } case 'chain-pruned': { this.log.warn(`Pruning data after block ${event.block.number} due to reorg`); // We first unnullify and then remove so that unnullified notes that were created after the block number end up deleted. - const lastSynchedBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); - await this.noteDataProvider.rollbackNotesAndNullifiers(event.block.number, lastSynchedBlockNumber); + const lastSynchedBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); + await this.noteStore.rollbackNotesAndNullifiers(event.block.number, lastSynchedBlockNumber); // Update the header to the last block. const newHeader = await this.node.getBlockHeader(event.block.number); if (!newHeader) { this.log.error(`Block header not found for block number ${event.block.number} during chain prune`); } else { - await this.anchorBlockDataProvider.setHeader(newHeader); + await this.anchorBlockStore.setHeader(newHeader); } break; } @@ -104,13 +104,13 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler { let currentHeader; try { - currentHeader = await this.anchorBlockDataProvider.getBlockHeader(); + currentHeader = await this.anchorBlockStore.getBlockHeader(); } catch { this.log.debug('Header is not set, requesting from the node'); } if (!currentHeader) { // REFACTOR: We should know the header of the genesis block without having to request it from the node. - await this.anchorBlockDataProvider.setHeader((await this.node.getBlockHeader(BlockNumber.ZERO))!); + await this.anchorBlockStore.setHeader((await this.node.getBlockHeader(BlockNumber.ZERO))!); } await this.blockStream.sync(); } diff --git a/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts b/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts index e49a2111aac8..c30cfbb69c5c 100644 --- a/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts +++ b/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts @@ -71,15 +71,15 @@ import { getFinalMinRevertibleSideEffectCounter, } from '@aztec/stdlib/tx'; -import type { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../storage/tagging_data_provider/sender_address_book.js'; -import type { SenderTaggingDataProvider } from '../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { AddressStore } from '../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js'; +import type { SenderTaggingStore } from '../storage/tagging_store/sender_tagging_store.js'; import { ExecutionNoteCache } from './execution_note_cache.js'; import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js'; import { HashedValuesCache } from './hashed_values_cache.js'; @@ -96,17 +96,17 @@ export class ContractFunctionSimulator { private log: Logger; constructor( - private contractDataProvider: ContractDataProvider, - private noteDataProvider: NoteDataProvider, + private contractStore: ContractStore, + private noteStore: NoteStore, private keyStore: KeyStore, - private addressDataProvider: AddressDataProvider, + private addressStore: AddressStore, private aztecNode: AztecNode, - private anchorBlockDataProvider: AnchorBlockDataProvider, - private senderTaggingDataProvider: SenderTaggingDataProvider, - private recipientTaggingDataProvider: RecipientTaggingDataProvider, - private senderAddressBook: SenderAddressBook, - private capsuleDataProvider: CapsuleDataProvider, - private privateEventDataProvider: PrivateEventDataProvider, + private anchorBlockStore: AnchorBlockStore, + private senderTaggingStore: SenderTaggingStore, + private recipientTaggingStore: RecipientTaggingStore, + private senderAddressBookStore: SenderAddressBookStore, + private capsuleStore: CapsuleStore, + private privateEventStore: PrivateEventStore, private simulator: CircuitSimulator, ) { this.log = createLogger('simulator'); @@ -136,12 +136,9 @@ export class ContractFunctionSimulator { ): Promise { const simulatorSetupTimer = new Timer(); - await verifyCurrentClassId(contractAddress, this.aztecNode, this.contractDataProvider, anchorBlockHeader); + await verifyCurrentClassId(contractAddress, this.aztecNode, this.contractStore, anchorBlockHeader); - const entryPointArtifact = await this.contractDataProvider.getFunctionArtifactWithDebugMetadata( - contractAddress, - selector, - ); + const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(contractAddress, selector); if (entryPointArtifact.functionType !== FunctionType.PRIVATE) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as private`); @@ -177,17 +174,17 @@ export class ContractFunctionSimulator { HashedValuesCache.create(request.argsOfCalls), noteCache, taggingIndexCache, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.aztecNode, - this.anchorBlockDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.anchorBlockStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, 0, // totalPublicArgsCount startSideEffectCounter, undefined, // log @@ -259,12 +256,9 @@ export class ContractFunctionSimulator { anchorBlockHeader: BlockHeader, scopes?: AztecAddress[], ): Promise { - await verifyCurrentClassId(call.to, this.aztecNode, this.contractDataProvider, anchorBlockHeader); + await verifyCurrentClassId(call.to, this.aztecNode, this.contractStore, anchorBlockHeader); - const entryPointArtifact = await this.contractDataProvider.getFunctionArtifactWithDebugMetadata( - call.to, - call.selector, - ); + const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector); if (entryPointArtifact.functionType !== FunctionType.UTILITY) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`); @@ -275,16 +269,16 @@ export class ContractFunctionSimulator { authwits, [], anchorBlockHeader, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.aztecNode, - this.anchorBlockDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.anchorBlockStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, undefined, scopes, ); @@ -350,13 +344,13 @@ class OrderedSideEffect { * @param privateExecutionResult - The result of the private execution. * @param nonceGenerator - A nonce generator for note hashes. According to the protocol rules, * it can either be the first nullifier in the tx or the hash of the initial tx request if there are none. - * @param contractDataProvider - A provider for contract data in order to get function names and debug info. + * @param contractStore - A provider for contract data in order to get function names and debug info. * @returns The simulated proving result. */ export async function generateSimulatedProvingResult( privateExecutionResult: PrivateExecutionResult, nonceGenerator: Fr, - contractDataProvider: ContractDataProvider, + contractStore: ContractStore, ): Promise> { const siloedNoteHashes: OrderedSideEffect[] = []; const nullifiers: OrderedSideEffect[] = []; @@ -433,7 +427,7 @@ export async function generateSimulatedProvingResult( : execution.publicInputs.publicTeardownCallRequest; executionSteps.push({ - functionName: await contractDataProvider.getDebugFunctionName( + functionName: await contractStore.getDebugFunctionName( execution.publicInputs.callContext.contractAddress, execution.publicInputs.callContext.functionSelector, ), diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/oracle_version_is_checked.test.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/oracle_version_is_checked.test.ts index a0323dfe1e10..e7a8404efb9d 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/oracle_version_is_checked.test.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/oracle_version_is_checked.test.ts @@ -12,32 +12,32 @@ import { BlockHeader, HashedValues, TxContext, TxExecutionRequest } from '@aztec import { jest } from '@jest/globals'; import { mock } from 'jest-mock-extended'; -import type { AddressDataProvider } from '../../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../../storage/tagging_data_provider/sender_address_book.js'; -import type { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { AddressStore } from '../../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js'; +import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { ContractFunctionSimulator } from '../contract_function_simulator.js'; import { UtilityExecutionOracle } from './utility_execution_oracle.js'; describe('Oracle Version Check test suite', () => { const simulator = new WASMSimulator(); - let contractDataProvider: ReturnType>; - let noteDataProvider: ReturnType>; + let contractStore: ReturnType>; + let noteStore: ReturnType>; let keyStore: ReturnType>; - let addressDataProvider: ReturnType>; + let addressStore: ReturnType>; let aztecNode: ReturnType>; - let anchorBlockDataProvider: ReturnType>; - let senderTaggingDataProvider: ReturnType>; - let recipientTaggingDataProvider: ReturnType>; - let senderAddressBook: ReturnType>; - let capsuleDataProvider: ReturnType>; - let privateEventDataProvider: ReturnType>; + let anchorBlockStore: ReturnType>; + let senderTaggingStore: ReturnType>; + let recipientTaggingStore: ReturnType>; + let senderAddressBookStore: ReturnType>; + let capsuleStore: ReturnType>; + let privateEventStore: ReturnType>; let acirSimulator: ContractFunctionSimulator; let contractAddress: AztecAddress; let anchorBlockHeader: BlockHeader; @@ -46,17 +46,17 @@ describe('Oracle Version Check test suite', () => { >; beforeEach(async () => { - contractDataProvider = mock(); - noteDataProvider = mock(); + contractStore = mock(); + noteStore = mock(); keyStore = mock(); - addressDataProvider = mock(); + addressStore = mock(); aztecNode = mock(); - anchorBlockDataProvider = mock(); - senderTaggingDataProvider = mock(); - recipientTaggingDataProvider = mock(); - senderAddressBook = mock(); - capsuleDataProvider = mock(); - privateEventDataProvider = mock(); + anchorBlockStore = mock(); + senderTaggingStore = mock(); + recipientTaggingStore = mock(); + senderAddressBookStore = mock(); + capsuleStore = mock(); + privateEventStore = mock(); utilityAssertCompatibleOracleVersionSpy = jest.spyOn( UtilityExecutionOracle.prototype, 'utilityAssertCompatibleOracleVersion', @@ -65,26 +65,26 @@ describe('Oracle Version Check test suite', () => { aztecNode.getPublicStorageAt.mockResolvedValue(Fr.ZERO); anchorBlockHeader = BlockHeader.random(); - anchorBlockDataProvider.getBlockHeader.mockResolvedValue(anchorBlockHeader); - capsuleDataProvider.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); - capsuleDataProvider.readCapsuleArray.mockResolvedValue([]); - senderTaggingDataProvider.getLastFinalizedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getLastUsedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getTxHashesOfPendingIndexes.mockResolvedValue([]); - senderTaggingDataProvider.storePendingIndexes.mockResolvedValue(); - - noteDataProvider.getNotes.mockResolvedValue([]); + anchorBlockStore.getBlockHeader.mockResolvedValue(anchorBlockHeader); + capsuleStore.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); + capsuleStore.readCapsuleArray.mockResolvedValue([]); + senderTaggingStore.getLastFinalizedIndex.mockResolvedValue(undefined); + senderTaggingStore.getLastUsedIndex.mockResolvedValue(undefined); + senderTaggingStore.getTxHashesOfPendingIndexes.mockResolvedValue([]); + senderTaggingStore.storePendingIndexes.mockResolvedValue(); + + noteStore.getNotes.mockResolvedValue([]); keyStore.getAccounts.mockResolvedValue([]); contractAddress = await AztecAddress.random(); - contractDataProvider.getContractInstance.mockResolvedValue({ + contractStore.getContractInstance.mockResolvedValue({ currentContractClassId: new Fr(42), originalContractClassId: new Fr(42), address: contractAddress, } as ContractInstanceWithAddress); - contractDataProvider.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { - const artifact = await contractDataProvider.getFunctionArtifact(address, selector); + contractStore.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { + const artifact = await contractStore.getFunctionArtifact(address, selector); if (!artifact) { throw new Error(`Function not found: ${selector.toString()} in contract ${address}`); } @@ -92,17 +92,17 @@ describe('Oracle Version Check test suite', () => { }); acirSimulator = new ContractFunctionSimulator( - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, + addressStore, aztecNode, - anchorBlockDataProvider, - senderTaggingDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + anchorBlockStore, + senderTaggingStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, simulator, ); }); @@ -114,7 +114,7 @@ describe('Oracle Version Check test suite', () => { ...OracleVersionCheckContractArtifact.functions.find(f => f.name === 'private_function')!, contractName: OracleVersionCheckContractArtifact.name, }; - contractDataProvider.getFunctionArtifact.mockResolvedValue(privateFunctionArtifact); + contractStore.getFunctionArtifact.mockResolvedValue(privateFunctionArtifact); // Form the execution request for the private function const selector = await FunctionSelector.fromNameAndParameters( @@ -154,7 +154,7 @@ describe('Oracle Version Check test suite', () => { ...OracleVersionCheckContractArtifact.functions.find(f => f.name === 'utility_function')!, contractName: OracleVersionCheckContractArtifact.name, }; - contractDataProvider.getFunctionArtifact.mockResolvedValue(utilityFunctionArtifact); + contractStore.getFunctionArtifact.mockResolvedValue(utilityFunctionArtifact); // Form the execution request for the utility function const execRequest: FunctionCall = { diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.test.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.test.ts index 983dc3ae05a9..7e188966164d 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.test.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.test.ts @@ -64,15 +64,15 @@ import { jest } from '@jest/globals'; import { Matcher, type MatcherCreator, type MockProxy, mock } from 'jest-mock-extended'; import { toFunctionSelector } from 'viem'; -import type { AddressDataProvider } from '../../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../../storage/tagging_data_provider/sender_address_book.js'; -import type { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { AddressStore } from '../../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js'; +import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { ContractFunctionSimulator } from '../contract_function_simulator.js'; jest.setTimeout(60_000); @@ -111,17 +111,17 @@ export const buildL1ToL2Message = async ( describe('Private Execution test suite', () => { const simulator = new WASMSimulator(); - let contractDataProvider: MockProxy; - let noteDataProvider: MockProxy; - let addressDataProvider: MockProxy; + let contractStore: MockProxy; + let noteStore: MockProxy; + let addressStore: MockProxy; let keyStore: MockProxy; - let senderTaggingDataProvider: MockProxy; - let recipientTaggingDataProvider: MockProxy; - let senderAddressBook: MockProxy; + let senderTaggingStore: MockProxy; + let recipientTaggingStore: MockProxy; + let senderAddressBookStore: MockProxy; let aztecNode: MockProxy; - let anchorBlockDataProvider: MockProxy; - let capsuleDataProvider: MockProxy; - let privateEventDataProvider: MockProxy; + let anchorBlockStore: MockProxy; + let capsuleStore: MockProxy; + let privateEventStore: MockProxy; let acirSimulator: ContractFunctionSimulator; let anchorBlockHeader = BlockHeader.empty(); let logger: Logger; @@ -169,7 +169,7 @@ describe('Private Execution test suite', () => { contracts[address.toString()] = artifact; const contractClass = await getContractClassFromArtifact(artifact); - contractDataProvider.getContractInstance.calledWith(aztecAddressMatcher(address)).mockResolvedValue({ + contractStore.getContractInstance.calledWith(aztecAddressMatcher(address)).mockResolvedValue({ currentContractClassId: contractClass.id, originalContractClassId: contractClass.id, address, @@ -300,30 +300,30 @@ describe('Private Execution test suite', () => { beforeEach(async () => { trees = {}; - contractDataProvider = mock(); - noteDataProvider = mock(); - noteDataProvider.getNotes.mockResolvedValue([]); - addressDataProvider = mock(); - senderTaggingDataProvider = mock(); - recipientTaggingDataProvider = mock(); + contractStore = mock(); + noteStore = mock(); + noteStore.getNotes.mockResolvedValue([]); + addressStore = mock(); + senderTaggingStore = mock(); + recipientTaggingStore = mock(); aztecNode = mock(); keyStore = mock(); - anchorBlockDataProvider = mock(); - capsuleDataProvider = mock(); - privateEventDataProvider = mock(); - senderAddressBook = mock(); + anchorBlockStore = mock(); + capsuleStore = mock(); + privateEventStore = mock(); + senderAddressBookStore = mock(); contracts = {}; anchorBlockHeader = makeBlockHeader(); - anchorBlockDataProvider.getBlockHeader.mockImplementation(() => Promise.resolve(anchorBlockHeader)); - capsuleDataProvider.readCapsuleArray.mockResolvedValue([]); + anchorBlockStore.getBlockHeader.mockImplementation(() => Promise.resolve(anchorBlockHeader)); + capsuleStore.readCapsuleArray.mockResolvedValue([]); // Mock sender tagging data provider methods - senderTaggingDataProvider.getLastFinalizedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getLastUsedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getTxHashesOfPendingIndexes.mockResolvedValue([]); - senderTaggingDataProvider.storePendingIndexes.mockResolvedValue(); + senderTaggingStore.getLastFinalizedIndex.mockResolvedValue(undefined); + senderTaggingStore.getLastUsedIndex.mockResolvedValue(undefined); + senderTaggingStore.getTxHashesOfPendingIndexes.mockResolvedValue([]); + senderTaggingStore.storePendingIndexes.mockResolvedValue(); - senderAddressBook.getSenders.mockResolvedValue([]); + senderAddressBookStore.getSenders.mockResolvedValue([]); // Mock aztec node methods - the return array needs to have the same length as the number of tags // on the input. @@ -392,7 +392,7 @@ describe('Private Execution test suite', () => { // able to get ivpk_m during execution await insertLeaves([], 'publicData'); - addressDataProvider.getCompleteAddress.mockImplementation((address: AztecAddress) => { + addressStore.getCompleteAddress.mockImplementation((address: AztecAddress) => { if (address.equals(owner)) { return Promise.resolve(ownerCompleteAddress); } @@ -409,7 +409,7 @@ describe('Private Execution test suite', () => { ); }); - contractDataProvider.getFunctionArtifact.mockImplementation(async (address, selector) => { + contractStore.getFunctionArtifact.mockImplementation(async (address, selector) => { const contract = contracts[address.toString()]; if (!contract) { throw new Error(`Contract not found: ${address}`); @@ -420,15 +420,15 @@ describe('Private Execution test suite', () => { } return Promise.resolve(artifact); }); - contractDataProvider.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { - const artifact = await contractDataProvider.getFunctionArtifact(address, selector); + contractStore.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { + const artifact = await contractStore.getFunctionArtifact(address, selector); if (!artifact) { throw new Error(`Function not found: ${selector.toString()} in contract ${address}`); } return { ...artifact, debug: undefined }; }); - capsuleDataProvider.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); + capsuleStore.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); aztecNode.getPublicStorageAt.mockImplementation( (_blockNumber: BlockParameter, _address: AztecAddress, _storageSlot: Fr) => { @@ -437,17 +437,17 @@ describe('Private Execution test suite', () => { ); acirSimulator = new ContractFunctionSimulator( - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, + addressStore, aztecNode, - anchorBlockDataProvider, - senderTaggingDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + anchorBlockStore, + senderTaggingStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, simulator, ); }); @@ -517,7 +517,7 @@ describe('Private Execution test suite', () => { constructorArgs: initArgs, salt: Fr.random(), }); - contractDataProvider.getContractInstance.mockResolvedValue(instance); + contractStore.getContractInstance.mockResolvedValue(instance); const executionResult = await runSimulator({ args: initArgs, artifact: StatefulTestContractArtifact, @@ -572,7 +572,7 @@ describe('Private Execution test suite', () => { buildNote(80n, ownerCompleteAddress.address, storageSlot), ]); - noteDataProvider.getNotes.mockResolvedValue(notes); + noteStore.getNotes.mockResolvedValue(notes); const consumedNotes = await asyncMap(notes, async ({ note, noteNonce, randomness }) => { const noteHash = await computeNoteHash(note, owner, storageSlot, randomness); @@ -619,7 +619,7 @@ describe('Private Execution test suite', () => { const storageSlot = StatefulTestContractArtifact.storageLayout['notes'].slot; const notes = await Promise.all([buildNote(balance, ownerCompleteAddress.address, storageSlot)]); - noteDataProvider.getNotes.mockResolvedValue(notes); + noteStore.getNotes.mockResolvedValue(notes); const consumedNotes = await asyncMap(notes, async ({ note, noteNonce, randomness }) => { const noteHash = await computeNoteHash(note, owner, storageSlot, randomness); @@ -688,7 +688,7 @@ describe('Private Execution test suite', () => { expect(result.returnValues).toEqual([new Fr(privateIncrement)]); // First fetch of the function artifact is the parent contract - expect(contractDataProvider.getFunctionArtifact.mock.calls[1]).toEqual([childAddress, childSelector]); + expect(contractStore.getFunctionArtifact.mock.calls[1]).toEqual([childAddress, childSelector]); expect(result.nestedExecutionResults).toHaveLength(1); expect(result.nestedExecutionResults[0].returnValues).toEqual([new Fr(privateIncrement)]); expect(result.publicInputs.privateCallRequests.array[0].callContext).toEqual( @@ -1052,7 +1052,7 @@ describe('Private Execution test suite', () => { }); it('should be able to insert, read, and nullify pending note hashes in one call', async () => { - noteDataProvider.getNotes.mockResolvedValue([]); + noteStore.getNotes.mockResolvedValue([]); const amountToTransfer = 100n; @@ -1101,7 +1101,7 @@ describe('Private Execution test suite', () => { }); it('should be able to insert, read, and nullify pending note hashes in nested calls', async () => { - noteDataProvider.getNotes.mockResolvedValue([]); + noteStore.getNotes.mockResolvedValue([]); const amountToTransfer = 100n; @@ -1168,7 +1168,7 @@ describe('Private Execution test suite', () => { }); it('cant read a commitment that is inserted later in same call', async () => { - noteDataProvider.getNotes.mockResolvedValue([]); + noteStore.getNotes.mockResolvedValue([]); const amountToTransfer = 100n; @@ -1193,7 +1193,7 @@ describe('Private Execution test suite', () => { const args = [completeAddress.address]; const pubKey = completeAddress.publicKeys.masterIncomingViewingPublicKey; - addressDataProvider.getCompleteAddress.mockResolvedValue(completeAddress); + addressStore.getCompleteAddress.mockResolvedValue(completeAddress); const { entrypoint: result } = await runSimulator({ artifact: TestContractArtifact, functionName: 'get_master_incoming_viewing_public_key', @@ -1208,7 +1208,7 @@ describe('Private Execution test suite', () => { it('fails if returning no notes', async () => { // call_get_notes(owner: AztecAddress, storage_slot: Field, active_or_nullified: bool) const args = [owner, 2n, true]; - noteDataProvider.getNotes.mockResolvedValue([]); + noteStore.getNotes.mockResolvedValue([]); await expect(() => runSimulator({ artifact: TestContractArtifact, functionName: 'call_get_notes', args, anchorBlockHeader }), diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.ts index e821e6bd437e..cbc88b6e8be7 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution.ts @@ -27,7 +27,7 @@ import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats'; import { BlockHeader, PrivateCallExecutionResult } from '@aztec/stdlib/tx'; import type { UInt64 } from '@aztec/stdlib/types'; -import { ContractDataProvider } from '../../storage/contract_data_provider/index.js'; +import { ContractStore } from '../../storage/contract_store/index.js'; import { Oracle } from './oracle.js'; import type { PrivateExecutionOracle } from './private_execution_oracle.js'; @@ -154,7 +154,7 @@ export function extractPrivateCircuitPublicInputs( * from the instance is used. * @param contractAddress - The address of the contract to read the class id for. * @param instance - The instance of the contract. - * @param executionDataProvider - The execution data provider. + * @param executionStore - The execution data provider. * @param blockNumber - The block number at which to load the DelayedPublicMutable storing the class id. * @param timestamp - The timestamp at which to obtain the class id from the DelayedPublicMutable. * @returns The current class id. @@ -186,10 +186,10 @@ export async function readCurrentClassId( export async function verifyCurrentClassId( contractAddress: AztecAddress, aztecNode: AztecNode, - contractDataProvider: ContractDataProvider, + contractStore: ContractStore, header: BlockHeader, ) { - const instance = await contractDataProvider.getContractInstance(contractAddress); + const instance = await contractStore.getContractInstance(contractAddress); if (!instance) { throw new Error(`No contract instance found for address ${contractAddress.toString()}`); } diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts index 19c26e49ccad..2fbf7d62f9a1 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts @@ -30,15 +30,15 @@ import { } from '@aztec/stdlib/tx'; import { NoteService } from '../../notes/note_service.js'; -import type { AddressDataProvider } from '../../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../../storage/tagging_data_provider/sender_address_book.js'; -import type { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { AddressStore } from '../../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js'; +import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { syncSenderTaggingIndexes } from '../../tagging/index.js'; import type { ExecutionNoteCache } from '../execution_note_cache.js'; import { ExecutionTaggingIndexCache } from '../execution_tagging_index_cache.js'; @@ -90,17 +90,17 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP private readonly executionCache: HashedValuesCache, private readonly noteCache: ExecutionNoteCache, private readonly taggingIndexCache: ExecutionTaggingIndexCache, - contractDataProvider: ContractDataProvider, - noteDataProvider: NoteDataProvider, + contractStore: ContractStore, + noteStore: NoteStore, keyStore: KeyStore, - addressDataProvider: AddressDataProvider, + addressStore: AddressStore, aztecNode: AztecNode, - anchorBlockDataProvider: AnchorBlockDataProvider, - private readonly senderTaggingDataProvider: SenderTaggingDataProvider, - recipientTaggingDataProvider: RecipientTaggingDataProvider, - senderAddressBook: SenderAddressBook, - capsuleDataProvider: CapsuleDataProvider, - privateEventDataProvider: PrivateEventDataProvider, + anchorBlockStore: AnchorBlockStore, + private readonly senderTaggingStore: SenderTaggingStore, + recipientTaggingStore: RecipientTaggingStore, + senderAddressBookStore: SenderAddressBookStore, + capsuleStore: CapsuleStore, + privateEventStore: PrivateEventStore, private totalPublicCalldataCount: number = 0, protected sideEffectCounter: number = 0, log = createLogger('simulator:client_execution_context'), @@ -113,16 +113,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP authWitnesses, capsules, anchorBlockHeader, - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, + addressStore, aztecNode, - anchorBlockDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + anchorBlockStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, log, scopes, ); @@ -278,9 +278,9 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP // This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices // are up to date. We do this here because this store is not synced as part of the global sync because // that'd be wasteful as most tagging secrets are not used in each tx. - await syncSenderTaggingIndexes(secret, this.contractAddress, this.aztecNode, this.senderTaggingDataProvider); + await syncSenderTaggingIndexes(secret, this.contractAddress, this.aztecNode, this.senderTaggingStore); - const lastUsedIndex = await this.senderTaggingDataProvider.getLastUsedIndex(secret); + const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret); // If lastUsedIndex is undefined, we've never used this secret, so start from 0 // Otherwise, the next index to use is one past the last used index return lastUsedIndex === undefined ? 0 : lastUsedIndex + 1; @@ -369,7 +369,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress); - const noteService = new NoteService(this.noteDataProvider, this.aztecNode, this.anchorBlockDataProvider); + const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore); const dbNotes = await noteService.getNotes( this.callContext.contractAddress, owner, @@ -548,14 +548,9 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP isStaticCall = isStaticCall || this.callContext.isStaticCall; - await verifyCurrentClassId( - targetContractAddress, - this.aztecNode, - this.contractDataProvider, - this.anchorBlockHeader, - ); + await verifyCurrentClassId(targetContractAddress, this.aztecNode, this.contractStore, this.anchorBlockHeader); - const targetArtifact = await this.contractDataProvider.getFunctionArtifactWithDebugMetadata( + const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata( targetContractAddress, functionSelector, ); @@ -574,17 +569,17 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP this.executionCache, this.noteCache, this.taggingIndexCache, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.aztecNode, - this.anchorBlockDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.anchorBlockStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, this.totalPublicCalldataCount, sideEffectCounter, this.log, @@ -697,7 +692,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP } public getDebugFunctionName() { - return this.contractDataProvider.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector); + return this.contractStore.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector); } public utilityEmitOffchainEffect(data: Fr[]): Promise { diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution.test.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution.test.ts index 5194c6606330..3a3714156158 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution.test.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution.test.ts @@ -16,32 +16,32 @@ import { BlockHeader, GlobalVariables, TxHash } from '@aztec/stdlib/tx'; import { mock } from 'jest-mock-extended'; import type { _MockProxy } from 'jest-mock-extended/lib/Mock.js'; -import type { AddressDataProvider } from '../../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../../storage/tagging_data_provider/sender_address_book.js'; -import type { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { AddressStore } from '../../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js'; +import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { ContractFunctionSimulator } from '../contract_function_simulator.js'; import { UtilityExecutionOracle } from './utility_execution_oracle.js'; describe('Utility Execution test suite', () => { const simulator = new WASMSimulator(); - let contractDataProvider: ReturnType>; - let noteDataProvider: ReturnType>; + let contractStore: ReturnType>; + let noteStore: ReturnType>; let keyStore: ReturnType>; - let addressDataProvider: ReturnType>; + let addressStore: ReturnType>; let aztecNode: ReturnType>; - let anchorBlockDataProvider: ReturnType>; - let senderTaggingDataProvider: ReturnType>; - let recipientTaggingDataProvider: ReturnType>; - let senderAddressBook: ReturnType>; - let capsuleDataProvider: ReturnType>; - let privateEventDataProvider: ReturnType>; + let anchorBlockStore: ReturnType>; + let senderTaggingStore: ReturnType>; + let recipientTaggingStore: ReturnType>; + let senderAddressBookStore: ReturnType>; + let capsuleStore: ReturnType>; + let privateEventStore: ReturnType>; let acirSimulator: ContractFunctionSimulator; let owner: AztecAddress; let ownerCompleteAddress: CompleteAddress; @@ -53,25 +53,25 @@ describe('Utility Execution test suite', () => { }; beforeEach(async () => { - contractDataProvider = mock(); - noteDataProvider = mock(); + contractStore = mock(); + noteStore = mock(); keyStore = mock(); - addressDataProvider = mock(); + addressStore = mock(); aztecNode = mock(); - anchorBlockDataProvider = mock(); - senderTaggingDataProvider = mock(); - recipientTaggingDataProvider = mock(); - senderAddressBook = mock(); - capsuleDataProvider = mock(); - privateEventDataProvider = mock(); + anchorBlockStore = mock(); + senderTaggingStore = mock(); + recipientTaggingStore = mock(); + senderAddressBookStore = mock(); + capsuleStore = mock(); + privateEventStore = mock(); const capsuleArrays = new Map(); anchorBlockHeader = BlockHeader.random(); - anchorBlockDataProvider.getBlockHeader.mockImplementation(() => Promise.resolve(anchorBlockHeader)); - senderTaggingDataProvider.getLastFinalizedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getLastUsedIndex.mockResolvedValue(undefined); - senderTaggingDataProvider.getTxHashesOfPendingIndexes.mockResolvedValue([]); - senderTaggingDataProvider.storePendingIndexes.mockResolvedValue(); - senderAddressBook.getSenders.mockResolvedValue([]); + anchorBlockStore.getBlockHeader.mockImplementation(() => Promise.resolve(anchorBlockHeader)); + senderTaggingStore.getLastFinalizedIndex.mockResolvedValue(undefined); + senderTaggingStore.getLastUsedIndex.mockResolvedValue(undefined); + senderTaggingStore.getTxHashesOfPendingIndexes.mockResolvedValue([]); + senderTaggingStore.storePendingIndexes.mockResolvedValue(); + senderAddressBookStore.getSenders.mockResolvedValue([]); // Mock getL2Tips and getBlockHeader for loadPrivateLogsForSenderRecipientPair aztecNode.getL2Tips.mockResolvedValue({ @@ -85,25 +85,25 @@ describe('Utility Execution test suite', () => { }); aztecNode.getPrivateLogsByTags.mockImplementation((tags: any[]) => Promise.resolve(tags.map(() => []))); - capsuleDataProvider.setCapsuleArray.mockImplementation((address, slot, content) => { + capsuleStore.setCapsuleArray.mockImplementation((address, slot, content) => { capsuleArrays.set(`${address.toString()}:${slot.toString()}`, content); return Promise.resolve(); }); - capsuleDataProvider.readCapsuleArray.mockImplementation((address, slot) => { + capsuleStore.readCapsuleArray.mockImplementation((address, slot) => { return Promise.resolve(capsuleArrays.get(`${address.toString()}:${slot.toString()}`) ?? []); }); acirSimulator = new ContractFunctionSimulator( - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, + addressStore, aztecNode, - anchorBlockDataProvider, - senderTaggingDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + anchorBlockStore, + senderTaggingStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, simulator, ); @@ -126,7 +126,7 @@ describe('Utility Execution test suite', () => { return Promise.resolve(GrumpkinScalar.random()); }); - addressDataProvider.getCompleteAddress.mockImplementation((account: AztecAddress) => { + addressStore.getCompleteAddress.mockImplementation((account: AztecAddress) => { if (account.equals(owner)) { return Promise.resolve(ownerCompleteAddress); } @@ -144,20 +144,20 @@ describe('Utility Execution test suite', () => { const notes: Note[] = [...Array(5).fill(buildNote(1n)), ...Array(2).fill(buildNote(2n))]; aztecNode.getPublicStorageAt.mockResolvedValue(Fr.ZERO); - contractDataProvider.getFunctionArtifact.mockResolvedValue(artifact); - contractDataProvider.getContractInstance.mockResolvedValue({ + contractStore.getFunctionArtifact.mockResolvedValue(artifact); + contractStore.getContractInstance.mockResolvedValue({ currentContractClassId: new Fr(42), originalContractClassId: new Fr(42), address: contractAddress, } as ContractInstanceWithAddress); - contractDataProvider.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { - const artifact = await contractDataProvider.getFunctionArtifact(address, selector); + contractStore.getFunctionArtifactWithDebugMetadata.mockImplementation(async (address, selector) => { + const artifact = await contractStore.getFunctionArtifact(address, selector); if (!artifact) { throw new Error(`Function not found: ${selector.toString()} in contract ${address}`); } return { ...artifact, debug: undefined }; }); - noteDataProvider.getNotes.mockResolvedValue( + noteStore.getNotes.mockResolvedValue( notes.map( (note, index) => new NoteDao( @@ -177,7 +177,7 @@ describe('Utility Execution test suite', () => { ), ); - capsuleDataProvider.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); + capsuleStore.loadCapsule.mockImplementation((_, __) => Promise.resolve(null)); const execRequest: FunctionCall = { name: artifact.name, @@ -205,23 +205,23 @@ describe('Utility Execution test suite', () => { anchorBlockHeader = BlockHeader.empty({ globalVariables: GlobalVariables.empty({ blockNumber: BlockNumber(syncedBlockNumber) }), }); - anchorBlockDataProvider.getBlockHeader.mockResolvedValue(anchorBlockHeader); + anchorBlockStore.getBlockHeader.mockResolvedValue(anchorBlockHeader); utilityExecutionOracle = new UtilityExecutionOracle( contractAddress, [], [], anchorBlockHeader, - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, + addressStore, aztecNode, - anchorBlockDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + anchorBlockStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, ); }); diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts index c5ae451de5d6..35da37b003bd 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts @@ -21,14 +21,14 @@ import { LogService } from '../../logs/log_service.js'; import { NoteService } from '../../notes/note_service.js'; import { ORACLE_VERSION } from '../../oracle_version.js'; import { PublicStorageService } from '../../public_storage/public_storage_service.js'; -import type { AddressDataProvider } from '../../storage/address_data_provider/address_data_provider.js'; -import type { AnchorBlockDataProvider } from '../../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { CapsuleDataProvider } from '../../storage/capsule_data_provider/capsule_data_provider.js'; -import type { ContractDataProvider } from '../../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../../storage/note_data_provider/note_data_provider.js'; -import type { PrivateEventDataProvider } from '../../storage/private_event_data_provider/private_event_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../../storage/tagging_data_provider/sender_address_book.js'; +import type { AddressStore } from '../../storage/address_store/address_store.js'; +import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js'; +import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js'; +import type { ContractStore } from '../../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../../storage/note_store/note_store.js'; +import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js'; import { TreeMembershipService } from '../../tree_membership/tree_membership_service.js'; import { EventValidationRequest } from '../noir-structs/event_validation_request.js'; import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js'; @@ -54,16 +54,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra protected readonly authWitnesses: AuthWitness[], protected readonly capsules: Capsule[], // TODO(#12425): Rename to transientCapsules protected readonly anchorBlockHeader: BlockHeader, - protected readonly contractDataProvider: ContractDataProvider, - protected readonly noteDataProvider: NoteDataProvider, + protected readonly contractStore: ContractStore, + protected readonly noteStore: NoteStore, protected readonly keyStore: KeyStore, - protected readonly addressDataProvider: AddressDataProvider, + protected readonly addressStore: AddressStore, protected readonly aztecNode: AztecNode, - protected readonly anchorBlockDataProvider: AnchorBlockDataProvider, - protected readonly recipientTaggingDataProvider: RecipientTaggingDataProvider, - protected readonly senderAddressBook: SenderAddressBook, - protected readonly capsuleDataProvider: CapsuleDataProvider, - protected readonly privateEventDataProvider: PrivateEventDataProvider, + protected readonly anchorBlockStore: AnchorBlockStore, + protected readonly recipientTaggingStore: RecipientTaggingStore, + protected readonly senderAddressBookStore: SenderAddressBookStore, + protected readonly capsuleStore: CapsuleStore, + protected readonly privateEventStore: PrivateEventStore, protected log = createLogger('simulator:client_view_context'), protected readonly scopes?: AztecAddress[], ) {} @@ -106,7 +106,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra * @returns The index and sibling path concatenated [index, sibling_path] */ public utilityGetMembershipWitness(blockNumber: BlockNumber, treeId: MerkleTreeId, leafValue: Fr): Promise { - const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockDataProvider); + const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore); return treeMembershipService.getMembershipWitness(blockNumber, treeId, leafValue); } @@ -136,7 +136,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra blockNumber: BlockNumber, nullifier: Fr, ): Promise { - const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockDataProvider); + const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore); return await treeMembershipService.getLowNullifierMembershipWitness(blockNumber, nullifier); } @@ -150,7 +150,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra blockNumber: BlockNumber, leafSlot: Fr, ): Promise { - const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockDataProvider); + const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore); return await treeMembershipService.getPublicDataWitness(blockNumber, leafSlot); } @@ -160,7 +160,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra * @returns Block extracted from a block with block number `blockNumber`. */ public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise { - const anchorBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); if (blockNumber > anchorBlockNumber) { throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`); } @@ -180,7 +180,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra } protected async getCompleteAddress(account: AztecAddress): Promise { - const completeAddress = await this.addressDataProvider.getCompleteAddress(account); + const completeAddress = await this.addressStore.getCompleteAddress(account); if (!completeAddress) { throw new Error( `No public key registered for address ${account}. @@ -200,7 +200,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra } protected async getContractInstance(address: AztecAddress): Promise { - const instance = await this.contractDataProvider.getContractInstance(address); + const instance = await this.contractStore.getContractInstance(address); if (!instance) { throw new Error(`No contract instance found for address ${address.toString()}`); } @@ -256,7 +256,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra offset: number, status: NoteStatus, ): Promise { - const noteService = new NoteService(this.noteDataProvider, this.aztecNode, this.anchorBlockDataProvider); + const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore); const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes); return pickNotes(dbNotes, { @@ -281,13 +281,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra */ public async utilityCheckNullifierExists(innerNullifier: Fr) { const nullifier = await siloNullifier(this.contractAddress, innerNullifier!); - const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockDataProvider); + const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore); const index = await treeMembershipService.getNullifierIndex(nullifier); return index !== undefined; } /** - * Fetches a message from the executionDataProvider, given its key. + * Fetches a message from the executionStore, given its key. * @param contractAddress - Address of a contract by which the message was emitted. * @param messageHash - Hash of the message. * @param secret - Secret used to compute a nullifier. @@ -295,7 +295,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra * @returns The l1 to l2 membership witness (index of message in the tree and sibling path). */ public async utilityGetL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) { - const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockDataProvider); + const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore); const [messageIndex, siblingPath] = await treeMembershipService.getL1ToL2MembershipWitness( contractAddress, messageHash, @@ -320,7 +320,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra numberOfElements: number, ) { const values = []; - const publicStorageService = new PublicStorageService(this.anchorBlockDataProvider, this.aztecNode); + const publicStorageService = new PublicStorageService(this.anchorBlockStore, this.aztecNode); // TODO: why do we serialize these requests? This should probably a single call // Privacy considerations? @@ -347,17 +347,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) { const logService = new LogService( this.aztecNode, - this.anchorBlockDataProvider, + this.anchorBlockStore, this.keyStore, - this.capsuleDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.addressDataProvider, + this.capsuleStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.addressStore, ); await logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes); - const noteService = new NoteService(this.noteDataProvider, this.aztecNode, this.anchorBlockDataProvider); + const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore); await noteService.syncNoteNullifiers(this.contractAddress); } @@ -384,14 +384,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra // We read all note and event validation requests and process them all concurrently. This makes the process much // faster as we don't need to wait for the network round-trip. const noteValidationRequests = ( - await this.capsuleDataProvider.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot) + await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot) ).map(NoteValidationRequest.fromFields); const eventValidationRequests = ( - await this.capsuleDataProvider.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot) + await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot) ).map(EventValidationRequest.fromFields); - const noteService = new NoteService(this.noteDataProvider, this.aztecNode, this.anchorBlockDataProvider); + const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore); const noteDeliveries = noteValidationRequests.map(request => noteService.deliverNote( request.contractAddress, @@ -407,7 +407,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra ), ); - const eventService = new EventService(this.anchorBlockDataProvider, this.aztecNode, this.privateEventDataProvider); + const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore); const eventDeliveries = eventValidationRequests.map(request => eventService.deliverEvent( request.contractAddress, @@ -422,8 +422,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra await Promise.all([...noteDeliveries, ...eventDeliveries]); // Requests are cleared once we're done. - await this.capsuleDataProvider.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, []); - await this.capsuleDataProvider.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, []); + await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, []); + await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, []); } public async utilityBulkRetrieveLogs( @@ -439,26 +439,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra // We read all log retrieval requests and process them all concurrently. This makes the process much faster as we // don't need to wait for the network round-trip. const logRetrievalRequests = ( - await this.capsuleDataProvider.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot) + await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot) ).map(LogRetrievalRequest.fromFields); const logService = new LogService( this.aztecNode, - this.anchorBlockDataProvider, + this.anchorBlockStore, this.keyStore, - this.capsuleDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.addressDataProvider, + this.capsuleStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.addressStore, ); const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests); // Requests are cleared once we're done. - await this.capsuleDataProvider.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, []); + await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, []); // The responses are stored as Option in a second CapsuleArray. - await this.capsuleDataProvider.setCapsuleArray( + await this.capsuleStore.setCapsuleArray( contractAddress, logRetrievalResponsesArrayBaseSlot, maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption), @@ -470,7 +470,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`); } - return this.capsuleDataProvider.storeCapsule(this.contractAddress, slot, capsule); + return this.capsuleStore.storeCapsule(this.contractAddress, slot, capsule); } public async utilityLoadCapsule(contractAddress: AztecAddress, slot: Fr): Promise { @@ -481,7 +481,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra return ( // TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this. this.capsules.find(c => c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot))?.data ?? - (await this.capsuleDataProvider.loadCapsule(this.contractAddress, slot)) + (await this.capsuleStore.loadCapsule(this.contractAddress, slot)) ); } @@ -490,7 +490,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`); } - return this.capsuleDataProvider.deleteCapsule(this.contractAddress, slot); + return this.capsuleStore.deleteCapsule(this.contractAddress, slot); } public utilityCopyCapsule( @@ -503,7 +503,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`); } - return this.capsuleDataProvider.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries); + return this.capsuleStore.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries); } // TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption. diff --git a/yarn-project/pxe/src/contract_function_simulator/proxied_contract_data_source.ts b/yarn-project/pxe/src/contract_function_simulator/proxied_contract_data_source.ts index 0ff6639ff7bb..d825ef65c730 100644 --- a/yarn-project/pxe/src/contract_function_simulator/proxied_contract_data_source.ts +++ b/yarn-project/pxe/src/contract_function_simulator/proxied_contract_data_source.ts @@ -2,21 +2,21 @@ import { FunctionSelector } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { ContractOverrides } from '@aztec/stdlib/tx'; -import type { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js'; +import type { ContractStore } from '../storage/contract_store/contract_store.js'; /* - * Proxy generator for a ContractDataProvider that allows overriding contract instances and artifacts, so + * Proxy generator for a ContractStore that allows overriding contract instances and artifacts, so * the contract function simulator can execute different bytecode on certain addresses. An example use case * would be overriding your own account contract so that valid signatures don't have to be provided while simulating. */ -export class ProxiedContractDataProviderFactory { - static create(contractDataProvider: ContractDataProvider, overrides?: ContractOverrides) { +export class ProxiedContractStoreFactory { + static create(contractStore: ContractStore, overrides?: ContractOverrides) { if (!overrides) { - return contractDataProvider; + return contractStore; } - return new Proxy(contractDataProvider, { - get(target, prop: keyof ContractDataProvider) { + return new Proxy(contractStore, { + get(target, prop: keyof ContractStore) { switch (prop) { case 'getContractInstance': { return async (address: AztecAddress) => { diff --git a/yarn-project/pxe/src/debug/pxe_debug_utils.ts b/yarn-project/pxe/src/debug/pxe_debug_utils.ts index 6ec6bdfe9d47..ce107a17c073 100644 --- a/yarn-project/pxe/src/debug/pxe_debug_utils.ts +++ b/yarn-project/pxe/src/debug/pxe_debug_utils.ts @@ -1,8 +1,8 @@ import type { NoteDao, NotesFilter } from '@aztec/stdlib/note'; import type { PXE } from '../pxe.js'; -import type { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js'; -import type { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; +import type { ContractStore } from '../storage/contract_store/contract_store.js'; +import type { NoteStore } from '../storage/note_store/note_store.js'; /** * Methods provided by this class might help debugging but must not be used in production. @@ -12,8 +12,8 @@ export class PXEDebugUtils { #pxe: PXE | undefined = undefined; constructor( - private contractDataProvider: ContractDataProvider, - private noteDataProvider: NoteDataProvider, + private contractStore: ContractStore, + private noteStore: NoteStore, ) {} /** @@ -40,9 +40,9 @@ export class PXEDebugUtils { } // We need to manually trigger private state sync to have a guarantee that all the notes are available. - const call = await this.contractDataProvider.getFunctionCall('sync_private_state', [], filter.contractAddress); + const call = await this.contractStore.getFunctionCall('sync_private_state', [], filter.contractAddress); await this.#pxe.simulateUtility(call); - return this.noteDataProvider.getNotes(filter); + return this.noteStore.getNotes(filter); } } diff --git a/yarn-project/pxe/src/error_enriching.ts b/yarn-project/pxe/src/error_enriching.ts index 81104ee9cdd9..0bd889147cb2 100644 --- a/yarn-project/pxe/src/error_enriching.ts +++ b/yarn-project/pxe/src/error_enriching.ts @@ -4,18 +4,14 @@ import { FunctionSelector } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { type SimulationError, isNoirCallStackUnresolved } from '@aztec/stdlib/errors'; -import type { ContractDataProvider } from './storage/contract_data_provider/contract_data_provider.js'; +import type { ContractStore } from './storage/contract_store/contract_store.js'; /** * Adds contract and function names to a simulation error, if they * can be found in the PXE database * @param err - The error to enrich. */ -export async function enrichSimulationError( - err: SimulationError, - contractDataProvider: ContractDataProvider, - logger: Logger, -) { +export async function enrichSimulationError(err: SimulationError, contractStore: ContractStore, logger: Logger) { // Maps contract addresses to the set of function selectors that were in error. // Map and Set do reference equality for their keys instead of value equality, so we store the string // representation to get e.g. different contract address objects with the same address value to match. @@ -34,7 +30,7 @@ export async function enrichSimulationError( await Promise.all( [...mentionedFunctions.entries()].map(async ([contractAddress, fnSelectors]) => { const parsedContractAddress = AztecAddress.fromString(contractAddress); - const contract = await contractDataProvider.getContract(parsedContractAddress); + const contract = await contractStore.getContract(parsedContractAddress); if (contract) { err.enrichWithContractName(parsedContractAddress, contract.name); // Map from function selector to function name. It uses a stringified key for the same reason as mentionedFunctions. @@ -68,11 +64,7 @@ export async function enrichSimulationError( ); } -export async function enrichPublicSimulationError( - err: SimulationError, - contractDataProvider: ContractDataProvider, - logger: Logger, -) { +export async function enrichPublicSimulationError(err: SimulationError, contractStore: ContractStore, logger: Logger) { const callStack = err.getCallStack(); const originalFailingFunction = callStack[callStack.length - 1]; @@ -80,7 +72,7 @@ export async function enrichPublicSimulationError( throw new Error(`Original failing function not found when enriching public simulation, missing callstack`); } - const artifact = await contractDataProvider.getPublicFunctionArtifact(originalFailingFunction.contractAddress); + const artifact = await contractStore.getPublicFunctionArtifact(originalFailingFunction.contractAddress); if (!artifact) { throw new Error( `Artifact not found when enriching public simulation error. Contract address: ${originalFailingFunction.contractAddress}.`, @@ -92,7 +84,7 @@ export async function enrichPublicSimulationError( err.setOriginalMessage(err.getOriginalMessage() + `${assertionMessage}`); } - const debugInfo = await contractDataProvider.getPublicFunctionDebugMetadata(originalFailingFunction.contractAddress); + const debugInfo = await contractStore.getPublicFunctionDebugMetadata(originalFailingFunction.contractAddress); const noirCallStack = err.getNoirCallStack(); if (debugInfo) { @@ -110,6 +102,6 @@ export async function enrichPublicSimulationError( ); } } - await enrichSimulationError(err, contractDataProvider, logger); + await enrichSimulationError(err, contractStore, logger); } } diff --git a/yarn-project/pxe/src/events/event_service.test.ts b/yarn-project/pxe/src/events/event_service.test.ts index e79799125fe2..e3d6608984cc 100644 --- a/yarn-project/pxe/src/events/event_service.test.ts +++ b/yarn-project/pxe/src/events/event_service.test.ts @@ -10,8 +10,8 @@ import { BlockHeader, GlobalVariables, type IndexedTxEffect, TxEffect } from '@a import { mock } from 'jest-mock-extended'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { PrivateEventDataProvider } from '../storage/private_event_data_provider/private_event_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { PrivateEventStore } from '../storage/private_event_store/private_event_store.js'; import { EventService } from './event_service.js'; describe('deliverEvent', () => { @@ -25,14 +25,14 @@ describe('deliverEvent', () => { let contractAddress: AztecAddress; let recipient: AztecAddress; - let anchorBlockDataProvider: AnchorBlockDataProvider; - let privateEventDataProvider: PrivateEventDataProvider; + let anchorBlockStore: AnchorBlockStore; + let privateEventStore: PrivateEventStore; let aztecNode: ReturnType>; let eventService: EventService; const setSyncedBlockNumber = (blockNumber: BlockNumber) => { - return anchorBlockDataProvider.setHeader( + return anchorBlockStore.setHeader( BlockHeader.empty({ globalVariables: GlobalVariables.empty({ blockNumber }), }), @@ -43,8 +43,8 @@ describe('deliverEvent', () => { // by minimally failing happy path conditions beforeEach(async () => { const store = await openTmpStore('test'); - anchorBlockDataProvider = new AnchorBlockDataProvider(store); - privateEventDataProvider = new PrivateEventDataProvider(store); + anchorBlockStore = new AnchorBlockStore(store); + privateEventStore = new PrivateEventStore(store); aztecNode = mock(); @@ -89,7 +89,7 @@ describe('deliverEvent', () => { ]), ); - eventService = new EventService(anchorBlockDataProvider, aztecNode, privateEventDataProvider); + eventService = new EventService(anchorBlockStore, aztecNode, privateEventStore); }); function runDeliverEvent( @@ -138,7 +138,7 @@ describe('deliverEvent', () => { await runDeliverEvent(); // I should be able to retrieve the private event I just saved using getPrivateEvents - const result = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const result = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: blockNumber, toBlock: blockNumber + 1, diff --git a/yarn-project/pxe/src/events/event_service.ts b/yarn-project/pxe/src/events/event_service.ts index 329bc2b8d778..74b37ba27503 100644 --- a/yarn-project/pxe/src/events/event_service.ts +++ b/yarn-project/pxe/src/events/event_service.ts @@ -6,14 +6,14 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/server'; import { MerkleTreeId } from '@aztec/stdlib/trees'; import type { TxHash } from '@aztec/stdlib/tx'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { PrivateEventDataProvider } from '../storage/private_event_data_provider/private_event_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { PrivateEventStore } from '../storage/private_event_store/private_event_store.js'; export class EventService { constructor( - private readonly anchorBlockDataProvider: AnchorBlockDataProvider, + private readonly anchorBlockStore: AnchorBlockStore, private readonly aztecNode: AztecNode, - private readonly privateEventDataProvider: PrivateEventDataProvider, + private readonly privateEventStore: PrivateEventStore, ) {} public async deliverEvent( @@ -29,7 +29,7 @@ export class EventService { // maintain consistent behavior in the PXE. Additionally, events should never be ahead of the synced block here // since `fetchTaggedLogs` only processes logs up to the synced block. const [syncedBlockHeader, siloedEventCommitment, txEffect] = await Promise.all([ - this.anchorBlockDataProvider.getBlockHeader(), + this.anchorBlockStore.getBlockHeader(), siloNullifier(contractAddress, eventCommitment), this.aztecNode.getTxEffect(txHash), ]); @@ -61,7 +61,7 @@ export class EventService { ); } - return this.privateEventDataProvider.storePrivateEventLog( + return this.privateEventStore.storePrivateEventLog( selector, content, Number(nullifierIndex.data), // Index of the event commitment in the nullifier tree diff --git a/yarn-project/pxe/src/events/private_event_filter_validator.test.ts b/yarn-project/pxe/src/events/private_event_filter_validator.test.ts index 2f6baa41b8a6..58f6e9585d03 100644 --- a/yarn-project/pxe/src/events/private_event_filter_validator.test.ts +++ b/yarn-project/pxe/src/events/private_event_filter_validator.test.ts @@ -6,7 +6,7 @@ import { BlockHeader, TxHash } from '@aztec/stdlib/tx'; import { mock } from 'jest-mock-extended'; import type { MockProxy } from 'jest-mock-extended/lib/Mock.js'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; import { PrivateEventFilterValidator } from './private_event_filter_validator.js'; describe('PrivateEventFilterValidator', () => { @@ -14,7 +14,7 @@ describe('PrivateEventFilterValidator', () => { let lastKnownBlock: BlockHeader; let lastKnownBlockNumber: BlockNumber; let scope: AztecAddress; - let anchorBlockDataProvider: MockProxy; + let anchorBlockStore: MockProxy; let validator: PrivateEventFilterValidator; beforeEach(async () => { @@ -22,10 +22,10 @@ describe('PrivateEventFilterValidator', () => { lastKnownBlockNumber = lastKnownBlock.getBlockNumber(); contractAddress = await AztecAddress.random(); scope = await AztecAddress.random(); - anchorBlockDataProvider = mock(); + anchorBlockStore = mock(); - anchorBlockDataProvider.getBlockHeader.mockResolvedValue(lastKnownBlock); - validator = new PrivateEventFilterValidator(anchorBlockDataProvider); + anchorBlockStore.getBlockHeader.mockResolvedValue(lastKnownBlock); + validator = new PrivateEventFilterValidator(anchorBlockStore); }); it('rejects empty scope', async () => { diff --git a/yarn-project/pxe/src/events/private_event_filter_validator.ts b/yarn-project/pxe/src/events/private_event_filter_validator.ts index 9d2372619945..dda3ca856db3 100644 --- a/yarn-project/pxe/src/events/private_event_filter_validator.ts +++ b/yarn-project/pxe/src/events/private_event_filter_validator.ts @@ -2,13 +2,13 @@ import type { PrivateEventFilter } from '@aztec/aztec.js/wallet'; import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants'; import { BlockNumber } from '@aztec/foundation/branded-types'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { PrivateEventDataProviderFilter } from '../storage/private_event_data_provider/private_event_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import type { PrivateEventStoreFilter } from '../storage/private_event_store/private_event_store.js'; export class PrivateEventFilterValidator { - constructor(private anchorBlockDataProvider: AnchorBlockDataProvider) {} + constructor(private anchorBlockStore: AnchorBlockStore) {} - async validate(filter: PrivateEventFilter): Promise { + async validate(filter: PrivateEventFilter): Promise { let { fromBlock, toBlock } = filter; // Block range filters in Aztec Node are defined as closed-open intervals [fromBlock, toBlock), so @@ -16,7 +16,7 @@ export class PrivateEventFilterValidator { // We then default to [INITIAL_L2_BLOCK_NUM, latestKnownBlock + 1), ie: by default return events from // the first block to the latest known block. if (!fromBlock || !toBlock) { - const lastKnownBlock = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const lastKnownBlock = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); fromBlock = fromBlock ?? BlockNumber(INITIAL_L2_BLOCK_NUM); toBlock = toBlock ?? BlockNumber(lastKnownBlock + 1); } diff --git a/yarn-project/pxe/src/logs/log_service.test.ts b/yarn-project/pxe/src/logs/log_service.test.ts index 6f20a18122d6..25e2c3494b8e 100644 --- a/yarn-project/pxe/src/logs/log_service.test.ts +++ b/yarn-project/pxe/src/logs/log_service.test.ts @@ -9,22 +9,22 @@ import { randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; import { type MockProxy, mock } from 'jest-mock-extended'; import { LogRetrievalRequest } from '../contract_function_simulator/noir-structs/log_retrieval_request.js'; -import { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js'; -import { RecipientTaggingDataProvider } from '../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import { SenderAddressBook } from '../storage/tagging_data_provider/sender_address_book.js'; +import { AddressStore } from '../storage/address_store/address_store.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { CapsuleStore } from '../storage/capsule_store/capsule_store.js'; +import { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js'; +import { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js'; import { LogService } from './log_service.js'; describe('LogService', () => { let contractAddress: AztecAddress; let aztecNode: MockProxy; - let anchorBlockDataProvider: AnchorBlockDataProvider; + let anchorBlockStore: AnchorBlockStore; let keyStore: KeyStore; - let capsuleDataProvider: CapsuleDataProvider; - let recipientTaggingDataProvider: RecipientTaggingDataProvider; - let addressDataProvider: AddressDataProvider; - let senderAddressBook: SenderAddressBook; + let capsuleStore: CapsuleStore; + let recipientTaggingStore: RecipientTaggingStore; + let addressStore: AddressStore; + let senderAddressBookStore: SenderAddressBookStore; let logService: LogService; describe('bulkRetrieveLogs', () => { @@ -33,23 +33,23 @@ describe('LogService', () => { beforeEach(async () => { // Set up contract address contractAddress = await AztecAddress.random(); - anchorBlockDataProvider = new AnchorBlockDataProvider(await openTmpStore('test')); + anchorBlockStore = new AnchorBlockStore(await openTmpStore('test')); keyStore = new KeyStore(await openTmpStore('test')); - capsuleDataProvider = new CapsuleDataProvider(await openTmpStore('test')); - recipientTaggingDataProvider = new RecipientTaggingDataProvider(await openTmpStore('test')); - senderAddressBook = new SenderAddressBook(await openTmpStore('test')); - addressDataProvider = new AddressDataProvider(await openTmpStore('test')); + capsuleStore = new CapsuleStore(await openTmpStore('test')); + recipientTaggingStore = new RecipientTaggingStore(await openTmpStore('test')); + senderAddressBookStore = new SenderAddressBookStore(await openTmpStore('test')); + addressStore = new AddressStore(await openTmpStore('test')); aztecNode = mock(); logService = new LogService( aztecNode, - anchorBlockDataProvider, + anchorBlockStore, keyStore, - capsuleDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - addressDataProvider, + capsuleStore, + recipientTaggingStore, + senderAddressBookStore, + addressStore, ); aztecNode.getPrivateLogsByTags.mockReset(); diff --git a/yarn-project/pxe/src/logs/log_service.ts b/yarn-project/pxe/src/logs/log_service.ts index 2745e2f47e54..4959d4a089e4 100644 --- a/yarn-project/pxe/src/logs/log_service.ts +++ b/yarn-project/pxe/src/logs/log_service.ts @@ -8,11 +8,11 @@ import { DirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag, Tag, TxScoped import type { LogRetrievalRequest } from '../contract_function_simulator/noir-structs/log_retrieval_request.js'; import { LogRetrievalResponse } from '../contract_function_simulator/noir-structs/log_retrieval_response.js'; -import { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js'; -import type { RecipientTaggingDataProvider } from '../storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import type { SenderAddressBook } from '../storage/tagging_data_provider/sender_address_book.js'; +import { AddressStore } from '../storage/address_store/address_store.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { CapsuleStore } from '../storage/capsule_store/capsule_store.js'; +import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js'; +import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js'; import { loadPrivateLogsForSenderRecipientPair } from '../tagging/index.js'; export class LogService { @@ -20,12 +20,12 @@ export class LogService { constructor( private readonly aztecNode: AztecNode, - private readonly anchorBlockDataProvider: AnchorBlockDataProvider, + private readonly anchorBlockStore: AnchorBlockStore, private readonly keyStore: KeyStore, - private readonly capsuleDataProvider: CapsuleDataProvider, - private readonly recipientTaggingDataProvider: RecipientTaggingDataProvider, - private readonly senderAddressBook: SenderAddressBook, - private readonly addressDataProvider: AddressDataProvider, + private readonly capsuleStore: CapsuleStore, + private readonly recipientTaggingStore: RecipientTaggingStore, + private readonly senderAddressBookStore: SenderAddressBookStore, + private readonly addressStore: AddressStore, ) {} public async bulkRetrieveLogs(logRetrievalRequests: LogRetrievalRequest[]): Promise<(LogRetrievalResponse | null)[]> { @@ -101,7 +101,7 @@ export class LogService { this.log.verbose('Searching for tagged logs', { contract: contractAddress }); // We only load logs from block up to and including the anchor block number - const anchorBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); // Determine recipients: use scopes if provided, otherwise get all accounts const recipients = scopes && scopes.length > 0 ? scopes : await this.keyStore.getAccounts(); @@ -120,7 +120,7 @@ export class LogService { secret, contractAddress, this.aztecNode, - this.recipientTaggingDataProvider, + this.recipientTaggingStore, anchorBlockNumber, ), ), @@ -146,7 +146,7 @@ export class LogService { // We implicitly add all PXE accounts as senders, this helps us decrypt tags on notes that we send to ourselves // (recipient = us, sender = us) - const allSenders = [...(await this.senderAddressBook.getSenders()), ...(await this.keyStore.getAccounts())]; + const allSenders = [...(await this.senderAddressBookStore.getSenders()), ...(await this.keyStore.getAccounts())]; // We deduplicate the senders by adding them to a set and then converting the set back to an array const deduplicatedSenders = Array.from(new Set(allSenders.map(sender => sender.toString()))).map(sender => @@ -186,11 +186,11 @@ export class LogService { }); // TODO: This looks like it could belong more at the oracle interface level - return this.capsuleDataProvider.appendToCapsuleArray(contractAddress, capsuleArrayBaseSlot, pendingTaggedLogs); + return this.capsuleStore.appendToCapsuleArray(contractAddress, capsuleArrayBaseSlot, pendingTaggedLogs); } async #getCompleteAddress(account: AztecAddress): Promise { - const completeAddress = await this.addressDataProvider.getCompleteAddress(account); + const completeAddress = await this.addressStore.getCompleteAddress(account); if (!completeAddress) { throw new Error( `No public key registered for address ${account}. diff --git a/yarn-project/pxe/src/notes/note_service.test.ts b/yarn-project/pxe/src/notes/note_service.test.ts index 18c97d4dbc8a..0a53958ca841 100644 --- a/yarn-project/pxe/src/notes/note_service.test.ts +++ b/yarn-project/pxe/src/notes/note_service.test.ts @@ -14,13 +14,13 @@ import { BlockHeader, GlobalVariables, type IndexedTxEffect, TxEffect, TxHash } import { jest } from '@jest/globals'; import { mock } from 'jest-mock-extended'; -import { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; +import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import { NoteStore } from '../storage/note_store/note_store.js'; import { NoteService } from './note_service.js'; describe('NoteService', () => { - let anchorBlockDataProvider: AnchorBlockDataProvider; - let noteDataProvider: NoteDataProvider; + let anchorBlockStore: AnchorBlockStore; + let noteStore: NoteStore; let keyStore: KeyStore; let aztecNode: ReturnType>; const syncedBlockNumber = 42; @@ -32,11 +32,11 @@ describe('NoteService', () => { beforeEach(async () => { const store = await openTmpStore('test'); keyStore = new KeyStore(store); - noteDataProvider = await NoteDataProvider.create(store); - noteDataProvider = await NoteDataProvider.create(store); + noteStore = await NoteStore.create(store); + noteStore = await NoteStore.create(store); aztecNode = mock(); - anchorBlockDataProvider = new AnchorBlockDataProvider(store); - await anchorBlockDataProvider.setHeader( + anchorBlockStore = new AnchorBlockStore(store); + await anchorBlockStore.setHeader( BlockHeader.empty({ globalVariables: GlobalVariables.empty({ blockNumber: BlockNumber(syncedBlockNumber) }), }), @@ -45,7 +45,7 @@ describe('NoteService', () => { contractAddress = await AztecAddress.random(); // Check that there are no notes in the database - const notes = await noteDataProvider.getNotes({ contractAddress }); + const notes = await noteStore.getNotes({ contractAddress }); expect(notes).toHaveLength(0); // Check that the expected number of accounts is present @@ -54,19 +54,19 @@ describe('NoteService', () => { recipient = await keyStore.addAccount(new Fr(69), Fr.random()); - noteService = new NoteService(noteDataProvider, aztecNode, anchorBlockDataProvider); + noteService = new NoteService(noteStore, aztecNode, anchorBlockStore); }); it('should remove notes that have been nullified', async () => { // Set up initial state with a note const noteDao = await NoteDao.random({ contractAddress }); - // Spy on the noteDataProvider.applyNullifiers to later on have additional guarantee that we really removed + // Spy on the noteStore.applyNullifiers to later on have additional guarantee that we really removed // the note. - jest.spyOn(noteDataProvider, 'applyNullifiers'); + jest.spyOn(noteStore, 'applyNullifiers'); // Add the note to storage - await noteDataProvider.addNotes([noteDao], recipient.address); + await noteStore.addNotes([noteDao], recipient.address); // Set up the nullifier in the merkle tree const nullifierIndex = randomDataInBlock(123n); @@ -76,7 +76,7 @@ describe('NoteService', () => { await noteService.syncNoteNullifiers(contractAddress); // Verify the note was removed by checking storage - const remainingNotes = await noteDataProvider.getNotes({ + const remainingNotes = await noteStore.getNotes({ contractAddress, status: NoteStatus.ACTIVE, scopes: [recipient.address], @@ -84,7 +84,7 @@ describe('NoteService', () => { expect(remainingNotes).toHaveLength(0); // Verify the note was removed by checking the spy - expect(noteDataProvider.applyNullifiers).toHaveBeenCalledTimes(1); + expect(noteStore.applyNullifiers).toHaveBeenCalledTimes(1); }); it('should keep notes that have not been nullified', async () => { @@ -92,7 +92,7 @@ describe('NoteService', () => { const noteDao = await NoteDao.random({ contractAddress }); // Add the note to storage - await noteDataProvider.addNotes([noteDao], recipient.address); + await noteStore.addNotes([noteDao], recipient.address); // No nullifier found in merkle tree aztecNode.findLeavesIndexes.mockResolvedValue([undefined]); @@ -101,7 +101,7 @@ describe('NoteService', () => { await noteService.syncNoteNullifiers(contractAddress); // Verify note still exists - const remainingNotes = await noteDataProvider.getNotes({ + const remainingNotes = await noteStore.getNotes({ contractAddress, status: NoteStatus.ACTIVE, scopes: [recipient.address], @@ -118,7 +118,7 @@ describe('NoteService', () => { const noteDao = await NoteDao.random({ contractAddress }); // Add the note to storage - await noteDataProvider.addNotes([noteDao], recipient.address); + await noteStore.addNotes([noteDao], recipient.address); // Mock nullifier to only exist after synced block aztecNode.findLeavesIndexes.mockImplementation(blockNum => { @@ -132,7 +132,7 @@ describe('NoteService', () => { await noteService.syncNoteNullifiers(contractAddress); // Verify note still exists - const remainingNotes = await noteDataProvider.getNotes({ + const remainingNotes = await noteStore.getNotes({ contractAddress, status: NoteStatus.ACTIVE, scopes: [recipient.address], @@ -148,8 +148,8 @@ describe('NoteService', () => { expect(await keyStore.getAccounts()).toHaveLength(3); - // Spy on the noteDataProvider.getNotesSpy - const getNotesSpy = jest.spyOn(noteDataProvider, 'getNotes'); + // Spy on the noteStore.getNotesSpy + const getNotesSpy = jest.spyOn(noteStore, 'getNotes'); // Call the function under test await noteService.syncNoteNullifiers(contractAddress); @@ -184,7 +184,7 @@ describe('NoteService', () => { let nullified = false; const setSyncedBlockNumber = (blockNumber: BlockNumber) => { - return anchorBlockDataProvider.setHeader( + return anchorBlockStore.setHeader( BlockHeader.empty({ globalVariables: GlobalVariables.empty({ blockNumber }), }), @@ -277,7 +277,7 @@ describe('NoteService', () => { ); // Verify note was stored - const notes = await noteDataProvider.getNotes({ contractAddress, scopes: [recipient.address] }); + const notes = await noteStore.getNotes({ contractAddress, scopes: [recipient.address] }); expect(notes).toHaveLength(1); expect(notes[0].noteHash.equals(noteHash)).toBe(true); @@ -353,7 +353,7 @@ describe('NoteService', () => { ); // Verify note was removed - const notes = await noteDataProvider.getNotes({ contractAddress, scopes: [recipient.address] }); + const notes = await noteStore.getNotes({ contractAddress, scopes: [recipient.address] }); expect(notes).toHaveLength(0); }); }); diff --git a/yarn-project/pxe/src/notes/note_service.ts b/yarn-project/pxe/src/notes/note_service.ts index 16a95acb2090..4596a6bd0407 100644 --- a/yarn-project/pxe/src/notes/note_service.ts +++ b/yarn-project/pxe/src/notes/note_service.ts @@ -7,14 +7,14 @@ import { Note, NoteDao, NoteStatus } from '@aztec/stdlib/note'; import { MerkleTreeId } from '@aztec/stdlib/trees'; import type { TxHash } from '@aztec/stdlib/tx'; -import type { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import type { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js'; +import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; +import type { NoteStore } from '../storage/note_store/note_store.js'; export class NoteService { constructor( - private readonly noteDataProvider: NoteDataProvider, + private readonly noteStore: NoteStore, private readonly aztecNode: AztecNode, - private readonly anchorBlockDataProvider: AnchorBlockDataProvider, + private readonly anchorBlockStore: AnchorBlockStore, ) {} /** @@ -33,7 +33,7 @@ export class NoteService { status: NoteStatus, scopes?: AztecAddress[], ) { - const noteDaos = await this.noteDataProvider.getNotes({ + const noteDaos = await this.noteStore.getNotes({ contractAddress, owner, storageSlot, @@ -59,7 +59,7 @@ export class NoteService { /** * Looks for nullifiers of active contract notes and marks them as nullified if a nullifier is found. * - * Fetches notes from the NoteDataProvider and checks which nullifiers are present in the + * Fetches notes from the NoteStore and checks which nullifiers are present in the * onchain nullifier Merkle tree - up to the latest locally synced block. We use the * locally synced block instead of querying the chain's 'latest' block to ensure correctness: * notes are only marked nullified once their corresponding nullifier has been included in a @@ -69,9 +69,9 @@ export class NoteService { * @param contractAddress - The contract whose notes should be checked and nullified. */ public async syncNoteNullifiers(contractAddress: AztecAddress): Promise { - const syncedBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const syncedBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); - const contractNotes = await this.noteDataProvider.getNotes({ contractAddress }); + const contractNotes = await this.noteStore.getNotes({ contractAddress }); if (contractNotes.length === 0) { return; @@ -105,7 +105,7 @@ export class NoteService { }) .filter(nullifier => nullifier !== undefined) as DataInBlock[]; - await this.noteDataProvider.applyNullifiers(foundNullifiers); + await this.noteStore.applyNullifiers(foundNullifiers); } public async deliverNote( @@ -120,7 +120,7 @@ export class NoteService { txHash: TxHash, recipient: AztecAddress, ): Promise { - // We are going to store the new note in the NoteDataProvider, which will let us later return it via `getNotes`. + // We are going to store the new note in the NoteStore, which will let us later return it via `getNotes`. // There's two things we need to check before we do this however: // - we must make sure the note does actually exist in the note hash tree // - we need to check if the note has already been nullified @@ -139,7 +139,7 @@ export class NoteService { // number which *should* be recent enough to be available, even for non-archive nodes. // Also note that the note should never be ahead of the synced block here since `fetchTaggedLogs` only processes // logs up to the synced block making this only an additional safety check. - const syncedBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const syncedBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); // By computing siloed and unique note hashes ourselves we prevent contracts from interfering with the note storage // of other contracts, which would constitute a security breach. @@ -190,11 +190,11 @@ export class NoteService { ); // The note was found by `recipient`, so we use that as the scope when storing the note. - await this.noteDataProvider.addNotes([noteDao], recipient); + await this.noteStore.addNotes([noteDao], recipient); if (nullifierIndex !== undefined) { const { data: _, ...blockHashAndNum } = nullifierIndex; - await this.noteDataProvider.applyNullifiers([{ data: siloedNullifier, ...blockHashAndNum }]); + await this.noteStore.applyNullifiers([{ data: siloedNullifier, ...blockHashAndNum }]); } } } diff --git a/yarn-project/pxe/src/private_kernel/private_kernel_oracle_impl.ts b/yarn-project/pxe/src/private_kernel/private_kernel_oracle_impl.ts index b1c5f9342f66..5913692d3dff 100644 --- a/yarn-project/pxe/src/private_kernel/private_kernel_oracle_impl.ts +++ b/yarn-project/pxe/src/private_kernel/private_kernel_oracle_impl.ts @@ -18,7 +18,7 @@ import { UpdatedClassIdHints } from '@aztec/stdlib/kernel'; import type { NullifierMembershipWitness } from '@aztec/stdlib/trees'; import type { VerificationKeyAsFields } from '@aztec/stdlib/vks'; -import type { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js'; +import type { ContractStore } from '../storage/contract_store/contract_store.js'; import type { PrivateKernelOracle } from './private_kernel_oracle.js'; // TODO: Block number should not be "latest". @@ -29,7 +29,7 @@ import type { PrivateKernelOracle } from './private_kernel_oracle.js'; */ export class PrivateKernelOracleImpl implements PrivateKernelOracle { constructor( - private contractDataProvider: ContractDataProvider, + private contractStore: ContractStore, private keyStore: KeyStore, private node: AztecNode, private blockNumber: BlockParameter = 'latest', @@ -37,7 +37,7 @@ export class PrivateKernelOracleImpl implements PrivateKernelOracle { ) {} public async getContractAddressPreimage(address: AztecAddress) { - const instance = await this.contractDataProvider.getContractInstance(address); + const instance = await this.contractStore.getContractInstance(address); if (!instance) { throw new Error(`Contract instance not found when getting address preimage. Contract address: ${address}.`); } @@ -48,7 +48,7 @@ export class PrivateKernelOracleImpl implements PrivateKernelOracle { } public async getContractClassIdPreimage(contractClassId: Fr) { - const contractClass = await this.contractDataProvider.getContractClass(contractClassId); + const contractClass = await this.contractStore.getContractClass(contractClassId); if (!contractClass) { throw new Error(`Contract class not found when getting class id preimage. Class id: ${contractClassId}.`); } @@ -56,7 +56,7 @@ export class PrivateKernelOracleImpl implements PrivateKernelOracle { } public async getFunctionMembershipWitness(contractClassId: Fr, selector: FunctionSelector) { - const membershipWitness = await this.contractDataProvider.getFunctionMembershipWitness(contractClassId, selector); + const membershipWitness = await this.contractStore.getFunctionMembershipWitness(contractClassId, selector); if (!membershipWitness) { throw new Error( `Membership witness not found for contract class id ${contractClassId} and selector ${selector}.`, @@ -96,7 +96,7 @@ export class PrivateKernelOracleImpl implements PrivateKernelOracle { } public getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise { - return this.contractDataProvider.getDebugFunctionName(contractAddress, selector); + return this.contractStore.getDebugFunctionName(contractAddress, selector); } public async getUpdatedClassIdHints(contractAddress: AztecAddress): Promise { diff --git a/yarn-project/pxe/src/public_storage/public_storage_service.ts b/yarn-project/pxe/src/public_storage/public_storage_service.ts index 42666cc24ce0..8cba314f1c41 100644 --- a/yarn-project/pxe/src/public_storage/public_storage_service.ts +++ b/yarn-project/pxe/src/public_storage/public_storage_service.ts @@ -3,11 +3,11 @@ import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { BlockParameter } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import type { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; +import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; export class PublicStorageService { constructor( - private readonly anchorBlockDataProvider: AnchorBlockDataProvider, + private readonly anchorBlockStore: AnchorBlockStore, private readonly aztecNode: AztecNode, ) {} @@ -24,7 +24,7 @@ export class PublicStorageService { * @throws If the contract is not deployed. */ public async getPublicStorageAt(blockNumber: BlockParameter, contract: AztecAddress, slot: Fr): Promise { - const anchorBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); if (blockNumber !== 'latest' && blockNumber > anchorBlockNumber) { throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`); } diff --git a/yarn-project/pxe/src/pxe.test.ts b/yarn-project/pxe/src/pxe.test.ts index a4a6f9ce99f8..086b76338744 100644 --- a/yarn-project/pxe/src/pxe.test.ts +++ b/yarn-project/pxe/src/pxe.test.ts @@ -27,7 +27,7 @@ import type { MockProxy } from 'jest-mock-extended/lib/Mock.js'; import type { PXEConfig } from './config/index.js'; import { PXE, type PackedPrivateEvent } from './pxe.js'; -import { PrivateEventDataProvider } from './storage/private_event_data_provider/private_event_data_provider.js'; +import { PrivateEventStore } from './storage/private_event_store/private_event_store.js'; describe('PXE', () => { let pxe: PXE; @@ -155,14 +155,14 @@ describe('PXE', () => { // These tests are meant to quickly exercise PXE as a // frontier API so we don't need to rely on slower E2E // tests (which in turn are more meaningful for acceptance). - // For finer grained tests check out storage/private_event_data_provider.test.ts + // For finer grained tests check out storage/private_event_store.test.ts describe('getPrivateEvents', () => { let contractAddress: AztecAddress; let eventSelector: EventSelector; let lastKnownBlockNumber: BlockNumber; let l2BlockHash: L2BlockHash; let scope: AztecAddress; - let privateEventDataProvider: PrivateEventDataProvider; + let privateEventStore: PrivateEventStore; let eventIndex = 0; beforeEach(async () => { @@ -206,7 +206,7 @@ describe('PXE', () => { scope = await AztecAddress.random(); - privateEventDataProvider = new PrivateEventDataProvider(kvStore); + privateEventStore = new PrivateEventStore(kvStore); }); async function storeEvent(blockNumber?: number): Promise { @@ -218,7 +218,7 @@ describe('PXE', () => { eventSelector, }; - await privateEventDataProvider.storePrivateEventLog(eventSelector, event.packedEvent, eventIndex++, { + await privateEventStore.storePrivateEventLog(eventSelector, event.packedEvent, eventIndex++, { contractAddress, scope, txHash: event.txHash, diff --git a/yarn-project/pxe/src/pxe.ts b/yarn-project/pxe/src/pxe.ts index 9416e8decc9c..5f859709e77c 100644 --- a/yarn-project/pxe/src/pxe.ts +++ b/yarn-project/pxe/src/pxe.ts @@ -59,7 +59,7 @@ import { generateSimulatedProvingResult, } from './contract_function_simulator/contract_function_simulator.js'; import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js'; -import { ProxiedContractDataProviderFactory } from './contract_function_simulator/proxied_contract_data_source.js'; +import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js'; import { PXEDebugUtils } from './debug/pxe_debug_utils.js'; import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js'; import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js'; @@ -68,15 +68,15 @@ import { type PrivateKernelExecutionProverConfig, } from './private_kernel/private_kernel_execution_prover.js'; import { PrivateKernelOracleImpl } from './private_kernel/private_kernel_oracle_impl.js'; -import { AddressDataProvider } from './storage/address_data_provider/address_data_provider.js'; -import { AnchorBlockDataProvider } from './storage/anchor_block_data_provider/anchor_block_data_provider.js'; -import { CapsuleDataProvider } from './storage/capsule_data_provider/capsule_data_provider.js'; -import { ContractDataProvider } from './storage/contract_data_provider/contract_data_provider.js'; -import { NoteDataProvider } from './storage/note_data_provider/note_data_provider.js'; -import { PrivateEventDataProvider } from './storage/private_event_data_provider/private_event_data_provider.js'; -import { RecipientTaggingDataProvider } from './storage/tagging_data_provider/recipient_tagging_data_provider.js'; -import { SenderAddressBook } from './storage/tagging_data_provider/sender_address_book.js'; -import { SenderTaggingDataProvider } from './storage/tagging_data_provider/sender_tagging_data_provider.js'; +import { AddressStore } from './storage/address_store/address_store.js'; +import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js'; +import { CapsuleStore } from './storage/capsule_store/capsule_store.js'; +import { ContractStore } from './storage/contract_store/contract_store.js'; +import { NoteStore } from './storage/note_store/note_store.js'; +import { PrivateEventStore } from './storage/private_event_store/private_event_store.js'; +import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js'; +import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js'; +import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js'; export type PackedPrivateEvent = InTx & { packedEvent: Fr[]; @@ -92,15 +92,15 @@ export class PXE { private node: AztecNode, private blockStateSynchronizer: BlockSynchronizer, private keyStore: KeyStore, - private contractDataProvider: ContractDataProvider, - private noteDataProvider: NoteDataProvider, - private capsuleDataProvider: CapsuleDataProvider, - private anchorBlockDataProvider: AnchorBlockDataProvider, - private senderTaggingDataProvider: SenderTaggingDataProvider, - private senderAddressBook: SenderAddressBook, - private recipientTaggingDataProvider: RecipientTaggingDataProvider, - private addressDataProvider: AddressDataProvider, - private privateEventDataProvider: PrivateEventDataProvider, + private contractStore: ContractStore, + private noteStore: NoteStore, + private capsuleStore: CapsuleStore, + private anchorBlockStore: AnchorBlockStore, + private senderTaggingStore: SenderTaggingStore, + private senderAddressBookStore: SenderAddressBookStore, + private recipientTaggingStore: RecipientTaggingStore, + private addressStore: AddressStore, + private privateEventStore: PrivateEventStore, private simulator: CircuitSimulator, private proverEnabled: boolean, private proofCreator: PrivateKernelProver, @@ -132,27 +132,20 @@ export class PXE { : loggerOrSuffix; const proverEnabled = !!config.proverEnabled; - const addressDataProvider = new AddressDataProvider(store); - const privateEventDataProvider = new PrivateEventDataProvider(store); - const contractDataProvider = new ContractDataProvider(store); - const noteDataProvider = await NoteDataProvider.create(store); - const anchorBlockDataProvider = new AnchorBlockDataProvider(store); - const senderTaggingDataProvider = new SenderTaggingDataProvider(store); - const senderAddressBook = new SenderAddressBook(store); - const recipientTaggingDataProvider = new RecipientTaggingDataProvider(store); - const capsuleDataProvider = new CapsuleDataProvider(store); + const addressStore = new AddressStore(store); + const privateEventStore = new PrivateEventStore(store); + const contractStore = new ContractStore(store); + const noteStore = await NoteStore.create(store); + const anchorBlockStore = new AnchorBlockStore(store); + const senderTaggingStore = new SenderTaggingStore(store); + const senderAddressBookStore = new SenderAddressBookStore(store); + const recipientTaggingStore = new RecipientTaggingStore(store); + const capsuleStore = new CapsuleStore(store); const keyStore = new KeyStore(store); const tipsStore = new L2TipsKVStore(store, 'pxe'); - const synchronizer = new BlockSynchronizer( - node, - anchorBlockDataProvider, - noteDataProvider, - tipsStore, - config, - loggerOrSuffix, - ); + const synchronizer = new BlockSynchronizer(node, anchorBlockStore, noteStore, tipsStore, config, loggerOrSuffix); - const debugUtils = new PXEDebugUtils(contractDataProvider, noteDataProvider); + const debugUtils = new PXEDebugUtils(contractStore, noteStore); const jobQueue = new SerialQueue(); @@ -160,15 +153,15 @@ export class PXE { node, synchronizer, keyStore, - contractDataProvider, - noteDataProvider, - capsuleDataProvider, - anchorBlockDataProvider, - senderTaggingDataProvider, - senderAddressBook, - recipientTaggingDataProvider, - addressDataProvider, - privateEventDataProvider, + contractStore, + noteStore, + capsuleStore, + anchorBlockStore, + senderTaggingStore, + senderAddressBookStore, + recipientTaggingStore, + addressStore, + privateEventStore, simulator, proverEnabled, proofCreator, @@ -191,23 +184,20 @@ export class PXE { // Internal methods #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) { - const proxyContractDataProvider = ProxiedContractDataProviderFactory.create( - this.contractDataProvider, - overrides?.contracts, - ); + const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts); return new ContractFunctionSimulator( - proxyContractDataProvider, - this.noteDataProvider, + proxyContractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.node, - this.anchorBlockDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.anchorBlockStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, this.simulator, ); } @@ -248,8 +238,8 @@ export class PXE { for (const name of protocolContractNames) { const { address, contractClass, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name); - await this.contractDataProvider.addContractArtifact(contractClass.id, artifact); - await this.contractDataProvider.addContractInstance(instance); + await this.contractStore.addContractArtifact(contractClass.id, artifact); + await this.contractStore.addContractInstance(instance); registered[name] = address.toString(); } this.log.verbose(`Registered protocol contracts in pxe`, registered); @@ -278,7 +268,7 @@ export class PXE { const { origin: contractAddress, functionSelector } = txRequest; try { - const anchorBlockHeader = await this.anchorBlockDataProvider.getBlockHeader(); + const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader(); const result = await contractFunctionSimulator.run( txRequest, @@ -295,7 +285,7 @@ export class PXE { return result; } catch (err) { if (err instanceof SimulationError) { - await enrichSimulationError(err, this.contractDataProvider, this.log); + await enrichSimulationError(err, this.contractStore, this.log); } throw err; } @@ -317,11 +307,11 @@ export class PXE { scopes?: AztecAddress[], ) { try { - const anchorBlockHeader = await this.anchorBlockDataProvider.getBlockHeader(); + const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader(); return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes); } catch (err) { if (err instanceof SimulationError) { - await enrichSimulationError(err, this.contractDataProvider, this.log); + await enrichSimulationError(err, this.contractStore, this.log); } throw err; } @@ -345,7 +335,7 @@ export class PXE { } catch (err) { if (err instanceof SimulationError) { try { - await enrichPublicSimulationError(err, this.contractDataProvider, this.log); + await enrichPublicSimulationError(err, this.contractStore, this.log); } catch (enrichErr) { this.log.error(`Failed to enrich public simulation error: ${enrichErr}`); } @@ -373,7 +363,7 @@ export class PXE { ): Promise> { const simulationAnchorBlock = privateExecutionResult.getSimulationAnchorBlockNumber(); const kernelOracle = new PrivateKernelOracleImpl( - this.contractDataProvider, + this.contractStore, this.keyStore, this.node, simulationAnchorBlock, @@ -386,7 +376,7 @@ export class PXE { // Public API public getContractInstance(address: AztecAddress): Promise { - return this.contractDataProvider.getContractInstance(address); + return this.contractStore.getContractInstance(address); } /** @@ -411,7 +401,7 @@ export class PXE { isContractClassPubliclyRegistered: boolean; artifact: ContractArtifact | undefined; }> { - const artifact = await this.contractDataProvider.getContractArtifact(id); + const artifact = await this.contractStore.getContractArtifact(id); if (!artifact) { this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`); } @@ -441,7 +431,7 @@ export class PXE { }> { let instance; try { - instance = await this.contractDataProvider.getContractInstance(address); + instance = await this.contractStore.getContractInstance(address); } catch { this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`); } @@ -473,8 +463,8 @@ export class PXE { this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`); } - await this.addressDataProvider.addCompleteAddress(accountCompleteAddress); - await this.noteDataProvider.addScope(accountCompleteAddress.address); + await this.addressStore.addCompleteAddress(accountCompleteAddress); + await this.noteStore.addScope(accountCompleteAddress.address); return accountCompleteAddress; } @@ -495,7 +485,7 @@ export class PXE { return sender; } - const wasAdded = await this.senderAddressBook.addSender(sender); + const wasAdded = await this.senderAddressBookStore.addSender(sender); if (wasAdded) { this.log.info(`Added sender:\n ${sender.toString()}`); @@ -511,7 +501,7 @@ export class PXE { * @returns Senders registered in this PXE. */ public getSenders(): Promise { - return this.senderAddressBook.getSenders(); + return this.senderAddressBookStore.getSenders(); } /** @@ -519,7 +509,7 @@ export class PXE { * @param sender - The address of the sender to remove. */ public async removeSender(sender: AztecAddress): Promise { - const wasRemoved = await this.senderAddressBook.removeSender(sender); + const wasRemoved = await this.senderAddressBookStore.removeSender(sender); if (wasRemoved) { this.log.info(`Removed sender:\n ${sender.toString()}`); @@ -534,7 +524,7 @@ export class PXE { */ public async getRegisteredAccounts(): Promise { // Get complete addresses of both the recipients and the accounts - const completeAddresses = await this.addressDataProvider.getCompleteAddresses(); + const completeAddresses = await this.addressStore.getCompleteAddresses(); // Filter out the addresses not corresponding to accounts const accounts = await this.keyStore.getAccounts(); return completeAddresses.filter(completeAddress => @@ -549,7 +539,7 @@ export class PXE { */ public async registerContractClass(artifact: ContractArtifact): Promise { const { id: contractClassId } = await getContractClassFromArtifact(artifact); - await this.contractDataProvider.addContractArtifact(contractClassId, artifact); + await this.contractStore.addContractArtifact(contractClassId, artifact); this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`); } @@ -578,7 +568,7 @@ export class PXE { if (!computedAddress.equals(instance.address)) { throw new Error('Added a contract in which the address does not match the contract instance.'); } - await this.contractDataProvider.addContractArtifact(contractClass.id, artifact); + await this.contractStore.addContractArtifact(contractClass.id, artifact); const publicFunctionSignatures = artifact.functions .filter(fn => fn.functionType === FunctionType.PUBLIC) @@ -586,7 +576,7 @@ export class PXE { await this.node.registerContractFunctionSignatures(publicFunctionSignatures); } else { // Otherwise, make sure there is an artifact already registered for that class id - artifact = await this.contractDataProvider.getContractArtifact(instance.currentContractClassId); + artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId); if (!artifact) { throw new Error( `Artifact not found when registering an instance. Contract class: ${instance.currentContractClassId}.`, @@ -594,7 +584,7 @@ export class PXE { } } - await this.contractDataProvider.addContractInstance(instance); + await this.contractStore.addContractInstance(instance); this.log.info( `Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`, ); @@ -613,14 +603,14 @@ export class PXE { // We disable concurrently updating contracts to avoid concurrently syncing with the node, or changing a contract's // class while we're simulating it. return this.#putInJobQueue(async () => { - const currentInstance = await this.contractDataProvider.getContractInstance(contractAddress); + const currentInstance = await this.contractStore.getContractInstance(contractAddress); if (!currentInstance) { throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`); } const contractClass = await getContractClassFromArtifact(artifact); await this.blockStateSynchronizer.sync(); - const header = await this.anchorBlockDataProvider.getBlockHeader(); + const header = await this.anchorBlockStore.getBlockHeader(); const currentClassId = await readCurrentClassId( contractAddress, @@ -633,7 +623,7 @@ export class PXE { throw new Error('Could not update contract to a class different from the current one.'); } - await this.contractDataProvider.addContractArtifact(contractClass.id, artifact); + await this.contractStore.addContractArtifact(contractClass.id, artifact); const publicFunctionSignatures = artifact.functions .filter(fn => fn.functionType === FunctionType.PUBLIC) @@ -641,7 +631,7 @@ export class PXE { await this.node.registerContractFunctionSignatures(publicFunctionSignatures); currentInstance.currentContractClassId = contractClass.id; - await this.contractDataProvider.addContractInstance(currentInstance); + await this.contractStore.addContractInstance(currentInstance); this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`); }); } @@ -651,7 +641,7 @@ export class PXE { * @returns An array of contracts addresses registered on this PXE. */ public getContracts(): Promise { - return this.contractDataProvider.getContractsAddresses(); + return this.contractStore.getContractsAddresses(); } /** @@ -721,7 +711,7 @@ export class PXE { // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it. const txHash = (await txProvingResult.toTx()).txHash; - await this.senderTaggingDataProvider.storePendingIndexes(preTagsUsedInTheTx, txHash); + await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash); this.log.debug(`Stored used pre-tags as sender for the tx`, { preTagsUsedInTheTx, }); @@ -891,7 +881,7 @@ export class PXE { ({ publicInputs, executionSteps } = await generateSimulatedProvingResult( privateExecutionResult, nonceGenerator, - this.contractDataProvider, + this.contractStore, )); } else { // Kernel logic, plus proving of all private functions and kernels. @@ -1046,16 +1036,16 @@ export class PXE { filter: PrivateEventFilter, ): Promise { // We need to manually trigger private state sync to have a guarantee that all the events are available. - const call = await this.contractDataProvider.getFunctionCall('sync_private_state', [], filter.contractAddress); + const call = await this.contractStore.getFunctionCall('sync_private_state', [], filter.contractAddress); await this.simulateUtility(call); - const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockDataProvider).validate(filter); + const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockStore).validate(filter); this.log.debug( `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`, ); - return this.privateEventDataProvider.getPrivateEvents(eventSelector, sanitizedFilter); + return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter); } /** diff --git a/yarn-project/pxe/src/storage/address_data_provider/index.ts b/yarn-project/pxe/src/storage/address_data_provider/index.ts deleted file mode 100644 index c4263314cee4..000000000000 --- a/yarn-project/pxe/src/storage/address_data_provider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AddressDataProvider } from './address_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/address_data_provider/address_data_provider.test.ts b/yarn-project/pxe/src/storage/address_store/address_store.test.ts similarity index 57% rename from yarn-project/pxe/src/storage/address_data_provider/address_data_provider.test.ts rename to yarn-project/pxe/src/storage/address_store/address_store.test.ts index 7f6d0a664ccf..40cea7d0f9f3 100644 --- a/yarn-project/pxe/src/storage/address_data_provider/address_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/address_store/address_store.test.ts @@ -4,26 +4,26 @@ import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { CompleteAddress } from '@aztec/stdlib/contract'; import { PublicKeys } from '@aztec/stdlib/keys'; -import { AddressDataProvider } from './address_data_provider.js'; +import { AddressStore } from './address_store.js'; describe('addresses', () => { - let addressDataProvider: AddressDataProvider; + let addressStore: AddressStore; beforeEach(async () => { - const store = await openTmpStore('address_data_provider_test'); - addressDataProvider = new AddressDataProvider(store); + const store = await openTmpStore('address_store_test'); + addressStore = new AddressStore(store); }); it('stores and retrieves addresses', async () => { const address = await CompleteAddress.random(); - await expect(addressDataProvider.addCompleteAddress(address)).resolves.toBe(true); - await expect(addressDataProvider.getCompleteAddress(address.address)).resolves.toEqual(address); + await expect(addressStore.addCompleteAddress(address)).resolves.toBe(true); + await expect(addressStore.getCompleteAddress(address.address)).resolves.toEqual(address); }); it('silently ignores an address it already knows about', async () => { const address = await CompleteAddress.random(); - await expect(addressDataProvider.addCompleteAddress(address)).resolves.toBe(true); - await expect(addressDataProvider.addCompleteAddress(address)).resolves.toBe(false); + await expect(addressStore.addCompleteAddress(address)).resolves.toBe(true); + await expect(addressStore.addCompleteAddress(address)).resolves.toBe(false); }); it.skip('refuses to overwrite an address with a different public key', async () => { @@ -34,36 +34,36 @@ describe('addresses', () => { address.partialAddress, ); - await addressDataProvider.addCompleteAddress(address); - await expect(addressDataProvider.addCompleteAddress(otherAddress)).rejects.toThrow(); + await addressStore.addCompleteAddress(address); + await expect(addressStore.addCompleteAddress(otherAddress)).rejects.toThrow(); }); it('returns all addresses', async () => { const addresses = await timesParallel(10, () => CompleteAddress.random()); for (const address of addresses) { - await addressDataProvider.addCompleteAddress(address); + await addressStore.addCompleteAddress(address); } - const result = await addressDataProvider.getCompleteAddresses(); + const result = await addressStore.getCompleteAddresses(); expect(result).toEqual(expect.arrayContaining(addresses)); }); it('returns a single address', async () => { const addresses = await timesParallel(10, () => CompleteAddress.random()); for (const address of addresses) { - await addressDataProvider.addCompleteAddress(address); + await addressStore.addCompleteAddress(address); } - const result = await addressDataProvider.getCompleteAddress(addresses[3].address); + const result = await addressStore.getCompleteAddress(addresses[3].address); expect(result).toEqual(addresses[3]); }); it("returns an empty array if it doesn't have addresses", async () => { - expect(await addressDataProvider.getCompleteAddresses()).toEqual([]); + expect(await addressStore.getCompleteAddresses()).toEqual([]); }); it("returns undefined if it doesn't have an address", async () => { const completeAddress = await CompleteAddress.random(); - expect(await addressDataProvider.getCompleteAddress(completeAddress.address)).toBeUndefined(); + expect(await addressStore.getCompleteAddress(completeAddress.address)).toBeUndefined(); }); }); diff --git a/yarn-project/pxe/src/storage/address_data_provider/address_data_provider.ts b/yarn-project/pxe/src/storage/address_store/address_store.ts similarity index 98% rename from yarn-project/pxe/src/storage/address_data_provider/address_data_provider.ts rename to yarn-project/pxe/src/storage/address_store/address_store.ts index 4dc62a8d12da..9af5ffdbde36 100644 --- a/yarn-project/pxe/src/storage/address_data_provider/address_data_provider.ts +++ b/yarn-project/pxe/src/storage/address_store/address_store.ts @@ -3,7 +3,7 @@ import type { AztecAsyncArray, AztecAsyncKVStore, AztecAsyncMap } from '@aztec/k import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import { CompleteAddress } from '@aztec/stdlib/contract'; -export class AddressDataProvider { +export class AddressStore { #store: AztecAsyncKVStore; #completeAddresses: AztecAsyncArray; #completeAddressIndex: AztecAsyncMap; diff --git a/yarn-project/pxe/src/storage/address_store/index.ts b/yarn-project/pxe/src/storage/address_store/index.ts new file mode 100644 index 000000000000..ae3ee2ca388b --- /dev/null +++ b/yarn-project/pxe/src/storage/address_store/index.ts @@ -0,0 +1 @@ +export { AddressStore } from './address_store.js'; diff --git a/yarn-project/pxe/src/storage/anchor_block_data_provider/index.ts b/yarn-project/pxe/src/storage/anchor_block_data_provider/index.ts deleted file mode 100644 index 6c359b0e8221..000000000000 --- a/yarn-project/pxe/src/storage/anchor_block_data_provider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AnchorBlockDataProvider } from './anchor_block_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.test.ts b/yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.test.ts similarity index 55% rename from yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.test.ts rename to yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.test.ts index 3038a91cf1ff..07d36e3d2bd1 100644 --- a/yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.test.ts @@ -4,24 +4,24 @@ import { randomInt } from '@aztec/foundation/crypto/random'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { makeBlockHeader } from '@aztec/stdlib/testing'; -import { AnchorBlockDataProvider } from './anchor_block_data_provider.js'; +import { AnchorBlockStore } from './anchor_block_store.js'; describe('block header', () => { - let anchorBlockDataProvider: AnchorBlockDataProvider; + let anchorBlockStore: AnchorBlockStore; beforeEach(async () => { - const store = await openTmpStore('sync_data_provider_test'); - anchorBlockDataProvider = new AnchorBlockDataProvider(store); + const store = await openTmpStore('sync_store_test'); + anchorBlockStore = new AnchorBlockStore(store); }); it('stores and retrieves the block header', async () => { const header = makeBlockHeader(randomInt(1000), { blockNumber: BlockNumber(INITIAL_L2_BLOCK_NUM) }); - await anchorBlockDataProvider.setHeader(header); - await expect(anchorBlockDataProvider.getBlockHeader()).resolves.toEqual(header); + await anchorBlockStore.setHeader(header); + await expect(anchorBlockStore.getBlockHeader()).resolves.toEqual(header); }); it('rejects getting header if no block set', async () => { - await expect(() => anchorBlockDataProvider.getBlockHeader()).rejects.toThrow(); + await expect(() => anchorBlockStore.getBlockHeader()).rejects.toThrow(); }); }); diff --git a/yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.ts b/yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.ts similarity index 95% rename from yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.ts rename to yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.ts index 88f8f1d1c220..7112b1fd6785 100644 --- a/yarn-project/pxe/src/storage/anchor_block_data_provider/anchor_block_data_provider.ts +++ b/yarn-project/pxe/src/storage/anchor_block_store/anchor_block_store.ts @@ -1,7 +1,7 @@ import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store'; import { BlockHeader } from '@aztec/stdlib/tx'; -export class AnchorBlockDataProvider { +export class AnchorBlockStore { #store: AztecAsyncKVStore; #synchronizedHeader: AztecAsyncSingleton; diff --git a/yarn-project/pxe/src/storage/anchor_block_store/index.ts b/yarn-project/pxe/src/storage/anchor_block_store/index.ts new file mode 100644 index 000000000000..11ab310f87cc --- /dev/null +++ b/yarn-project/pxe/src/storage/anchor_block_store/index.ts @@ -0,0 +1 @@ +export { AnchorBlockStore } from './anchor_block_store.js'; diff --git a/yarn-project/pxe/src/storage/capsule_data_provider/index.ts b/yarn-project/pxe/src/storage/capsule_data_provider/index.ts deleted file mode 100644 index 69397935116c..000000000000 --- a/yarn-project/pxe/src/storage/capsule_data_provider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CapsuleDataProvider } from './capsule_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.test.ts b/yarn-project/pxe/src/storage/capsule_store/capsule_store.test.ts similarity index 51% rename from yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.test.ts rename to yarn-project/pxe/src/storage/capsule_store/capsule_store.test.ts index 9e5d33eeb195..848c27d25e37 100644 --- a/yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/capsule_store/capsule_store.test.ts @@ -4,18 +4,18 @@ import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { CapsuleDataProvider } from './capsule_data_provider.js'; +import { CapsuleStore } from './capsule_store.js'; describe('capsule data provider', () => { let contract: AztecAddress; - let capsuleDataProvider: CapsuleDataProvider; + let capsuleStore: CapsuleStore; beforeEach(async () => { // Setup mock contract address contract = await AztecAddress.random(); // Setup data provider - const store = await openTmpStore('capsule_data_provider_test'); - capsuleDataProvider = new CapsuleDataProvider(store); + const store = await openTmpStore('capsule_store_test'); + capsuleStore = new CapsuleStore(store); }); describe('store and load', () => { @@ -23,8 +23,8 @@ describe('capsule data provider', () => { const slot = new Fr(1); const values = [new Fr(42)]; - await capsuleDataProvider.storeCapsule(contract, slot, values); - const result = await capsuleDataProvider.loadCapsule(contract, slot); + await capsuleStore.storeCapsule(contract, slot, values); + const result = await capsuleStore.loadCapsule(contract, slot); expect(result).toEqual(values); }); @@ -32,8 +32,8 @@ describe('capsule data provider', () => { const slot = new Fr(1); const values = [new Fr(42), new Fr(43), new Fr(44)]; - await capsuleDataProvider.storeCapsule(contract, slot, values); - const result = await capsuleDataProvider.loadCapsule(contract, slot); + await capsuleStore.storeCapsule(contract, slot, values); + const result = await capsuleStore.loadCapsule(contract, slot); expect(result).toEqual(values); }); @@ -42,10 +42,10 @@ describe('capsule data provider', () => { const initialValues = [new Fr(42)]; const newValues = [new Fr(100)]; - await capsuleDataProvider.storeCapsule(contract, slot, initialValues); - await capsuleDataProvider.storeCapsule(contract, slot, newValues); + await capsuleStore.storeCapsule(contract, slot, initialValues); + await capsuleStore.storeCapsule(contract, slot, newValues); - const result = await capsuleDataProvider.loadCapsule(contract, slot); + const result = await capsuleStore.loadCapsule(contract, slot); expect(result).toEqual(newValues); }); @@ -55,11 +55,11 @@ describe('capsule data provider', () => { const values1 = [new Fr(42)]; const values2 = [new Fr(100)]; - await capsuleDataProvider.storeCapsule(contract, slot, values1); - await capsuleDataProvider.storeCapsule(anotherContract, slot, values2); + await capsuleStore.storeCapsule(contract, slot, values1); + await capsuleStore.storeCapsule(anotherContract, slot, values2); - const result1 = await capsuleDataProvider.loadCapsule(contract, slot); - const result2 = await capsuleDataProvider.loadCapsule(anotherContract, slot); + const result1 = await capsuleStore.loadCapsule(contract, slot); + const result2 = await capsuleStore.loadCapsule(anotherContract, slot); expect(result1).toEqual(values1); expect(result2).toEqual(values2); @@ -67,7 +67,7 @@ describe('capsule data provider', () => { it('returns null for non-existent slots', async () => { const slot = Fr.random(); - const result = await capsuleDataProvider.loadCapsule(contract, slot); + const result = await capsuleStore.loadCapsule(contract, slot); expect(result).toBeNull(); }); }); @@ -77,17 +77,17 @@ describe('capsule data provider', () => { const slot = new Fr(1); const values = [new Fr(42)]; - await capsuleDataProvider.storeCapsule(contract, slot, values); - await capsuleDataProvider.deleteCapsule(contract, slot); + await capsuleStore.storeCapsule(contract, slot, values); + await capsuleStore.deleteCapsule(contract, slot); - expect(await capsuleDataProvider.loadCapsule(contract, slot)).toBeNull(); + expect(await capsuleStore.loadCapsule(contract, slot)).toBeNull(); }); it('deletes an empty slot', async () => { const slot = new Fr(1); - await capsuleDataProvider.deleteCapsule(contract, slot); + await capsuleStore.deleteCapsule(contract, slot); - expect(await capsuleDataProvider.loadCapsule(contract, slot)).toBeNull(); + expect(await capsuleStore.loadCapsule(contract, slot)).toBeNull(); }); }); @@ -96,84 +96,82 @@ describe('capsule data provider', () => { const slot = new Fr(1); const values = [new Fr(42)]; - await capsuleDataProvider.storeCapsule(contract, slot, values); + await capsuleStore.storeCapsule(contract, slot, values); const dstSlot = new Fr(5); - await capsuleDataProvider.copyCapsule(contract, slot, dstSlot, 1); + await capsuleStore.copyCapsule(contract, slot, dstSlot, 1); - expect(await capsuleDataProvider.loadCapsule(contract, dstSlot)).toEqual(values); + expect(await capsuleStore.loadCapsule(contract, dstSlot)).toEqual(values); }); it('copies multiple non-overlapping values', async () => { const src = new Fr(1); const valuesArray = [[new Fr(42)], [new Fr(1337)], [new Fr(13)]]; - await capsuleDataProvider.storeCapsule(contract, src, valuesArray[0]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); + await capsuleStore.storeCapsule(contract, src, valuesArray[0]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); const dst = new Fr(5); - await capsuleDataProvider.copyCapsule(contract, src, dst, 3); + await capsuleStore.copyCapsule(contract, src, dst, 3); - expect(await capsuleDataProvider.loadCapsule(contract, dst)).toEqual(valuesArray[0]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); + expect(await capsuleStore.loadCapsule(contract, dst)).toEqual(valuesArray[0]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); }); it('copies overlapping values with src ahead', async () => { const src = new Fr(1); const valuesArray = [[new Fr(42)], [new Fr(1337)], [new Fr(13)]]; - await capsuleDataProvider.storeCapsule(contract, src, valuesArray[0]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); + await capsuleStore.storeCapsule(contract, src, valuesArray[0]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); const dst = new Fr(2); - await capsuleDataProvider.copyCapsule(contract, src, dst, 3); + await capsuleStore.copyCapsule(contract, src, dst, 3); - expect(await capsuleDataProvider.loadCapsule(contract, dst)).toEqual(valuesArray[0]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); + expect(await capsuleStore.loadCapsule(contract, dst)).toEqual(valuesArray[0]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); // Slots 2 and 3 (src[1] and src[2]) should have been overwritten since they are also dst[0] and dst[1] - expect(await capsuleDataProvider.loadCapsule(contract, src)).toEqual(valuesArray[0]); // src[0] (unchanged) - expect(await capsuleDataProvider.loadCapsule(contract, src.add(new Fr(1)))).toEqual(valuesArray[0]); // dst[0] - expect(await capsuleDataProvider.loadCapsule(contract, src.add(new Fr(2)))).toEqual(valuesArray[1]); // dst[1] + expect(await capsuleStore.loadCapsule(contract, src)).toEqual(valuesArray[0]); // src[0] (unchanged) + expect(await capsuleStore.loadCapsule(contract, src.add(new Fr(1)))).toEqual(valuesArray[0]); // dst[0] + expect(await capsuleStore.loadCapsule(contract, src.add(new Fr(2)))).toEqual(valuesArray[1]); // dst[1] }); it('copies overlapping values with dst ahead', async () => { const src = new Fr(5); const valuesArray = [[new Fr(42)], [new Fr(1337)], [new Fr(13)]]; - await capsuleDataProvider.storeCapsule(contract, src, valuesArray[0]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); + await capsuleStore.storeCapsule(contract, src, valuesArray[0]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(1)), valuesArray[1]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); const dst = new Fr(4); - await capsuleDataProvider.copyCapsule(contract, src, dst, 3); + await capsuleStore.copyCapsule(contract, src, dst, 3); - expect(await capsuleDataProvider.loadCapsule(contract, dst)).toEqual(valuesArray[0]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); - expect(await capsuleDataProvider.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); + expect(await capsuleStore.loadCapsule(contract, dst)).toEqual(valuesArray[0]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(1)))).toEqual(valuesArray[1]); + expect(await capsuleStore.loadCapsule(contract, dst.add(new Fr(2)))).toEqual(valuesArray[2]); // Slots 5 and 6 (src[0] and src[1]) should have been overwritten since they are also dst[1] and dst[2] - expect(await capsuleDataProvider.loadCapsule(contract, src)).toEqual(valuesArray[1]); // dst[1] - expect(await capsuleDataProvider.loadCapsule(contract, src.add(new Fr(1)))).toEqual(valuesArray[2]); // dst[2] - expect(await capsuleDataProvider.loadCapsule(contract, src.add(new Fr(2)))).toEqual(valuesArray[2]); // src[2] (unchanged) + expect(await capsuleStore.loadCapsule(contract, src)).toEqual(valuesArray[1]); // dst[1] + expect(await capsuleStore.loadCapsule(contract, src.add(new Fr(1)))).toEqual(valuesArray[2]); // dst[2] + expect(await capsuleStore.loadCapsule(contract, src.add(new Fr(2)))).toEqual(valuesArray[2]); // src[2] (unchanged) }); it('copying fails if any value is empty', async () => { const src = new Fr(1); const valuesArray = [[new Fr(42)], [new Fr(1337)], [new Fr(13)]]; - await capsuleDataProvider.storeCapsule(contract, src, valuesArray[0]); + await capsuleStore.storeCapsule(contract, src, valuesArray[0]); // We skip src[1] - await capsuleDataProvider.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); + await capsuleStore.storeCapsule(contract, src.add(new Fr(2)), valuesArray[2]); const dst = new Fr(5); - await expect(capsuleDataProvider.copyCapsule(contract, src, dst, 3)).rejects.toThrow( - 'Attempted to copy empty slot', - ); + await expect(capsuleStore.copyCapsule(contract, src, dst, 3)).rejects.toThrow('Attempted to copy empty slot'); }); }); @@ -183,11 +181,11 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const array = range(4).map(x => [new Fr(x)]); - await capsuleDataProvider.appendToCapsuleArray(contract, baseSlot, array); + await capsuleStore.appendToCapsuleArray(contract, baseSlot, array); - expect(await capsuleDataProvider.loadCapsule(contract, baseSlot)).toEqual([new Fr(array.length)]); + expect(await capsuleStore.loadCapsule(contract, baseSlot)).toEqual([new Fr(array.length)]); for (const i of range(array.length)) { - expect(await capsuleDataProvider.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toEqual(array[i]); + expect(await capsuleStore.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toEqual(array[i]); } }); @@ -195,16 +193,16 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const originalArray = range(4).map(x => [new Fr(x)]); - await capsuleDataProvider.appendToCapsuleArray(contract, baseSlot, originalArray); + await capsuleStore.appendToCapsuleArray(contract, baseSlot, originalArray); const newElements = [[new Fr(13)], [new Fr(42)]]; - await capsuleDataProvider.appendToCapsuleArray(contract, baseSlot, newElements); + await capsuleStore.appendToCapsuleArray(contract, baseSlot, newElements); const expectedLength = originalArray.length + newElements.length; - expect(await capsuleDataProvider.loadCapsule(contract, baseSlot)).toEqual([new Fr(expectedLength)]); + expect(await capsuleStore.loadCapsule(contract, baseSlot)).toEqual([new Fr(expectedLength)]); for (const i of range(expectedLength)) { - expect(await capsuleDataProvider.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toEqual( + expect(await capsuleStore.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toEqual( [...originalArray, ...newElements][i], ); } @@ -214,7 +212,7 @@ describe('capsule data provider', () => { describe('readCapsuleArray', () => { it('reads an empty array', async () => { const baseSlot = new Fr(3); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual([]); }); @@ -222,9 +220,9 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const storedArray = range(4).map(x => [new Fr(x)]); - await capsuleDataProvider.appendToCapsuleArray(contract, baseSlot, storedArray); + await capsuleStore.appendToCapsuleArray(contract, baseSlot, storedArray); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual(storedArray); }); @@ -232,12 +230,10 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); // Store in the base slot a non-zero value, indicating a non-zero array length - await capsuleDataProvider.storeCapsule(contract, baseSlot, [new Fr(1)]); + await capsuleStore.storeCapsule(contract, baseSlot, [new Fr(1)]); // Reading should now fail as some of the capsules in the array are empty - await expect(capsuleDataProvider.readCapsuleArray(contract, baseSlot)).rejects.toThrow( - 'Expected non-empty value', - ); + await expect(capsuleStore.readCapsuleArray(contract, baseSlot)).rejects.toThrow('Expected non-empty value'); }); }); @@ -246,9 +242,9 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const newArray = range(4).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, newArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, newArray); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual(newArray); }); @@ -256,12 +252,12 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const originalArray = range(4, 0).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, originalArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, originalArray); const newArray = range(10, 10).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, newArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, newArray); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual(newArray); }); @@ -269,19 +265,17 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const originalArray = range(10, 0).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, originalArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, originalArray); const newArray = range(4, 10).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, newArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, newArray); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual(newArray); // Not only do we read the expected array, but also all capsules past the new array length have been cleared for (const i of range(originalArray.length - newArray.length)) { - expect( - await capsuleDataProvider.loadCapsule(contract, baseSlot.add(new Fr(1 + newArray.length + i))), - ).toBeNull(); + expect(await capsuleStore.loadCapsule(contract, baseSlot.add(new Fr(1 + newArray.length + i)))).toBeNull(); } }); @@ -289,16 +283,16 @@ describe('capsule data provider', () => { const baseSlot = new Fr(3); const originalArray = range(10, 0).map(x => [new Fr(x)]); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, originalArray); + await capsuleStore.setCapsuleArray(contract, baseSlot, originalArray); - await capsuleDataProvider.setCapsuleArray(contract, baseSlot, []); + await capsuleStore.setCapsuleArray(contract, baseSlot, []); - const retrievedArray = await capsuleDataProvider.readCapsuleArray(contract, baseSlot); + const retrievedArray = await capsuleStore.readCapsuleArray(contract, baseSlot); expect(retrievedArray).toEqual([]); // All capsules from the original array have been cleared for (const i of range(originalArray.length)) { - expect(await capsuleDataProvider.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toBeNull(); + expect(await capsuleStore.loadCapsule(contract, baseSlot.add(new Fr(1 + i)))).toBeNull(); } }); }); @@ -321,7 +315,7 @@ describe('capsule data provider', () => { it( 'create large array by appending', async () => { - await capsuleDataProvider.appendToCapsuleArray( + await capsuleStore.appendToCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), @@ -333,7 +327,7 @@ describe('capsule data provider', () => { it( 'create large array by resetting', async () => { - await capsuleDataProvider.setCapsuleArray( + await capsuleStore.setCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), @@ -345,14 +339,14 @@ describe('capsule data provider', () => { it( 'append to large array', async () => { - await capsuleDataProvider.appendToCapsuleArray( + await capsuleStore.appendToCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), ); // Append a single element - await capsuleDataProvider.appendToCapsuleArray(contract, new Fr(0), [range(ARRAY_LENGTH).map(x => new Fr(x))]); + await capsuleStore.appendToCapsuleArray(contract, new Fr(0), [range(ARRAY_LENGTH).map(x => new Fr(x))]); }, TEST_TIMEOUT_MS, ); @@ -360,14 +354,14 @@ describe('capsule data provider', () => { it( 'copy large number of elements', async () => { - await capsuleDataProvider.appendToCapsuleArray( + await capsuleStore.appendToCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), ); // We just move the entire thing one slot. - await capsuleDataProvider.copyCapsule(contract, new Fr(0), new Fr(1), NUMBER_OF_ITEMS); + await capsuleStore.copyCapsule(contract, new Fr(0), new Fr(1), NUMBER_OF_ITEMS); }, TEST_TIMEOUT_MS, ); @@ -375,13 +369,13 @@ describe('capsule data provider', () => { it( 'read a large array', async () => { - await capsuleDataProvider.appendToCapsuleArray( + await capsuleStore.appendToCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), ); - await capsuleDataProvider.readCapsuleArray(contract, new Fr(0)); + await capsuleStore.readCapsuleArray(contract, new Fr(0)); }, TEST_TIMEOUT_MS, ); @@ -389,13 +383,13 @@ describe('capsule data provider', () => { it( 'clear a large array', async () => { - await capsuleDataProvider.appendToCapsuleArray( + await capsuleStore.appendToCapsuleArray( contract, new Fr(0), times(NUMBER_OF_ITEMS, () => range(ARRAY_LENGTH).map(x => new Fr(x))), ); - await capsuleDataProvider.setCapsuleArray(contract, new Fr(0), []); + await capsuleStore.setCapsuleArray(contract, new Fr(0), []); }, TEST_TIMEOUT_MS, ); diff --git a/yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.ts b/yarn-project/pxe/src/storage/capsule_store/capsule_store.ts similarity index 99% rename from yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.ts rename to yarn-project/pxe/src/storage/capsule_store/capsule_store.ts index ce1c42fe726f..ac39dc88dafb 100644 --- a/yarn-project/pxe/src/storage/capsule_data_provider/capsule_data_provider.ts +++ b/yarn-project/pxe/src/storage/capsule_store/capsule_store.ts @@ -3,7 +3,7 @@ import { type Logger, createLogger } from '@aztec/foundation/log'; import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; -export class CapsuleDataProvider { +export class CapsuleStore { #store: AztecAsyncKVStore; // Arbitrary data stored by contracts. Key is computed as `${contractAddress}:${key}` diff --git a/yarn-project/pxe/src/storage/capsule_store/index.ts b/yarn-project/pxe/src/storage/capsule_store/index.ts new file mode 100644 index 000000000000..accfb15afdc9 --- /dev/null +++ b/yarn-project/pxe/src/storage/capsule_store/index.ts @@ -0,0 +1 @@ +export { CapsuleStore } from './capsule_store.js'; diff --git a/yarn-project/pxe/src/storage/contract_data_provider/index.ts b/yarn-project/pxe/src/storage/contract_data_provider/index.ts deleted file mode 100644 index 2f61d1032720..000000000000 --- a/yarn-project/pxe/src/storage/contract_data_provider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { ContractDataProvider } from './contract_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.test.ts b/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts similarity index 64% rename from yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.test.ts rename to yarn-project/pxe/src/storage/contract_store/contract_store.test.ts index 9355ae079070..49034ac58a75 100644 --- a/yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts @@ -6,21 +6,21 @@ import { FunctionType } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { SerializableContractInstance } from '@aztec/stdlib/contract'; -import { ContractDataProvider } from './contract_data_provider.js'; +import { ContractStore } from './contract_store.js'; -describe('ContractDataProvider', () => { - let contractDataProvider: ContractDataProvider; +describe('ContractStore', () => { + let contractStore: ContractStore; beforeEach(async () => { - const store = await openTmpStore('contract_data_provider_test'); - contractDataProvider = new ContractDataProvider(store); + const store = await openTmpStore('contract_store_test'); + contractStore = new ContractStore(store); }); it('stores a contract artifact', async () => { const artifact = BenchmarkingContractArtifact; const id = Fr.random(); - await contractDataProvider.addContractArtifact(id, artifact); - await expect(contractDataProvider.getContractArtifact(id)).resolves.toEqual(artifact); + await contractStore.addContractArtifact(id, artifact); + await expect(contractStore.getContractArtifact(id)).resolves.toEqual(artifact); }); it('does not store a contract artifact with a duplicate private function selector', async () => { @@ -31,7 +31,7 @@ describe('ContractDataProvider', () => { artifact.functions.push(copiedFn); const id = Fr.random(); - await expect(contractDataProvider.addContractArtifact(id, artifact)).rejects.toThrow( + await expect(contractStore.addContractArtifact(id, artifact)).rejects.toThrow( 'Repeated function selectors of private functions', ); }); @@ -39,7 +39,7 @@ describe('ContractDataProvider', () => { it('stores a contract instance', async () => { const address = await AztecAddress.random(); const instance = (await SerializableContractInstance.random()).withAddress(address); - await contractDataProvider.addContractInstance(instance); - await expect(contractDataProvider.getContractInstance(address)).resolves.toEqual(instance); + await contractStore.addContractInstance(instance); + await expect(contractStore.getContractInstance(address)).resolves.toEqual(instance); }); }); diff --git a/yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.ts b/yarn-project/pxe/src/storage/contract_store/contract_store.ts similarity index 99% rename from yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.ts rename to yarn-project/pxe/src/storage/contract_store/contract_store.ts index 225625afe729..1f70d2d8c455 100644 --- a/yarn-project/pxe/src/storage/contract_data_provider/contract_data_provider.ts +++ b/yarn-project/pxe/src/storage/contract_store/contract_store.ts @@ -28,13 +28,13 @@ import { import { PrivateFunctionsTree } from './private_functions_tree.js'; /** - * ContractDataProvider serves as a data manager and retriever for Aztec.nr contracts. + * ContractStore serves as a data manager and retriever for Aztec.nr contracts. * It provides methods to obtain contract addresses, function ABI, bytecode, and membership witnesses * from a given contract address and function selector. The class maintains a cache of ContractTree instances * to efficiently serve the requested data. It interacts with the ContractDatabase and AztecNode to fetch * the required information and facilitate cryptographic proof generation. */ -export class ContractDataProvider { +export class ContractStore { /** Map from contract class id to private function tree. */ // TODO: Update it to be LRU cache so that it doesn't keep all the data all the time. #privateFunctionTrees: Map = new Map(); diff --git a/yarn-project/pxe/src/storage/contract_store/index.ts b/yarn-project/pxe/src/storage/contract_store/index.ts new file mode 100644 index 000000000000..2f77a2f966b2 --- /dev/null +++ b/yarn-project/pxe/src/storage/contract_store/index.ts @@ -0,0 +1 @@ +export { ContractStore } from './contract_store.js'; diff --git a/yarn-project/pxe/src/storage/contract_data_provider/private_functions_tree.ts b/yarn-project/pxe/src/storage/contract_store/private_functions_tree.ts similarity index 100% rename from yarn-project/pxe/src/storage/contract_data_provider/private_functions_tree.ts rename to yarn-project/pxe/src/storage/contract_store/private_functions_tree.ts diff --git a/yarn-project/pxe/src/storage/index.ts b/yarn-project/pxe/src/storage/index.ts index 8f8413720d12..e00f871ad7a3 100644 --- a/yarn-project/pxe/src/storage/index.ts +++ b/yarn-project/pxe/src/storage/index.ts @@ -1,8 +1,8 @@ -export * from './address_data_provider/index.js'; -export * from './capsule_data_provider/index.js'; -export * from './contract_data_provider/index.js'; -export * from './note_data_provider/index.js'; -export * from './anchor_block_data_provider/index.js'; -export * from './tagging_data_provider/index.js'; +export * from './address_store/index.js'; +export * from './capsule_store/index.js'; +export * from './contract_store/index.js'; +export * from './note_store/index.js'; +export * from './anchor_block_store/index.js'; +export * from './tagging_store/index.js'; export * from './metadata.js'; -export * from './private_event_data_provider/private_event_data_provider.js'; +export * from './private_event_store/private_event_store.js'; diff --git a/yarn-project/pxe/src/storage/note_data_provider/index.ts b/yarn-project/pxe/src/storage/note_data_provider/index.ts deleted file mode 100644 index 4e05ad056c10..000000000000 --- a/yarn-project/pxe/src/storage/note_data_provider/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { NoteDao } from '@aztec/stdlib/note'; -export { NoteDataProvider } from './note_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/note_store/index.ts b/yarn-project/pxe/src/storage/note_store/index.ts new file mode 100644 index 000000000000..a3c2b770b4d0 --- /dev/null +++ b/yarn-project/pxe/src/storage/note_store/index.ts @@ -0,0 +1,2 @@ +export { NoteDao } from '@aztec/stdlib/note'; +export { NoteStore } from './note_store.js'; diff --git a/yarn-project/pxe/src/storage/note_data_provider/note_data_provider.test.ts b/yarn-project/pxe/src/storage/note_store/note_store.test.ts similarity index 94% rename from yarn-project/pxe/src/storage/note_data_provider/note_data_provider.test.ts rename to yarn-project/pxe/src/storage/note_store/note_store.test.ts index 77f31d828ece..112e2bcb76e9 100644 --- a/yarn-project/pxe/src/storage/note_data_provider/note_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/note_store/note_store.test.ts @@ -5,7 +5,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { L2BlockHash } from '@aztec/stdlib/block'; import { NoteDao, NoteStatus } from '@aztec/stdlib/note'; -import { NoteDataProvider } from './note_data_provider.js'; +import { NoteStore } from './note_store.js'; // ----------------------------------------------------------------------------- // Shared constants for deterministic fixtures @@ -35,7 +35,7 @@ const DUMMY_SILOED_NULLIFIER_3 = new Fr(3n); // // ─────────────────────────────────────────────────────────────────────────── -describe('NoteDataProvider', () => { +describe('NoteStore', () => { // Helper to create a deterministic note with sensible defaults, override any field as needed. function mkNote(overrides: Partial = {}) { return NoteDao.random({ @@ -48,10 +48,10 @@ describe('NoteDataProvider', () => { }); } - // Sets up a fresh NoteDataProvider with two scopes and three notes. + // Sets up a fresh NoteStore with two scopes and three notes. async function setupProviderWithNotes(storeName: string) { const store = await openTmpStore(storeName); - const provider = await NoteDataProvider.create(store); + const provider = await NoteStore.create(store); await provider.addScope(SCOPE_1); await provider.addScope(SCOPE_2); @@ -96,10 +96,10 @@ describe('NoteDataProvider', () => { } // In these tests, we verify the presence/absence of notes by their `index`. - describe('NoteDataProvider.create', () => { + describe('NoteStore.create', () => { it('creates provider on an empty store and confirms getNotes returns an empty array', async () => { - const store = await openTmpStore('note_data_provider_fresh_store'); - const provider = await NoteDataProvider.create(store); + const store = await openTmpStore('note_store_fresh_store'); + const provider = await NoteStore.create(store); const res = await provider.getNotes({ contractAddress: CONTRACT_A }); expect(Array.isArray(res)).toBe(true); @@ -109,10 +109,10 @@ describe('NoteDataProvider', () => { }); it('re-initializes from an existing store and restores previously added notes', async () => { - const store = await openTmpStore('note_data_provider_re-init_test'); + const store = await openTmpStore('note_store_re-init_test'); // First provider populates the store; second reopens it to verify persistence - const provider1 = await NoteDataProvider.create(store); + const provider1 = await NoteStore.create(store); await provider1.addScope(SCOPE_1); await provider1.addScope(SCOPE_2); @@ -121,7 +121,7 @@ describe('NoteDataProvider', () => { const noteB = await mkNote({ contractAddress: CONTRACT_B, index: 2n }); await provider1.addNotes([noteA, noteB], FAKE_ADDRESS); - const provider2 = await NoteDataProvider.create(store); + const provider2 = await NoteStore.create(store); const notesA = await provider2.getNotes({ contractAddress: CONTRACT_A }); const notesB = await provider2.getNotes({ contractAddress: CONTRACT_B }); @@ -133,15 +133,15 @@ describe('NoteDataProvider', () => { }); }); - describe('NoteDataProvider.getNotes filtering happy path', () => { + describe('NoteStore.getNotes filtering happy path', () => { let store: AztecLMDBStoreV2; - let provider: NoteDataProvider; + let provider: NoteStore; let note1: NoteDao; let note2: NoteDao; let note3: NoteDao; beforeEach(async () => { - ({ store, provider, note1, note2, note3 } = await setupProviderWithNotes('note_data_provider_get_notes_happy')); + ({ store, provider, note1, note2, note3 } = await setupProviderWithNotes('note_store_get_notes_happy')); }); afterEach(async () => { @@ -260,13 +260,13 @@ describe('NoteDataProvider', () => { }); }); - describe('NoteDataProvider.getNotes filtering edge cases', () => { + describe('NoteStore.getNotes filtering edge cases', () => { let store: AztecLMDBStoreV2; - let provider: NoteDataProvider; + let provider: NoteStore; let note2: NoteDao; beforeEach(async () => { - ({ store, provider, note2 } = await setupProviderWithNotes('note_data_provider_get_notes_edge')); + ({ store, provider, note2 } = await setupProviderWithNotes('note_store_get_notes_edge')); }); afterEach(async () => { @@ -321,17 +321,15 @@ describe('NoteDataProvider', () => { }); }); - describe('NoteDataProvider.applyNullifiers happy path', () => { + describe('NoteStore.applyNullifiers happy path', () => { let store: AztecLMDBStoreV2; - let provider: NoteDataProvider; + let provider: NoteStore; let note1: NoteDao; let note2: NoteDao; let note3: NoteDao; beforeEach(async () => { - ({ store, provider, note1, note2, note3 } = await setupProviderWithNotes( - 'note_data_provider_apply_nullifiers_happy', - )); + ({ store, provider, note1, note2, note3 } = await setupProviderWithNotes('note_store_apply_nullifiers_happy')); }); afterEach(async () => { @@ -383,14 +381,14 @@ describe('NoteDataProvider', () => { }); }); - describe('NoteDataProvider.applyNullifiers edge cases', () => { + describe('NoteStore.applyNullifiers edge cases', () => { let store: AztecLMDBStoreV2; - let provider: NoteDataProvider; + let provider: NoteStore; let note1: NoteDao; let note2: NoteDao; beforeEach(async () => { - ({ store, provider, note1, note2 } = await setupProviderWithNotes('note_data_provider_apply_nullifiers_edge')); + ({ store, provider, note1, note2 } = await setupProviderWithNotes('note_store_apply_nullifiers_edge')); }); afterEach(async () => { @@ -490,13 +488,13 @@ describe('NoteDataProvider', () => { }); }); - describe('NoteDataProvider.rollbackNotesAndNullifiers', () => { - let provider: NoteDataProvider; + describe('NoteStore.rollbackNotesAndNullifiers', () => { + let provider: NoteStore; let store: AztecLMDBStoreV2; beforeEach(async () => { - store = await openTmpStore('note_data_provider_rollback_test'); - provider = await NoteDataProvider.create(store); + store = await openTmpStore('note_store_rollback_test'); + provider = await NoteStore.create(store); await provider.addScope(SCOPE_1); await provider.addScope(SCOPE_2); }); diff --git a/yarn-project/pxe/src/storage/note_data_provider/note_data_provider.ts b/yarn-project/pxe/src/storage/note_store/note_store.ts similarity index 97% rename from yarn-project/pxe/src/storage/note_data_provider/note_data_provider.ts rename to yarn-project/pxe/src/storage/note_store/note_store.ts index fded9b671aa7..11825b20cbb1 100644 --- a/yarn-project/pxe/src/storage/note_data_provider/note_data_provider.ts +++ b/yarn-project/pxe/src/storage/note_store/note_store.ts @@ -8,12 +8,12 @@ import { NoteStatus, type NotesFilter } from '@aztec/stdlib/note'; import { NoteDao } from '@aztec/stdlib/note'; /** - * NoteDataProvider manages the storage and retrieval of notes. + * NoteStore manages the storage and retrieval of notes. * * Notes can be active or nullified. This class processes new notes, nullifications, * and performs rollback handling in the case of a reorg. **/ -export class NoteDataProvider { +export class NoteStore { #store: AztecAsyncKVStore; #notes: AztecAsyncMap; #nullifiedNotes: AztecAsyncMap; @@ -49,16 +49,16 @@ export class NoteDataProvider { } /** - * Creates and initializes a new NoteDataProvider instance. + * Creates and initializes a new NoteStore instance. * - * This factory method creates a NoteDataProvider and restores any existing + * This factory method creates a NoteStore and restores any existing * scope-specific indexes from the database. * * @param store - The key-value store to use for persistence - * @returns Promise resolving to a fully initialized NoteDataProvider instance + * @returns Promise resolving to a fully initialized NoteStore instance */ - public static async create(store: AztecAsyncKVStore): Promise { - const pxeDB = new NoteDataProvider(store); + public static async create(store: AztecAsyncKVStore): Promise { + const pxeDB = new NoteStore(store); for await (const scope of pxeDB.#scopes.keysAsync()) { pxeDB.#notesByContractAndScope.set(scope, store.openMultiMap(`${scope}:notes_by_contract`)); pxeDB.#notesByStorageSlotAndScope.set(scope, store.openMultiMap(`${scope}:notes_by_storage_slot`)); diff --git a/yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.test.ts b/yarn-project/pxe/src/storage/private_event_store/private_event_store.test.ts similarity index 70% rename from yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.test.ts rename to yarn-project/pxe/src/storage/private_event_store/private_event_store.test.ts index 4ff7bbd209cf..2b3e75b3fcf1 100644 --- a/yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/private_event_store/private_event_store.test.ts @@ -8,14 +8,14 @@ import { L2BlockHash } from '@aztec/stdlib/block'; import { TxHash } from '@aztec/stdlib/tx'; import type { PackedPrivateEvent } from '../../pxe.js'; -import { PrivateEventDataProvider } from './private_event_data_provider.js'; +import { PrivateEventStore } from './private_event_store.js'; const getRandomMsgContent = () => { return [Fr.random(), Fr.random(), Fr.random()]; }; -describe('PrivateEventDataProvider', () => { - let privateEventDataProvider: PrivateEventDataProvider; +describe('PrivateEventStore', () => { + let privateEventStore: PrivateEventStore; let contractAddress: AztecAddress; let scope: AztecAddress; let msgContent: Fr[]; @@ -27,8 +27,8 @@ describe('PrivateEventDataProvider', () => { let expectedEvent: PackedPrivateEvent; beforeEach(async () => { - const store = await openTmpStore('private_event_data_provider_test'); - privateEventDataProvider = new PrivateEventDataProvider(store); + const store = await openTmpStore('private_event_store_test'); + privateEventStore = new PrivateEventStore(store); contractAddress = await AztecAddress.random(); scope = await AztecAddress.random(); msgContent = getRandomMsgContent(); @@ -48,14 +48,14 @@ describe('PrivateEventDataProvider', () => { }); it('stores and retrieves private events', async () => { - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { contractAddress, scope, txHash, l2BlockNumber, l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: l2BlockNumber, toBlock: l2BlockNumber + 1, @@ -65,7 +65,7 @@ describe('PrivateEventDataProvider', () => { }); it('ignores duplicate events with same eventCommitmentIndex', async () => { - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { contractAddress, scope, txHash, @@ -73,7 +73,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: l2BlockNumber, toBlock: l2BlockNumber + 1, @@ -86,14 +86,14 @@ describe('PrivateEventDataProvider', () => { it('allows multiple events with same content but different eventCommitmentIndex', async () => { const otherEventCommitmentIndex = eventCommitmentIndex + 1; - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { contractAddress, scope, txHash, l2BlockNumber, l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, otherEventCommitmentIndex, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, otherEventCommitmentIndex, { contractAddress, scope, txHash, @@ -101,7 +101,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: l2BlockNumber, toBlock: l2BlockNumber + 1, @@ -118,21 +118,21 @@ describe('PrivateEventDataProvider', () => { l2BlockNumber: BlockNumber(200), }; - await privateEventDataProvider.storePrivateEventLog(eventSelector, getRandomMsgContent(), 0, { + await privateEventStore.storePrivateEventLog(eventSelector, getRandomMsgContent(), 0, { contractAddress, scope, txHash: TxHash.random(), l2BlockNumber: BlockNumber(100), l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, 1, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, 1, { contractAddress, scope, txHash: expectedEvent.txHash, l2BlockNumber: expectedEvent.l2BlockNumber, l2BlockHash: expectedEvent.l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, getRandomMsgContent(), 2, { + await privateEventStore.storePrivateEventLog(eventSelector, getRandomMsgContent(), 2, { contractAddress, scope, txHash: TxHash.random(), @@ -140,7 +140,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: 150, toBlock: 150 + 100, @@ -153,14 +153,14 @@ describe('PrivateEventDataProvider', () => { it('filters events by recipient', async () => { const otherScope = await AztecAddress.random(); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex, { contractAddress, scope, txHash, l2BlockNumber, l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex + 1, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent, eventCommitmentIndex + 1, { contractAddress, scope: otherScope, txHash: TxHash.random(), @@ -168,7 +168,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: l2BlockNumber, toBlock: l2BlockNumber + 1, @@ -179,7 +179,7 @@ describe('PrivateEventDataProvider', () => { }); it('returns empty array when no events match criteria', async () => { - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: l2BlockNumber, toBlock: l2BlockNumber + 1, @@ -201,7 +201,7 @@ describe('PrivateEventDataProvider', () => { }); it('returns events in order by eventCommitmentIndex', async () => { - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent2, 1, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent2, 1, { contractAddress, scope, txHash: TxHash.random(), @@ -209,7 +209,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent1, 0, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent1, 0, { contractAddress, scope, txHash: TxHash.random(), @@ -217,7 +217,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - await privateEventDataProvider.storePrivateEventLog(eventSelector, msgContent3, 2, { + await privateEventStore.storePrivateEventLog(eventSelector, msgContent3, 2, { contractAddress, scope, txHash: TxHash.random(), @@ -225,7 +225,7 @@ describe('PrivateEventDataProvider', () => { l2BlockHash, }); - const events = await privateEventDataProvider.getPrivateEvents(eventSelector, { + const events = await privateEventStore.getPrivateEvents(eventSelector, { contractAddress, fromBlock: 0, toBlock: 0 + 1000, diff --git a/yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.ts b/yarn-project/pxe/src/storage/private_event_store/private_event_store.ts similarity index 96% rename from yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.ts rename to yarn-project/pxe/src/storage/private_event_store/private_event_store.ts index 5f5d89d63ce8..1207f8389203 100644 --- a/yarn-project/pxe/src/storage/private_event_data_provider/private_event_data_provider.ts +++ b/yarn-project/pxe/src/storage/private_event_store/private_event_store.ts @@ -10,7 +10,7 @@ import { type InTx, TxHash } from '@aztec/stdlib/tx'; import type { PackedPrivateEvent } from '../../pxe.js'; -export type PrivateEventDataProviderFilter = { +export type PrivateEventStoreFilter = { contractAddress: AztecAddress; fromBlock: number; toBlock: number; @@ -34,7 +34,7 @@ type PrivateEventMetadata = InTx & { /** * Stores decrypted private event logs. */ -export class PrivateEventDataProvider { +export class PrivateEventStore { #store: AztecAsyncKVStore; /** Array storing the actual private event log entries containing the log content and block number */ #eventLogs: AztecAsyncArray; @@ -43,7 +43,7 @@ export class PrivateEventDataProvider { /** Map from eventCommitmentIndex to boolean indicating if log has been seen. */ #seenLogs: AztecAsyncMap; - logger = createLogger('private_event_data_provider'); + logger = createLogger('private_event_store'); constructor(store: AztecAsyncKVStore) { this.#store = store; @@ -117,7 +117,7 @@ export class PrivateEventDataProvider { */ public async getPrivateEvents( eventSelector: EventSelector, - filter: PrivateEventDataProviderFilter, + filter: PrivateEventStoreFilter, ): Promise { const events: Array<{ eventCommitmentIndex: number; event: PackedPrivateEvent }> = []; diff --git a/yarn-project/pxe/src/storage/tagging_data_provider/index.ts b/yarn-project/pxe/src/storage/tagging_data_provider/index.ts deleted file mode 100644 index 84f381d6ff33..000000000000 --- a/yarn-project/pxe/src/storage/tagging_data_provider/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { SenderTaggingDataProvider } from './sender_tagging_data_provider.js'; -export { SenderAddressBook } from './sender_address_book.js'; -export { RecipientTaggingDataProvider } from './recipient_tagging_data_provider.js'; diff --git a/yarn-project/pxe/src/storage/tagging_store/index.ts b/yarn-project/pxe/src/storage/tagging_store/index.ts new file mode 100644 index 000000000000..21cc2bd0f463 --- /dev/null +++ b/yarn-project/pxe/src/storage/tagging_store/index.ts @@ -0,0 +1,3 @@ +export { SenderTaggingStore } from './sender_tagging_store.js'; +export { SenderAddressBookStore } from './sender_address_book_store.js'; +export { RecipientTaggingStore } from './recipient_tagging_store.js'; diff --git a/yarn-project/pxe/src/storage/tagging_data_provider/recipient_tagging_data_provider.ts b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts similarity index 93% rename from yarn-project/pxe/src/storage/tagging_data_provider/recipient_tagging_data_provider.ts rename to yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts index 355a6d880ba3..3c9c4d77a883 100644 --- a/yarn-project/pxe/src/storage/tagging_data_provider/recipient_tagging_data_provider.ts +++ b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts @@ -3,15 +3,15 @@ import type { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; /** * Data provider of tagging data used when syncing the logs as a recipient. The sender counterpart of this class - * is called SenderTaggingDataProvider. We have the providers separate for the sender and recipient because + * is called SenderTaggingStore. We have the providers separate for the sender and recipient because * the algorithms are completely disjoint and there is not data reuse between the two. * * @dev Chain reorgs do not need to be handled here because both the finalized and aged indexes refer to finalized * blocks, which by definition cannot be affected by reorgs. * - * TODO(benesjan): Relocate to yarn-project/pxe/src/storage/tagging_data_provider + * TODO(benesjan): Relocate to yarn-project/pxe/src/storage/tagging_store */ -export class RecipientTaggingDataProvider { +export class RecipientTaggingStore { #store: AztecAsyncKVStore; #highestAgedIndex: AztecAsyncMap; diff --git a/yarn-project/pxe/src/storage/tagging_data_provider/sender_address_book.ts b/yarn-project/pxe/src/storage/tagging_store/sender_address_book_store.ts similarity index 96% rename from yarn-project/pxe/src/storage/tagging_data_provider/sender_address_book.ts rename to yarn-project/pxe/src/storage/tagging_store/sender_address_book_store.ts index a62e0537c8d1..b2c6631fe2f3 100644 --- a/yarn-project/pxe/src/storage/tagging_data_provider/sender_address_book.ts +++ b/yarn-project/pxe/src/storage/tagging_store/sender_address_book_store.ts @@ -6,7 +6,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address'; * Stores sender addresses. During recipient log synchronization, these senders are used, along with a given recipient, * to derive directional app tagging secrets that are then used to sync the logs. */ -export class SenderAddressBook { +export class SenderAddressBookStore { #store: AztecAsyncKVStore; #addressBook: AztecAsyncMap; diff --git a/yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.test.ts b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts similarity index 50% rename from yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.test.ts rename to yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts index 9d0a548616db..d6336e68cfd0 100644 --- a/yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.test.ts +++ b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts @@ -4,15 +4,15 @@ import { DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; import { TxHash } from '@aztec/stdlib/tx'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/index.js'; -import { SenderTaggingDataProvider } from './sender_tagging_data_provider.js'; +import { SenderTaggingStore } from './sender_tagging_store.js'; -describe('SenderTaggingDataProvider', () => { - let taggingDataProvider: SenderTaggingDataProvider; +describe('SenderTaggingStore', () => { + let taggingStore: SenderTaggingStore; let secret1: DirectionalAppTaggingSecret; let secret2: DirectionalAppTaggingSecret; beforeEach(async () => { - taggingDataProvider = new SenderTaggingDataProvider(await openTmpStore('test')); + taggingStore = new SenderTaggingStore(await openTmpStore('test')); secret1 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); secret2 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); }); @@ -22,9 +22,9 @@ describe('SenderTaggingDataProvider', () => { const txHash = TxHash.random(); const preTag: PreTag = { secret: secret1, index: 5 }; - await taggingDataProvider.storePendingIndexes([preTag], txHash); + await taggingStore.storePendingIndexes([preTag], txHash); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash); }); @@ -36,13 +36,13 @@ describe('SenderTaggingDataProvider', () => { { secret: secret2, index: 7 }, ]; - await taggingDataProvider.storePendingIndexes(preTags, txHash); + await taggingStore.storePendingIndexes(preTags, txHash); - const txHashes1 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes1 = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes1).toHaveLength(1); expect(txHashes1[0]).toEqual(txHash); - const txHashes2 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret2, 0, 10); + const txHashes2 = await taggingStore.getTxHashesOfPendingIndexes(secret2, 0, 10); expect(txHashes2).toHaveLength(1); expect(txHashes2[0]).toEqual(txHash); }); @@ -51,10 +51,10 @@ describe('SenderTaggingDataProvider', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toHaveLength(2); expect(txHashes).toContainEqual(txHash1); expect(txHashes).toContainEqual(txHash2); @@ -64,10 +64,10 @@ describe('SenderTaggingDataProvider', () => { const txHash = TxHash.random(); const preTag: PreTag = { secret: secret1, index: 5 }; - await taggingDataProvider.storePendingIndexes([preTag], txHash); - await taggingDataProvider.storePendingIndexes([preTag], txHash); + await taggingStore.storePendingIndexes([preTag], txHash); + await taggingStore.storePendingIndexes([preTag], txHash); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash); }); @@ -79,7 +79,7 @@ describe('SenderTaggingDataProvider', () => { { secret: secret1, index: 7 }, ]; - await expect(taggingDataProvider.storePendingIndexes(preTags, txHash)).rejects.toThrow( + await expect(taggingStore.storePendingIndexes(preTags, txHash)).rejects.toThrow( 'Duplicate secrets found when storing pending indexes', ); }); @@ -88,10 +88,10 @@ describe('SenderTaggingDataProvider', () => { const txHash = TxHash.random(); // First store an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); // Try to store a different index for the same secret + txHash pair - await expect(taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash)).rejects.toThrow( + await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash)).rejects.toThrow( /Cannot store index 7.*a different index 5 already exists/, ); }); @@ -101,11 +101,11 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Try to store a pending index lower than the finalized index - await expect(taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2)).rejects.toThrow( + await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2)).rejects.toThrow( /Cannot store pending index 5.*lower than or equal to the last finalized index 10/, ); }); @@ -115,11 +115,11 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Try to store a pending index equal to the finalized index - await expect(taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2)).rejects.toThrow( + await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2)).rejects.toThrow( /Cannot store pending index 10.*lower than or equal to the last finalized index 10/, ); }); @@ -129,15 +129,13 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Store a pending index higher than the finalized index - should succeed - await expect( - taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 15 }], txHash2), - ).resolves.not.toThrow(); + await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 15 }], txHash2)).resolves.not.toThrow(); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 20); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 20); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash2); }); @@ -150,12 +148,12 @@ describe('SenderTaggingDataProvider', () => { const indexBeyondWindow = finalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1; // First store and finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Try to store an index beyond the window await expect( - taggingDataProvider.storePendingIndexes([{ secret: secret1, index: indexBeyondWindow }], txHash2), + taggingStore.storePendingIndexes([{ secret: secret1, index: indexBeyondWindow }], txHash2), ).rejects.toThrow( `Highest used index ${indexBeyondWindow} is further than window length from the highest finalized index ${finalizedIndex}`, ); @@ -168,15 +166,15 @@ describe('SenderTaggingDataProvider', () => { const indexAtBoundary = finalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN; // First store and finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Store an index at the boundary, but check is >, so it should succeed await expect( - taggingDataProvider.storePendingIndexes([{ secret: secret1, index: indexAtBoundary }], txHash2), + taggingStore.storePendingIndexes([{ secret: secret1, index: indexAtBoundary }], txHash2), ).resolves.not.toThrow(); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, indexAtBoundary + 5); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, indexAtBoundary + 5); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash2); }); @@ -185,7 +183,7 @@ describe('SenderTaggingDataProvider', () => { describe('getTxHashesOfPendingIndexes', () => { it('returns empty array when no pending indexes exist', async () => { - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toEqual([]); }); @@ -194,11 +192,11 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 8 }], txHash3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 8 }], txHash3); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 4, 9); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 4, 9); expect(txHashes).toHaveLength(2); expect(txHashes).toContainEqual(txHash2); expect(txHashes).toContainEqual(txHash3); @@ -209,10 +207,10 @@ describe('SenderTaggingDataProvider', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 5, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 5, 10); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash1); }); @@ -223,15 +221,15 @@ describe('SenderTaggingDataProvider', () => { const txHash3 = TxHash.random(); const txHash4 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); // We store different secret with txHash1 to check we correctly don't return it in the result - await taggingDataProvider.storePendingIndexes([{ secret: secret2, index: 7 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret2, index: 7 }], txHash1); // Store "parallel" index for secret1 with a different tx (can happen when sending logs from multiple PXEs) - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash4); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash4); - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); // Should have 3 unique tx hashes for secret1 expect(txHashes).toEqual(expect.arrayContaining([txHash1, txHash2, txHash3, txHash4])); }); @@ -239,32 +237,32 @@ describe('SenderTaggingDataProvider', () => { describe('getLastFinalizedIndex', () => { it('returns undefined when no finalized index exists', async () => { - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBeUndefined(); }); it('returns the last finalized index after finalizePendingIndexes', async () => { const txHash = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); - await taggingDataProvider.finalizePendingIndexes([txHash]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); + await taggingStore.finalizePendingIndexes([txHash]); - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBe(5); }); }); describe('getLastUsedIndex', () => { it('returns undefined when no indexes exist', async () => { - const lastUsed = await taggingDataProvider.getLastUsedIndex(secret1); + const lastUsed = await taggingStore.getLastUsedIndex(secret1); expect(lastUsed).toBeUndefined(); }); it('returns the last finalized index when no pending indexes exist', async () => { const txHash = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); - await taggingDataProvider.finalizePendingIndexes([txHash]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); + await taggingStore.finalizePendingIndexes([txHash]); - const lastUsed = await taggingDataProvider.getLastUsedIndex(secret1); + const lastUsed = await taggingStore.getLastUsedIndex(secret1); expect(lastUsed).toBe(5); }); @@ -273,13 +271,13 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // First, finalize an index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Then add a higher pending index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - const lastUsed = await taggingDataProvider.getLastUsedIndex(secret1); + const lastUsed = await taggingStore.getLastUsedIndex(secret1); expect(lastUsed).toBe(7); }); @@ -288,11 +286,11 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash3); - const lastUsed = await taggingDataProvider.getLastUsedIndex(secret1); + const lastUsed = await taggingStore.getLastUsedIndex(secret1); expect(lastUsed).toBe(7); }); }); @@ -302,19 +300,19 @@ describe('SenderTaggingDataProvider', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret2, index: 5 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret2, index: 5 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - await taggingDataProvider.dropPendingIndexes([txHash1]); + await taggingStore.dropPendingIndexes([txHash1]); // txHash1 should be removed - const txHashes1 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes1 = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes1).toHaveLength(1); expect(txHashes1[0]).toEqual(txHash2); // txHash1 should also be removed from secret2 - const txHashes2 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret2, 0, 10); + const txHashes2 = await taggingStore.getTxHashesOfPendingIndexes(secret2, 0, 10); expect(txHashes2).toEqual([]); }); }); @@ -322,15 +320,15 @@ describe('SenderTaggingDataProvider', () => { describe('finalizePendingIndexes', () => { it('moves pending index to finalized for a given tx hash', async () => { const txHash = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash); - await taggingDataProvider.finalizePendingIndexes([txHash]); + await taggingStore.finalizePendingIndexes([txHash]); - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBe(5); // Pending index should be removed - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toEqual([]); }); @@ -338,13 +336,13 @@ describe('SenderTaggingDataProvider', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - await taggingDataProvider.finalizePendingIndexes([txHash2]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + await taggingStore.finalizePendingIndexes([txHash2]); - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBe(7); }); @@ -353,16 +351,16 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // Store both pending indexes first - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash2); // Finalize the higher index first - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.finalizePendingIndexes([txHash1]); // Then try to finalize the lower index - await taggingDataProvider.finalizePendingIndexes([txHash2]); + await taggingStore.finalizePendingIndexes([txHash2]); - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBe(7); // Should remain at 7 }); @@ -371,23 +369,23 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); // Finalize txHash2 (index 5) - await taggingDataProvider.finalizePendingIndexes([txHash2]); + await taggingStore.finalizePendingIndexes([txHash2]); // txHash1 (index 3) should be pruned as it's lower than finalized // txHash3 (index 7) should remain - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toHaveLength(1); expect(txHashes[0]).toEqual(txHash3); }); it('handles multiple secrets in the same tx', async () => { const txHash = TxHash.random(); - await taggingDataProvider.storePendingIndexes( + await taggingStore.storePendingIndexes( [ { secret: secret1, index: 3 }, { secret: secret2, index: 7 }, @@ -395,10 +393,10 @@ describe('SenderTaggingDataProvider', () => { txHash, ); - await taggingDataProvider.finalizePendingIndexes([txHash]); + await taggingStore.finalizePendingIndexes([txHash]); - const lastFinalized1 = await taggingDataProvider.getLastFinalizedIndex(secret1); - const lastFinalized2 = await taggingDataProvider.getLastFinalizedIndex(secret2); + const lastFinalized1 = await taggingStore.getLastFinalizedIndex(secret1); + const lastFinalized2 = await taggingStore.getLastFinalizedIndex(secret2); expect(lastFinalized1).toBe(3); expect(lastFinalized2).toBe(7); @@ -406,16 +404,16 @@ describe('SenderTaggingDataProvider', () => { it('does nothing when tx hash does not exist', async () => { const txHash = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash); - await taggingDataProvider.finalizePendingIndexes([TxHash.random()]); + await taggingStore.finalizePendingIndexes([TxHash.random()]); // Original pending index should still be there - const txHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret1, 0, 10); + const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10); expect(txHashes).toHaveLength(1); // Finalized index should not be set - const lastFinalized = await taggingDataProvider.getLastFinalizedIndex(secret1); + const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1); expect(lastFinalized).toBeUndefined(); }); }); @@ -426,39 +424,39 @@ describe('SenderTaggingDataProvider', () => { const txHash2 = TxHash.random(); // Step 1: Add pending index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(3); - expect(await taggingDataProvider.getLastFinalizedIndex(secret1)).toBeUndefined(); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(3); + expect(await taggingStore.getLastFinalizedIndex(secret1)).toBeUndefined(); // Step 2: Finalize the index - await taggingDataProvider.finalizePendingIndexes([txHash1]); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(3); - expect(await taggingDataProvider.getLastFinalizedIndex(secret1)).toBe(3); + await taggingStore.finalizePendingIndexes([txHash1]); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(3); + expect(await taggingStore.getLastFinalizedIndex(secret1)).toBe(3); // Step 3: Add a new higher pending index - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(7); - expect(await taggingDataProvider.getLastFinalizedIndex(secret1)).toBe(3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(7); + expect(await taggingStore.getLastFinalizedIndex(secret1)).toBe(3); // Step 4: Finalize the new index - await taggingDataProvider.finalizePendingIndexes([txHash2]); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(7); - expect(await taggingDataProvider.getLastFinalizedIndex(secret1)).toBe(7); + await taggingStore.finalizePendingIndexes([txHash2]); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(7); + expect(await taggingStore.getLastFinalizedIndex(secret1)).toBe(7); }); it('handles dropped transactions', async () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(5); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(5); // Drop txHash2 - await taggingDataProvider.dropPendingIndexes([txHash2]); + await taggingStore.dropPendingIndexes([txHash2]); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(3); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(3); }); it('handles multiple secrets with different lifecycles', async () => { @@ -467,19 +465,19 @@ describe('SenderTaggingDataProvider', () => { const txHash3 = TxHash.random(); // Secret1: pending -> finalized - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); - await taggingDataProvider.finalizePendingIndexes([txHash1]); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1); + await taggingStore.finalizePendingIndexes([txHash1]); // Secret2: pending (not finalized) - await taggingDataProvider.storePendingIndexes([{ secret: secret2, index: 5 }], txHash2); + await taggingStore.storePendingIndexes([{ secret: secret2, index: 5 }], txHash2); // Secret1: new pending - await taggingDataProvider.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); + await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3); - expect(await taggingDataProvider.getLastFinalizedIndex(secret1)).toBe(3); - expect(await taggingDataProvider.getLastUsedIndex(secret1)).toBe(7); - expect(await taggingDataProvider.getLastFinalizedIndex(secret2)).toBeUndefined(); - expect(await taggingDataProvider.getLastUsedIndex(secret2)).toBe(5); + expect(await taggingStore.getLastFinalizedIndex(secret1)).toBe(3); + expect(await taggingStore.getLastUsedIndex(secret1)).toBe(7); + expect(await taggingStore.getLastFinalizedIndex(secret2)).toBeUndefined(); + expect(await taggingStore.getLastUsedIndex(secret2)).toBe(5); }); }); }); diff --git a/yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.ts b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts similarity index 98% rename from yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.ts rename to yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts index 5e1fb28798ca..58b6c7b939c5 100644 --- a/yarn-project/pxe/src/storage/tagging_data_provider/sender_tagging_data_provider.ts +++ b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts @@ -7,10 +7,10 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/index.js'; /** * Data provider of tagging data used when syncing the sender tagging indexes. The recipient counterpart of this class - * is called RecipientTaggingDataProvider. We have the providers separate for the sender and recipient because + * is called RecipientTaggingStore. We have the providers separate for the sender and recipient because * the algorithms are completely disjoint and there is not data reuse between the two. */ -export class SenderTaggingDataProvider { +export class SenderTaggingStore { #store: AztecAsyncKVStore; // Stores the pending indexes for each directional app tagging secret. Pending here means that the tx that contained diff --git a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts index e6b1a7ac3b0b..a5fe72cb9ab5 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts @@ -9,7 +9,7 @@ import { makeBlockHeader, randomTxScopedPrivateL2Log } from '@aztec/stdlib/testi import { type MockProxy, mock } from 'jest-mock-extended'; -import { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; +import { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../index.js'; import { loadPrivateLogsForSenderRecipientPair } from './load_private_logs_for_sender_recipient_pair.js'; @@ -22,7 +22,7 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { let app: AztecAddress; let aztecNode: MockProxy; - let taggingDataProvider: RecipientTaggingDataProvider; + let taggingStore: RecipientTaggingStore; const currentTimestamp = BigInt(Math.floor(Date.now() / 1000)); @@ -45,7 +45,7 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { aztecNode.getPrivateLogsByTags.mockReset(); aztecNode.getL2Tips.mockReset(); aztecNode.getBlockHeader.mockReset(); - taggingDataProvider = new RecipientTaggingDataProvider(await openTmpStore('test')); + taggingStore = new RecipientTaggingStore(await openTmpStore('test')); }); it('returns empty array when no logs found', async () => { @@ -64,13 +64,13 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { secret, app, aztecNode, - taggingDataProvider, + taggingStore, NON_INTERFERING_ANCHOR_BLOCK_NUMBER, ); expect(logs).toHaveLength(0); - expect(await taggingDataProvider.getHighestAgedIndex(secret)).toBeUndefined(); - expect(await taggingDataProvider.getHighestFinalizedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getHighestAgedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getHighestFinalizedIndex(secret)).toBeUndefined(); }); it('loads log and updates highest finalized index but not highest aged index', async () => { @@ -99,13 +99,13 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { secret, app, aztecNode, - taggingDataProvider, + taggingStore, NON_INTERFERING_ANCHOR_BLOCK_NUMBER, ); expect(logs).toHaveLength(1); - expect(await taggingDataProvider.getHighestFinalizedIndex(secret)).toBe(logIndex); - expect(await taggingDataProvider.getHighestAgedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getHighestFinalizedIndex(secret)).toBe(logIndex); + expect(await taggingStore.getHighestAgedIndex(secret)).toBeUndefined(); }); it('loads log and updates both highest aged and highest finalized indexes', async () => { @@ -134,13 +134,13 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { secret, app, aztecNode, - taggingDataProvider, + taggingStore, NON_INTERFERING_ANCHOR_BLOCK_NUMBER, ); expect(logs).toHaveLength(1); - expect(await taggingDataProvider.getHighestAgedIndex(secret)).toBe(logIndex); - expect(await taggingDataProvider.getHighestFinalizedIndex(secret)).toBe(logIndex); + expect(await taggingStore.getHighestAgedIndex(secret)).toBe(logIndex); + expect(await taggingStore.getHighestFinalizedIndex(secret)).toBe(logIndex); }); it('logs at boundaries are properly loaded, window and highest indexes advance as expected', async () => { @@ -156,8 +156,8 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { const log2Tag = await computeSiloedTagForIndex(log2Index); // Set existing highest aged index and highest finalized index - await taggingDataProvider.updateHighestAgedIndex(secret, highestAgedIndex); - await taggingDataProvider.updateHighestFinalizedIndex(secret, highestFinalizedIndex); + await taggingStore.updateHighestAgedIndex(secret, highestAgedIndex); + await taggingStore.updateHighestFinalizedIndex(secret, highestFinalizedIndex); aztecNode.getL2Tips.mockResolvedValue({ finalized: { number: BlockNumber(finalizedBlockNumber) }, @@ -186,14 +186,14 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { secret, app, aztecNode, - taggingDataProvider, + taggingStore, NON_INTERFERING_ANCHOR_BLOCK_NUMBER, ); // Verify that both logs at the boundaries of the range were found and processed expect(logs).toHaveLength(2); - expect(await taggingDataProvider.getHighestFinalizedIndex(secret)).toBe(log2Index); - expect(await taggingDataProvider.getHighestAgedIndex(secret)).toBe(log1Index); + expect(await taggingStore.getHighestFinalizedIndex(secret)).toBe(log2Index); + expect(await taggingStore.getHighestAgedIndex(secret)).toBe(log1Index); // Verify that the window was moved forward correctly // Total range queried: from (highestAgedIndex + 1) to (log2Index + WINDOW_LEN + 1) exclusive diff --git a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts index d25f68b27075..6b9fe982816e 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts @@ -3,7 +3,7 @@ import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; import type { DirectionalAppTaggingSecret, TxScopedL2Log } from '@aztec/stdlib/logs'; -import type { RecipientTaggingDataProvider } from '../../storage/tagging_data_provider/recipient_tagging_data_provider.js'; +import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../index.js'; import { findHighestIndexes } from './utils/find_highest_indexes.js'; import { loadLogsForRange } from './utils/load_logs_for_range.js'; @@ -19,7 +19,7 @@ export async function loadPrivateLogsForSenderRecipientPair( secret: DirectionalAppTaggingSecret, app: AztecAddress, aztecNode: AztecNode, - taggingDataProvider: RecipientTaggingDataProvider, + taggingStore: RecipientTaggingStore, anchorBlockNumber: BlockNumber, ): Promise { // # Explanation of how the algorithm works @@ -73,8 +73,8 @@ export async function loadPrivateLogsForSenderRecipientPair( let start: number, end: number; { - const currentHighestAgedIndex = await taggingDataProvider.getHighestAgedIndex(secret); - const currentHighestFinalizedIndex = await taggingDataProvider.getHighestFinalizedIndex(secret); + const currentHighestAgedIndex = await taggingStore.getHighestAgedIndex(secret); + const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret); // We don't want to include the highest aged index so we start from `currentHighestAgedIndex + 1` (or 0 if not set) start = currentHighestAgedIndex === undefined ? 0 : currentHighestAgedIndex + 1; @@ -104,7 +104,7 @@ export async function loadPrivateLogsForSenderRecipientPair( // Store updates in data provider and update local variables if (highestAgedIndex !== undefined) { - await taggingDataProvider.updateHighestAgedIndex(secret, highestAgedIndex); + await taggingStore.updateHighestAgedIndex(secret, highestAgedIndex); } if (highestFinalizedIndex === undefined) { @@ -117,7 +117,7 @@ export async function loadPrivateLogsForSenderRecipientPair( throw new Error('Highest aged index lower than highest finalized index invariant violated'); } - await taggingDataProvider.updateHighestFinalizedIndex(secret, highestFinalizedIndex); + await taggingStore.updateHighestFinalizedIndex(secret, highestFinalizedIndex); // For the next iteration we want to look only at indexes for which we have not attempted to load logs yet while // ensuring that we do not look further than WINDOW_LEN ahead of the highest finalized index. diff --git a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts index fd21b140de50..43af9587edf5 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts @@ -7,7 +7,7 @@ import { TxHash, TxStatus } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { DirectionalAppTaggingSecret, SiloedTag, Tag, UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../index.js'; import { syncSenderTaggingIndexes } from './sync_sender_tagging_indexes.js'; @@ -17,7 +17,7 @@ describe('syncSenderTaggingIndexes', () => { let contractAddress: AztecAddress; let aztecNode: MockProxy; - let taggingDataProvider: SenderTaggingDataProvider; + let taggingStore: SenderTaggingStore; async function computeSiloedTagForIndex(index: number) { const tag = await Tag.compute({ secret, index }); @@ -33,7 +33,7 @@ describe('syncSenderTaggingIndexes', () => { contractAddress = await AztecAddress.random(); aztecNode = mock(); - taggingDataProvider = new SenderTaggingDataProvider(await openTmpStore('test')); + taggingStore = new SenderTaggingStore(await openTmpStore('test')); } it('no new logs found for a given secret', async () => { @@ -44,11 +44,11 @@ describe('syncSenderTaggingIndexes', () => { return Promise.resolve(tags.map((_tag: SiloedTag) => [])); }); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingDataProvider); + await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore); // Highest used and finalized indexes should stay undefined - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBeUndefined(); - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getLastUsedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBeUndefined(); }); // These tests need to be run together in sequence. @@ -86,13 +86,13 @@ describe('syncSenderTaggingIndexes', () => { finalized: { number: finalizedBlockNumberStep1 }, } as any); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingDataProvider); + await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore); // Verify the highest finalized index is updated to 3 - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBe(finalizedIndexStep1); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBe(finalizedIndexStep1); // Verify the highest used index also returns 3 (when there is no higher pending index the highest used index is // the highest finalized index). - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(finalizedIndexStep1); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(finalizedIndexStep1); }); it('step 2: pending log is synced', async () => { @@ -115,12 +115,12 @@ describe('syncSenderTaggingIndexes', () => { finalized: { number: finalizedBlockNumberStep1 }, } as any); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingDataProvider); + await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore); // Verify the highest finalized index was not updated - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBe(finalizedIndexStep1); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBe(finalizedIndexStep1); // Verify the highest used index was updated to the pending index - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(pendingIndexStep2); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(pendingIndexStep2); }); it('step 3: syncs logs across 2 windows', async () => { @@ -184,10 +184,10 @@ describe('syncSenderTaggingIndexes', () => { finalized: { number: newFinalizedBlockNumber }, } as any); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingDataProvider); + await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore); - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBe(newHighestFinalizedIndex); - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(newHighestUsedIndex); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBe(newHighestFinalizedIndex); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(newHighestUsedIndex); }); }); @@ -238,10 +238,10 @@ describe('syncSenderTaggingIndexes', () => { } as any); // Sync tagged logs - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingDataProvider); + await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore); // Verify that both highest finalized and highest used were set to the pending and finalized index - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBe(pendingAndFinalizedIndex); - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(pendingAndFinalizedIndex); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBe(pendingAndFinalizedIndex); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(pendingAndFinalizedIndex); }); }); diff --git a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts index 3b9c99164926..166ba9b6db60 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts @@ -2,7 +2,7 @@ import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; import type { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; -import type { SenderTaggingDataProvider } from '../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../index.js'; import { getStatusChangeOfPending } from './utils/get_status_change_of_pending.js'; import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_tagging_indexes.js'; @@ -25,7 +25,7 @@ export async function syncSenderTaggingIndexes( secret: DirectionalAppTaggingSecret, app: AztecAddress, aztecNode: AztecNode, - taggingDataProvider: SenderTaggingDataProvider, + taggingStore: SenderTaggingStore, ): Promise { // # Explanation of how syncing works // @@ -45,7 +45,7 @@ export async function syncSenderTaggingIndexes( // Each window advance requires two queries (logs + tx status). For example, syncing indexes 0–500 with a window of // 100 takes at least 10 round trips (5 windows × 2 queries). - const finalizedIndex = await taggingDataProvider.getLastFinalizedIndex(secret); + const finalizedIndex = await taggingStore.getLastFinalizedIndex(secret); let start = finalizedIndex === undefined ? 0 : finalizedIndex + 1; let end = start + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN; @@ -56,21 +56,21 @@ export async function syncSenderTaggingIndexes( while (true) { // Load and store indexes for the current window. These indexes may already exist in the database if txs using // them were previously sent from this PXE. Any duplicates are handled by the tagging data provider. - await loadAndStoreNewTaggingIndexes(secret, app, start, end, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, start, end, aztecNode, taggingStore); // Retrieve all indexes within the current window from storage and update their status accordingly. - const pendingTxHashes = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, start, end); + const pendingTxHashes = await taggingStore.getTxHashesOfPendingIndexes(secret, start, end); if (pendingTxHashes.length === 0) { break; } const { txHashesToFinalize, txHashesToDrop } = await getStatusChangeOfPending(pendingTxHashes, aztecNode); - await taggingDataProvider.dropPendingIndexes(txHashesToDrop); - await taggingDataProvider.finalizePendingIndexes(txHashesToFinalize); + await taggingStore.dropPendingIndexes(txHashesToDrop); + await taggingStore.finalizePendingIndexes(txHashesToFinalize); // We check if the finalized index has been updated. - newFinalizedIndex = await taggingDataProvider.getLastFinalizedIndex(secret); + newFinalizedIndex = await taggingStore.getLastFinalizedIndex(secret); if (previousFinalizedIndex !== newFinalizedIndex) { // A new finalized index was found, so we'll run the loop again. For example: // - Previous finalized index: 10 diff --git a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts index c6c26c8fe78f..8139e8ce721f 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts @@ -8,7 +8,7 @@ import { TxHash } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { SenderTaggingDataProvider } from '../../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import { SenderTaggingStore } from '../../../storage/tagging_store/sender_tagging_store.js'; import { loadAndStoreNewTaggingIndexes } from './load_and_store_new_tagging_indexes.js'; describe('loadAndStoreNewTaggingIndexes', () => { @@ -17,7 +17,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { let app: AztecAddress; let aztecNode: MockProxy; - let taggingDataProvider: SenderTaggingDataProvider; + let taggingStore: SenderTaggingStore; async function computeSiloedTagForIndex(index: number) { const tag = await Tag.compute({ secret, index }); @@ -37,7 +37,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { // Unlike for secret, app address and aztecNode we need a fresh instance of the tagging data provider for each test. beforeEach(async () => { aztecNode.getPrivateLogsByTags.mockReset(); - taggingDataProvider = new SenderTaggingDataProvider(await openTmpStore('test')); + taggingStore = new SenderTaggingStore(await openTmpStore('test')); }); it('no logs found for the given window', async () => { @@ -46,14 +46,14 @@ describe('loadAndStoreNewTaggingIndexes', () => { return Promise.resolve(tags.map((_tag: SiloedTag) => [])); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify that no pending indexes were stored - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBeUndefined(); - expect(await taggingDataProvider.getLastFinalizedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getLastUsedIndex(secret)).toBeUndefined(); + expect(await taggingStore.getLastFinalizedIndex(secret)).toBeUndefined(); // Verify the entire window has no pending tx hashes - const txHashesInWindow = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 0, 10); + const txHashesInWindow = await taggingStore.getTxHashesOfPendingIndexes(secret, 0, 10); expect(txHashesInWindow).toHaveLength(0); }); @@ -66,15 +66,15 @@ describe('loadAndStoreNewTaggingIndexes', () => { return Promise.resolve(tags.map((t: SiloedTag) => (t.equals(tag) ? [makeLog(txHash, tag.value)] : []))); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify that the pending index was stored for this txHash - const txHashesInRange = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index, index + 1); + const txHashesInRange = await taggingStore.getTxHashesOfPendingIndexes(secret, index, index + 1); expect(txHashesInRange).toHaveLength(1); expect(txHashesInRange[0].equals(txHash)).toBe(true); // Verify the last used index is correct - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(index); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(index); }); it('for multiple logs with same txHash stores the highest index', async () => { @@ -97,19 +97,19 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify that only the highest index (7) was stored for this txHash and secret - const txHashesAtIndex2 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index2, index2 + 1); + const txHashesAtIndex2 = await taggingStore.getTxHashesOfPendingIndexes(secret, index2, index2 + 1); expect(txHashesAtIndex2).toHaveLength(1); expect(txHashesAtIndex2[0].equals(txHash)).toBe(true); // Verify the lower index is not stored separately - const txHashesAtIndex1 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index1, index1 + 1); + const txHashesAtIndex1 = await taggingStore.getTxHashesOfPendingIndexes(secret, index1, index1 + 1); expect(txHashesAtIndex1).toHaveLength(0); // Verify the last used index is the highest - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(index2); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(index2); }); it('multiple logs with different txHashes', async () => { @@ -133,19 +133,19 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify that both txHashes have their respective indexes stored - const txHashesAtIndex1 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index1, index1 + 1); + const txHashesAtIndex1 = await taggingStore.getTxHashesOfPendingIndexes(secret, index1, index1 + 1); expect(txHashesAtIndex1).toHaveLength(1); expect(txHashesAtIndex1[0].equals(txHash1)).toBe(true); - const txHashesAtIndex2 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index2, index2 + 1); + const txHashesAtIndex2 = await taggingStore.getTxHashesOfPendingIndexes(secret, index2, index2 + 1); expect(txHashesAtIndex2).toHaveLength(1); expect(txHashesAtIndex2[0].equals(txHash2)).toBe(true); // Verify the last used index is the highest - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(index2); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(index2); }); // Expected to happen if sending logs from multiple PXEs at a similar time. @@ -161,17 +161,17 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify that both txHashes have the same index stored - const txHashesAtIndex = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, index, index + 1); + const txHashesAtIndex = await taggingStore.getTxHashesOfPendingIndexes(secret, index, index + 1); expect(txHashesAtIndex).toHaveLength(2); const txHashStrings = txHashesAtIndex.map(h => h.toString()); expect(txHashStrings).toContain(txHash1.toString()); expect(txHashStrings).toContain(txHash2.toString()); // Verify the last used index is correct - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(index); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(index); }); it('complex scenario: multiple txHashes with multiple indexes', async () => { @@ -207,29 +207,29 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore); // Verify txHash1 has highest index 8 (should not be at index 1) - const txHashesAtIndex1 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 1, 2); + const txHashesAtIndex1 = await taggingStore.getTxHashesOfPendingIndexes(secret, 1, 2); expect(txHashesAtIndex1).toHaveLength(0); - const txHashesAtIndex8 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 8, 9); + const txHashesAtIndex8 = await taggingStore.getTxHashesOfPendingIndexes(secret, 8, 9); expect(txHashesAtIndex8).toHaveLength(1); expect(txHashesAtIndex8[0].equals(txHash1)).toBe(true); // Verify txHash2 has highest index 5 (should not be at index 3) - const txHashesAtIndex3 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 3, 4); + const txHashesAtIndex3 = await taggingStore.getTxHashesOfPendingIndexes(secret, 3, 4); expect(txHashesAtIndex3).toHaveLength(0); - const txHashesAtIndex5 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 5, 6); + const txHashesAtIndex5 = await taggingStore.getTxHashesOfPendingIndexes(secret, 5, 6); expect(txHashesAtIndex5).toHaveLength(1); expect(txHashesAtIndex5[0].equals(txHash2)).toBe(true); // Verify txHash3 has index 9 - const txHashesAtIndex9 = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, 9, 10); + const txHashesAtIndex9 = await taggingStore.getTxHashesOfPendingIndexes(secret, 9, 10); expect(txHashesAtIndex9).toHaveLength(1); expect(txHashesAtIndex9[0].equals(txHash3)).toBe(true); // Verify the last used index is the highest - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(9); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(9); }); it('start is inclusive and end is exclusive', async () => { @@ -255,18 +255,18 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, start, end, aztecNode, taggingDataProvider); + await loadAndStoreNewTaggingIndexes(secret, app, start, end, aztecNode, taggingStore); // Verify that the log at start (inclusive) was processed - const txHashesAtStart = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, start, start + 1); + const txHashesAtStart = await taggingStore.getTxHashesOfPendingIndexes(secret, start, start + 1); expect(txHashesAtStart).toHaveLength(1); expect(txHashesAtStart[0].equals(txHashAtStart)).toBe(true); // Verify that the log at end (exclusive) was NOT processed - const txHashesAtEnd = await taggingDataProvider.getTxHashesOfPendingIndexes(secret, end, end + 1); + const txHashesAtEnd = await taggingStore.getTxHashesOfPendingIndexes(secret, end, end + 1); expect(txHashesAtEnd).toHaveLength(0); // Verify the last used index is the start index (since end was not processed) - expect(await taggingDataProvider.getLastUsedIndex(secret)).toBe(start); + expect(await taggingStore.getLastUsedIndex(secret)).toBe(start); }); }); diff --git a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts index e0202aafac84..8b3a5eb7e6c8 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts @@ -4,7 +4,7 @@ import type { DirectionalAppTaggingSecret, PreTag } from '@aztec/stdlib/logs'; import { SiloedTag, Tag } from '@aztec/stdlib/logs'; import { TxHash } from '@aztec/stdlib/tx'; -import type { SenderTaggingDataProvider } from '../../../storage/tagging_data_provider/sender_tagging_data_provider.js'; +import type { SenderTaggingStore } from '../../../storage/tagging_store/sender_tagging_store.js'; /** * Loads tagging indexes from the Aztec node and stores them in the tagging data provider. @@ -16,7 +16,7 @@ import type { SenderTaggingDataProvider } from '../../../storage/tagging_data_pr * @param start - The starting index (inclusive) of the window to process. * @param end - The ending index (exclusive) of the window to process. * @param aztecNode - The Aztec node instance to query for logs. - * @param taggingDataProvider - The data provider to store pending indexes. + * @param taggingStore - The data provider to store pending indexes. */ export async function loadAndStoreNewTaggingIndexes( secret: DirectionalAppTaggingSecret, @@ -24,7 +24,7 @@ export async function loadAndStoreNewTaggingIndexes( start: number, end: number, aztecNode: AztecNode, - taggingDataProvider: SenderTaggingDataProvider, + taggingStore: SenderTaggingStore, ) { // We compute the tags for the current window of indexes const preTagsForWindow: PreTag[] = Array(end - start) @@ -40,7 +40,7 @@ export async function loadAndStoreNewTaggingIndexes( // Now we iterate over the map, reconstruct the preTags and tx hash and store them in the db. for (const [txHashStr, highestIndex] of highestIndexMap.entries()) { const txHash = TxHash.fromString(txHashStr); - await taggingDataProvider.storePendingIndexes([{ secret, index: highestIndex }], txHash); + await taggingStore.storePendingIndexes([{ secret, index: highestIndex }], txHash); } } diff --git a/yarn-project/pxe/src/tree_membership/tree_membership_service.ts b/yarn-project/pxe/src/tree_membership/tree_membership_service.ts index 57ec5b131077..2b8ee35f2b36 100644 --- a/yarn-project/pxe/src/tree_membership/tree_membership_service.ts +++ b/yarn-project/pxe/src/tree_membership/tree_membership_service.ts @@ -7,12 +7,12 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/server'; import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging'; import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees'; -import type { AnchorBlockDataProvider } from '../storage/anchor_block_data_provider/anchor_block_data_provider.js'; +import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js'; export class TreeMembershipService { constructor( private readonly aztecNode: AztecNode, - private readonly anchorBlockDataProvider: AnchorBlockDataProvider, + private readonly anchorBlockStore: AnchorBlockStore, ) {} /** @@ -51,7 +51,7 @@ export class TreeMembershipService { blockNumber: BlockParameter, nullifier: Fr, ): Promise { - const anchorBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); if (blockNumber !== 'latest' && blockNumber > anchorBlockNumber) { throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`); } @@ -64,7 +64,7 @@ export class TreeMembershipService { * @param leafSlot - The slot of the public data in the public data tree. */ public async getPublicDataWitness(blockNumber: BlockParameter, leafSlot: Fr): Promise { - const anchorBlockNumber = (await this.anchorBlockDataProvider.getBlockHeader()).getBlockNumber(); + const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber(); if (blockNumber !== 'latest' && blockNumber > anchorBlockNumber) { throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`); } diff --git a/yarn-project/txe/src/index.ts b/yarn-project/txe/src/index.ts index 94f408e7781a..bdcfa01af09b 100644 --- a/yarn-project/txe/src/index.ts +++ b/yarn-project/txe/src/index.ts @@ -33,7 +33,7 @@ import { fromSingle, toSingle, } from './util/encoding.js'; -import type { ContractArtifactWithHash } from './util/txe_contract_data_provider.js'; +import type { ContractArtifactWithHash } from './util/txe_contract_store.js'; const sessions = new Map(); diff --git a/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts b/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts index dec5408aa81d..a254131b8a54 100644 --- a/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts +++ b/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts @@ -13,14 +13,14 @@ import { LogLevels, type Logger, applyStringFormatting, createLogger } from '@az import { TestDateProvider } from '@aztec/foundation/timer'; import type { KeyStore } from '@aztec/key-store'; import { - AddressDataProvider, - CapsuleDataProvider, - NoteDataProvider, + AddressStore, + CapsuleStore, + NoteStore, ORACLE_VERSION, - PrivateEventDataProvider, - RecipientTaggingDataProvider, - SenderAddressBook, - SenderTaggingDataProvider, + PrivateEventStore, + RecipientTaggingStore, + SenderAddressBookStore, + SenderTaggingStore, enrichPublicSimulationError, } from '@aztec/pxe/server'; import { @@ -82,8 +82,8 @@ import { ForkCheckpoint } from '@aztec/world-state'; import type { TXEStateMachine } from '../state_machine/index.js'; import { DEFAULT_ADDRESS } from '../txe_session.js'; -import type { TXEAccountDataProvider } from '../util/txe_account_data_provider.js'; -import type { TXEContractDataProvider } from '../util/txe_contract_data_provider.js'; +import type { TXEAccountStore } from '../util/txe_account_store.js'; +import type { TXEContractStore } from '../util/txe_contract_store.js'; import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js'; import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js'; import type { ITxeExecutionOracle } from './interfaces.js'; @@ -96,16 +96,16 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl constructor( private stateMachine: TXEStateMachine, - private contractDataProvider: TXEContractDataProvider, - private noteDataProvider: NoteDataProvider, + private contractStore: TXEContractStore, + private noteStore: NoteStore, private keyStore: KeyStore, - private addressDataProvider: AddressDataProvider, - private accountDataProvider: TXEAccountDataProvider, - private senderTaggingDataProvider: SenderTaggingDataProvider, - private recipientTaggingDataProvider: RecipientTaggingDataProvider, - private senderAddressBook: SenderAddressBook, - private capsuleDataProvider: CapsuleDataProvider, - private privateEventDataProvider: PrivateEventDataProvider, + private addressStore: AddressStore, + private accountStore: TXEAccountStore, + private senderTaggingStore: SenderTaggingStore, + private recipientTaggingStore: RecipientTaggingStore, + private senderAddressBookStore: SenderAddressBookStore, + private capsuleStore: CapsuleStore, + private privateEventStore: PrivateEventStore, private nextBlockTimestamp: bigint, private version: Fr, private chainId: Fr, @@ -170,7 +170,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl async txeGetPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) { return ( - await this.privateEventDataProvider.getPrivateEvents(selector, { + await this.privateEventStore.getPrivateEvents(selector, { contractAddress, scopes: [scope], fromBlock: 0, @@ -206,8 +206,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl if (!secret.equals(Fr.ZERO)) { await this.txeAddAccount(artifact, instance, secret); } else { - await this.contractDataProvider.addContractInstance(instance); - await this.contractDataProvider.addContractArtifact(instance.currentContractClassId, artifact); + await this.contractStore.addContractInstance(instance); + await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact); this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); } } @@ -216,12 +216,12 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl const partialAddress = await computePartialAddress(instance); this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); - await this.contractDataProvider.addContractInstance(instance); - await this.contractDataProvider.addContractArtifact(instance.currentContractClassId, artifact); + await this.contractStore.addContractInstance(instance); + await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact); const completeAddress = await this.keyStore.addAccount(secret, partialAddress); - await this.accountDataProvider.setAccount(completeAddress.address, completeAddress); - await this.addressDataProvider.addCompleteAddress(completeAddress); + await this.accountStore.setAccount(completeAddress.address, completeAddress); + await this.addressStore.addCompleteAddress(completeAddress); this.logger.debug(`Created account ${completeAddress.address}`); return completeAddress; @@ -230,15 +230,15 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl async txeCreateAccount(secret: Fr) { // This is a foot gun ! const completeAddress = await this.keyStore.addAccount(secret, secret); - await this.accountDataProvider.setAccount(completeAddress.address, completeAddress); - await this.addressDataProvider.addCompleteAddress(completeAddress); + await this.accountStore.setAccount(completeAddress.address, completeAddress); + await this.addressStore.addCompleteAddress(completeAddress); this.logger.debug(`Created account ${completeAddress.address}`); return completeAddress; } async txeAddAuthWitness(address: AztecAddress, messageHash: Fr) { - const account = await this.accountDataProvider.getAccount(address); + const account = await this.accountStore.getAccount(address); const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey); const schnorr = new Schnorr(); @@ -283,10 +283,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl isStaticCall: boolean = false, ) { this.logger.verbose( - `Executing external function ${await this.contractDataProvider.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`, + `Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`, ); - const artifact = await this.contractDataProvider.getFunctionArtifact(targetContractAddress, functionSelector); + const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector); if (!artifact) { const message = functionSelector.equals(await FunctionSelector.fromSignature('verify_private_authwit(Field)')) ? 'Found no account contract artifact for a private authwit check - use `create_contract_account` instead of `create_light_account` for authwit support.' @@ -306,7 +306,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl const txContext = new TxContext(this.chainId, this.version, gasSettings); - const blockHeader = await this.stateMachine.anchorBlockDataProvider.getBlockHeader(); + const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber)); const noteCache = new ExecutionNoteCache(protocolNullifier); @@ -327,17 +327,17 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl HashedValuesCache.create([new HashedValues(args, argsHash)]), noteCache, taggingIndexCache, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.stateMachine.anchorBlockStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, 0, 1, undefined, // log @@ -387,7 +387,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl // can either be the first nullifier in the tx or the hash of the initial tx request // if there are none. const nonceGenerator = result.firstNullifier.equals(Fr.ZERO) ? protocolNullifier : result.firstNullifier; - const { publicInputs } = await generateSimulatedProvingResult(result, nonceGenerator, this.contractDataProvider); + const { publicInputs } = await generateSimulatedProvingResult(result, nonceGenerator, this.contractStore); const globals = makeGlobalVariables(); globals.blockNumber = blockNumber; @@ -398,7 +398,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork(); - const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractDataProvider)); + const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore)); const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees); const config = PublicSimulatorConfig.from({ skipFeeEnforcement: true, @@ -437,7 +437,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl } else if (!processedTx.revertCode.isOK()) { if (processedTx.revertReason) { try { - await enrichPublicSimulationError(processedTx.revertReason, this.contractDataProvider, this.logger); + await enrichPublicSimulationError(processedTx.revertReason, this.contractStore, this.logger); // eslint-disable-next-line no-empty } catch {} throw new Error(`Contract execution has reverted: ${processedTx.revertReason.getMessage()}`); @@ -482,7 +482,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl isStaticCall: boolean, ) { this.logger.verbose( - `Executing public function ${await this.contractDataProvider.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`, + `Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`, ); const blockNumber = await this.txeGetNextBlockNumber(); @@ -495,7 +495,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl const txContext = new TxContext(this.chainId, this.version, gasSettings); - const anchorBlockHeader = await this.stateMachine.anchorBlockDataProvider.getBlockHeader(); + const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); const calldataHash = await computeCalldataHash(calldata); const calldataHashedValues = new HashedValues(calldata, calldataHash); @@ -509,7 +509,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork(); - const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractDataProvider)); + const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore)); const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees); const config = PublicSimulatorConfig.from({ skipFeeEnforcement: true, @@ -577,7 +577,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl } else if (!processedTx.revertCode.isOK()) { if (processedTx.revertReason) { try { - await enrichPublicSimulationError(processedTx.revertReason, this.contractDataProvider, this.logger); + await enrichPublicSimulationError(processedTx.revertReason, this.contractStore, this.logger); // eslint-disable-next-line no-empty } catch {} throw new Error(`Contract execution has reverted: ${processedTx.revertReason.getMessage()}`); @@ -623,7 +623,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl functionSelector: FunctionSelector, args: Fr[], ) { - const artifact = await this.contractDataProvider.getFunctionArtifact(targetContractAddress, functionSelector); + const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector); if (!artifact) { throw new Error(`Cannot call ${functionSelector} as there is no artifact found at ${targetContractAddress}.`); } @@ -634,10 +634,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl to: targetContractAddress, }; - const entryPointArtifact = await this.contractDataProvider.getFunctionArtifactWithDebugMetadata( - call.to, - call.selector, - ); + const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector); if (entryPointArtifact.functionType !== FunctionType.UTILITY) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`); } @@ -648,22 +645,22 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl }); try { - const anchorBlockHeader = await this.stateMachine.anchorBlockDataProvider.getBlockHeader(); + const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); const oracle = new UtilityExecutionOracle( call.to, [], [], anchorBlockHeader, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.stateMachine.anchorBlockStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, ); const acirExecutionResult = await new WASMSimulator() .executeUserCircuit(toACVMWitness(0, args), entryPointArtifact, new Oracle(oracle).toACIRCallback()) diff --git a/yarn-project/txe/src/state_machine/index.ts b/yarn-project/txe/src/state_machine/index.ts index a5d980c4c9a2..965e54f44898 100644 --- a/yarn-project/txe/src/state_machine/index.ts +++ b/yarn-project/txe/src/state_machine/index.ts @@ -2,7 +2,7 @@ import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node'; import { TestCircuitVerifier } from '@aztec/bb-prover/test'; import { createLogger } from '@aztec/foundation/log'; import type { AztecAsyncKVStore } from '@aztec/kv-store'; -import { AnchorBlockDataProvider } from '@aztec/pxe/server'; +import { AnchorBlockStore } from '@aztec/pxe/server'; import { L2Block } from '@aztec/stdlib/block'; import { L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; @@ -22,13 +22,13 @@ export class TXEStateMachine { public node: AztecNode, public synchronizer: TXESynchronizer, public archiver: TXEArchiver, - public anchorBlockDataProvider: AnchorBlockDataProvider, + public anchorBlockStore: AnchorBlockStore, ) {} public static async create(db: AztecAsyncKVStore) { const archiver = new TXEArchiver(db); const synchronizer = await TXESynchronizer.create(); - const anchorBlockDataProvider = new AnchorBlockDataProvider(db); + const anchorBlockStore = new AnchorBlockStore(db); const aztecNodeConfig = {} as AztecNodeConfig; @@ -55,7 +55,7 @@ export class TXEStateMachine { log, ); - return new this(node, synchronizer, archiver, anchorBlockDataProvider); + return new this(node, synchronizer, archiver, anchorBlockStore); } public async handleL2Block(block: L2Block) { @@ -72,7 +72,7 @@ export class TXEStateMachine { await Promise.all([ this.synchronizer.handleL2Block(block.toL2Block()), this.archiver.addCheckpoints([publishedCheckpoint], undefined), - this.anchorBlockDataProvider.setHeader(block.getBlockHeader()), + this.anchorBlockStore.setHeader(block.getBlockHeader()), ]); } } diff --git a/yarn-project/txe/src/txe_session.test.ts b/yarn-project/txe/src/txe_session.test.ts index bef32ac68bb1..14f8c4c96095 100644 --- a/yarn-project/txe/src/txe_session.test.ts +++ b/yarn-project/txe/src/txe_session.test.ts @@ -11,16 +11,16 @@ describe('TXESession.processFunction', () => { {} as any, // logger {} as any, // stateMachine {} as any, // oracleHandler - {} as any, // contractDataProvider - {} as any, // noteDataProvider + {} as any, // contractStore + {} as any, // noteStore {} as any, // keyStore - {} as any, // addressDataProvider - {} as any, // accountDataProvider - {} as any, // senderTaggingDataProvider - {} as any, // recipientTaggingDataProvider + {} as any, // addressStore + {} as any, // accountStore + {} as any, // senderTaggingStore + {} as any, // recipientTaggingStore {} as any, // senderAddressBook - {} as any, // capsuleDataProvider - {} as any, // privateEventDataProvider + {} as any, // capsuleStore + {} as any, // privateEventStore new Fr(1), // chainId new Fr(1), // version 0n, // nextBlockTimestamp diff --git a/yarn-project/txe/src/txe_session.ts b/yarn-project/txe/src/txe_session.ts index 88199d10e39c..0f9f9bd1cefa 100644 --- a/yarn-project/txe/src/txe_session.ts +++ b/yarn-project/txe/src/txe_session.ts @@ -5,14 +5,14 @@ import { KeyStore } from '@aztec/key-store'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import type { ProtocolContract } from '@aztec/protocol-contracts'; import { - AddressDataProvider, - CapsuleDataProvider, - NoteDataProvider, + AddressStore, + CapsuleStore, NoteService, - PrivateEventDataProvider, - RecipientTaggingDataProvider, - SenderAddressBook, - SenderTaggingDataProvider, + NoteStore, + PrivateEventStore, + RecipientTaggingStore, + SenderAddressBookStore, + SenderTaggingStore, } from '@aztec/pxe/server'; import { ExecutionNoteCache, @@ -40,8 +40,8 @@ import { TXEOracleTopLevelContext } from './oracle/txe_oracle_top_level_context. import { RPCTranslator } from './rpc_translator.js'; import { TXEStateMachine } from './state_machine/index.js'; import type { ForeignCallArgs, ForeignCallResult } from './util/encoding.js'; -import { TXEAccountDataProvider } from './util/txe_account_data_provider.js'; -import { TXEContractDataProvider } from './util/txe_contract_data_provider.js'; +import { TXEAccountStore } from './util/txe_account_store.js'; +import { TXEContractStore } from './util/txe_contract_store.js'; import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from './utils/block_creation.js'; import { makeTxEffect } from './utils/tx_effect_creation.js'; @@ -121,16 +121,16 @@ export class TXESession implements TXESessionStateHandler { | IPrivateExecutionOracle | IAvmExecutionOracle | ITxeExecutionOracle, - private contractDataProvider: TXEContractDataProvider, - private noteDataProvider: NoteDataProvider, + private contractStore: TXEContractStore, + private noteStore: NoteStore, private keyStore: KeyStore, - private addressDataProvider: AddressDataProvider, - private accountDataProvider: TXEAccountDataProvider, - private senderTaggingDataProvider: SenderTaggingDataProvider, - private recipientTaggingDataProvider: RecipientTaggingDataProvider, - private senderAddressBook: SenderAddressBook, - private capsuleDataProvider: CapsuleDataProvider, - private privateEventDataProvider: PrivateEventDataProvider, + private addressStore: AddressStore, + private accountStore: TXEAccountStore, + private senderTaggingStore: SenderTaggingStore, + private recipientTaggingStore: RecipientTaggingStore, + private senderAddressBookStore: SenderAddressBookStore, + private capsuleStore: CapsuleStore, + private privateEventStore: PrivateEventStore, private chainId: Fr, private version: Fr, private nextBlockTimestamp: bigint, @@ -139,21 +139,21 @@ export class TXESession implements TXESessionStateHandler { static async init(protocolContracts: ProtocolContract[]) { const store = await openTmpStore('txe-session'); - const addressDataProvider = new AddressDataProvider(store); - const privateEventDataProvider = new PrivateEventDataProvider(store); - const contractDataProvider = new TXEContractDataProvider(store); - const noteDataProvider = await NoteDataProvider.create(store); - const senderTaggingDataProvider = new SenderTaggingDataProvider(store); - const recipientTaggingDataProvider = new RecipientTaggingDataProvider(store); - const senderAddressBook = new SenderAddressBook(store); - const capsuleDataProvider = new CapsuleDataProvider(store); + const addressStore = new AddressStore(store); + const privateEventStore = new PrivateEventStore(store); + const contractStore = new TXEContractStore(store); + const noteStore = await NoteStore.create(store); + const senderTaggingStore = new SenderTaggingStore(store); + const recipientTaggingStore = new RecipientTaggingStore(store); + const senderAddressBookStore = new SenderAddressBookStore(store); + const capsuleStore = new CapsuleStore(store); const keyStore = new KeyStore(store); - const accountDataProvider = new TXEAccountDataProvider(store); + const accountStore = new TXEAccountStore(store); // Register protocol contracts. for (const { contractClass, instance, artifact } of protocolContracts) { - await contractDataProvider.addContractArtifact(contractClass.id, artifact); - await contractDataProvider.addContractInstance(instance); + await contractStore.addContractArtifact(contractClass.id, artifact); + await contractStore.addContractInstance(instance); } const stateMachine = await TXEStateMachine.create(store); @@ -164,16 +164,16 @@ export class TXESession implements TXESessionStateHandler { const topLevelOracleHandler = new TXEOracleTopLevelContext( stateMachine, - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, - accountDataProvider, - senderTaggingDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + addressStore, + accountStore, + senderTaggingStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, nextBlockTimestamp, version, chainId, @@ -185,16 +185,16 @@ export class TXESession implements TXESessionStateHandler { createLogger('txe:session'), stateMachine, topLevelOracleHandler, - contractDataProvider, - noteDataProvider, + contractStore, + noteStore, keyStore, - addressDataProvider, - accountDataProvider, - senderTaggingDataProvider, - recipientTaggingDataProvider, - senderAddressBook, - capsuleDataProvider, - privateEventDataProvider, + addressStore, + accountStore, + senderTaggingStore, + recipientTaggingStore, + senderAddressBookStore, + capsuleStore, + privateEventStore, version, chainId, nextBlockTimestamp, @@ -256,16 +256,16 @@ export class TXESession implements TXESessionStateHandler { this.oracleHandler = new TXEOracleTopLevelContext( this.stateMachine, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, - this.accountDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.addressStore, + this.accountStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, this.nextBlockTimestamp, this.version, this.chainId, @@ -288,9 +288,9 @@ export class TXESession implements TXESessionStateHandler { // be removed from the database. // TODO(#12553): make the synchronizer sync here instead and remove this await new NoteService( - this.noteDataProvider, + this.noteStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, + this.stateMachine.anchorBlockStore, ).syncNoteNullifiers(contractAddress); // Private execution has two associated block numbers: the anchor block (i.e. the historical block that is used to @@ -321,17 +321,17 @@ export class TXESession implements TXESessionStateHandler { new HashedValuesCache(), noteCache, taggingIndexCache, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, - this.senderTaggingDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.stateMachine.anchorBlockStore, + this.senderTaggingStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, ); // We store the note and tagging index caches fed into the PrivateExecutionOracle (along with some other auxiliary @@ -378,28 +378,28 @@ export class TXESession implements TXESessionStateHandler { // be removed from the database. // TODO(#12553): make the synchronizer sync here instead and remove this await new NoteService( - this.noteDataProvider, + this.noteStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, + this.stateMachine.anchorBlockStore, ).syncNoteNullifiers(contractAddress); - const anchorBlockHeader = await this.stateMachine.anchorBlockDataProvider.getBlockHeader(); + const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); this.oracleHandler = new UtilityExecutionOracle( contractAddress, [], [], anchorBlockHeader, - this.contractDataProvider, - this.noteDataProvider, + this.contractStore, + this.noteStore, this.keyStore, - this.addressDataProvider, + this.addressStore, this.stateMachine.node, - this.stateMachine.anchorBlockDataProvider, - this.recipientTaggingDataProvider, - this.senderAddressBook, - this.capsuleDataProvider, - this.privateEventDataProvider, + this.stateMachine.anchorBlockStore, + this.recipientTaggingStore, + this.senderAddressBookStore, + this.capsuleStore, + this.privateEventStore, ); this.state = { name: 'UTILITY' }; diff --git a/yarn-project/txe/src/util/txe_account_data_provider.ts b/yarn-project/txe/src/util/txe_account_store.ts similarity index 95% rename from yarn-project/txe/src/util/txe_account_data_provider.ts rename to yarn-project/txe/src/util/txe_account_store.ts index feeb2bb723c8..9141ecd52473 100644 --- a/yarn-project/txe/src/util/txe_account_data_provider.ts +++ b/yarn-project/txe/src/util/txe_account_store.ts @@ -2,7 +2,7 @@ import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import { CompleteAddress } from '@aztec/stdlib/contract'; -export class TXEAccountDataProvider { +export class TXEAccountStore { #accounts: AztecAsyncMap; constructor(store: AztecAsyncKVStore) { diff --git a/yarn-project/txe/src/util/txe_contract_data_provider.ts b/yarn-project/txe/src/util/txe_contract_store.ts similarity index 85% rename from yarn-project/txe/src/util/txe_contract_data_provider.ts rename to yarn-project/txe/src/util/txe_contract_store.ts index d56e0f0e380e..4ca375531318 100644 --- a/yarn-project/txe/src/util/txe_contract_data_provider.ts +++ b/yarn-project/txe/src/util/txe_contract_store.ts @@ -1,15 +1,15 @@ import type { ContractArtifact } from '@aztec/aztec.js/abi'; import { Fr } from '@aztec/aztec.js/fields'; -import { ContractDataProvider } from '@aztec/pxe/server'; +import { ContractStore } from '@aztec/pxe/server'; export type ContractArtifactWithHash = ContractArtifact & { artifactHash: Fr }; /* - * A contract data provider that stores contract artifacts with their hashes. Since + * A contract store that stores contract artifacts with their hashes. Since * TXE typically deploys the same contract again and again for multiple tests, caching * the *very* expensive artifact hash computation improves testing speed significantly. */ -export class TXEContractDataProvider extends ContractDataProvider { +export class TXEContractStore extends ContractStore { #artifactHashes: Map = new Map(); public override async addContractArtifact( diff --git a/yarn-project/txe/src/util/txe_public_contract_data_source.ts b/yarn-project/txe/src/util/txe_public_contract_data_source.ts index 7ea317fc4616..0ec38ae2dcd2 100644 --- a/yarn-project/txe/src/util/txe_public_contract_data_source.ts +++ b/yarn-project/txe/src/util/txe_public_contract_data_source.ts @@ -1,6 +1,6 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; -import type { ContractDataProvider } from '@aztec/pxe/server'; +import type { ContractStore } from '@aztec/pxe/server'; import { type ContractArtifact, FunctionSelector, FunctionType } from '@aztec/stdlib/abi'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import { @@ -16,7 +16,7 @@ export class TXEPublicContractDataSource implements ContractDataSource { #privateFunctionsRoot: Map = new Map(); constructor( private blockNumber: BlockNumber, - private contractDataProvider: ContractDataProvider, + private contractStore: ContractStore, ) {} getBlockNumber(): Promise { @@ -24,11 +24,11 @@ export class TXEPublicContractDataSource implements ContractDataSource { } async getContractClass(id: Fr): Promise { - const contractClass = await this.contractDataProvider.getContractClass(id); + const contractClass = await this.contractStore.getContractClass(id); if (!contractClass) { return; } - const artifact = await this.contractDataProvider.getContractArtifact(id); + const artifact = await this.contractStore.getContractArtifact(id); if (!artifact) { return; } @@ -58,12 +58,12 @@ export class TXEPublicContractDataSource implements ContractDataSource { } async getBytecodeCommitment(id: Fr): Promise { - const contractClass = await this.contractDataProvider.getContractClass(id); + const contractClass = await this.contractStore.getContractClass(id); return contractClass && computePublicBytecodeCommitment(contractClass.packedBytecode); } async getContract(address: AztecAddress): Promise { - const instance = await this.contractDataProvider.getContractInstance(address); + const instance = await this.contractStore.getContractInstance(address); return instance && { ...instance, address }; } @@ -72,12 +72,12 @@ export class TXEPublicContractDataSource implements ContractDataSource { } async getContractArtifact(address: AztecAddress): Promise { - const instance = await this.contractDataProvider.getContractInstance(address); - return instance && this.contractDataProvider.getContractArtifact(instance.currentContractClassId); + const instance = await this.contractStore.getContractInstance(address); + return instance && this.contractStore.getContractArtifact(instance.currentContractClassId); } async getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { - return await this.contractDataProvider.getDebugFunctionName(address, selector); + return await this.contractStore.getDebugFunctionName(address, selector); } registerContractFunctionSignatures(_signatures: []): Promise {