Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions yarn-project/archiver/src/modules/data_source_base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import {
getProofSubmissionDeadlineEpoch,
getSlotRangeForEpoch,
} from '@aztec/stdlib/epoch-helpers';
import type { L2LogsSource } from '@aztec/stdlib/interfaces/server';
import type { L2LogsSource, ResolvedLogsQuery } from '@aztec/stdlib/interfaces/server';
import type { LogResult, PrivateLogsQuery, PublicLogsQuery } from '@aztec/stdlib/logs';
import type { L1ToL2MessageSource, L2ToL1MembershipWitness } from '@aztec/stdlib/messaging';
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
Expand Down Expand Up @@ -282,11 +282,11 @@ export abstract class ArchiverDataSourceBase
return (await this.stores.blocks.getPendingChainValidationStatus()) ?? { valid: true };
}

public getPrivateLogsByTags(query: PrivateLogsQuery): Promise<LogResult[][]> {
public getPrivateLogsByTags(query: ResolvedLogsQuery<PrivateLogsQuery>): Promise<LogResult[][]> {
return this.stores.logs.getPrivateLogsByTags(query);
}

public getPublicLogsByTags(query: PublicLogsQuery): Promise<LogResult[][]> {
public getPublicLogsByTags(query: ResolvedLogsQuery<PublicLogsQuery>): Promise<LogResult[][]> {
return this.stores.logs.getPublicLogsByTags(query);
}

Expand Down
19 changes: 19 additions & 0 deletions yarn-project/archiver/src/store/log_store.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,25 @@ describe('LogStore', () => {
);
});

it('caps results at the anchor block', async () => {
const tag = new SiloedTag(new Fr(0x8888));
const ckpts = await buildChainedCheckpointsWithLogs(2, {
numTxsPerBlock: 1,
privateLogs: { numLogsPerTx: 1 },
});
for (const ckpt of ckpts) {
ckpt.checkpoint.blocks[0].body.txEffects[0].privateLogs[0].fields[0] = tag.value;
}
await blockStore.addCheckpoints(ckpts);
await logStore.addLogs(ckpts.map(c => c.checkpoint.blocks[0]));

// Anchored at block 1, so the log in block 2 is past the anchor and only the first one comes back.
const referenceBlock = await ckpts[0].checkpoint.blocks[0].hash();
const [res] = await logStore.getPrivateLogsByTags({ tags: [tag], referenceBlock });

expect(res.map(log => log.blockNumber)).toEqual([BlockNumber(1)]);
});

it('attaches noteHashes + nullifiers only when includeEffects is set', async () => {
const tag = new SiloedTag(new Fr(0xeeee));
const ckpt = await makeCheckpointWithLogs(1, { numTxsPerBlock: 1, privateLogs: { numLogsPerTx: 1 } });
Expand Down
19 changes: 12 additions & 7 deletions yarn-project/archiver/src/store/log_store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { createLogger } from '@aztec/foundation/log';
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
import type { BlockHash, L2Block } from '@aztec/stdlib/block';
import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
import type { ResolvedLogsQuery } from '@aztec/stdlib/interfaces/server';
import type {
LogCursor,
LogResult,
Expand Down Expand Up @@ -187,13 +188,13 @@ export class LogStore {
}

/** Returns one inner array per element of `query.tags`, in input order. */
getPrivateLogsByTags(query: PrivateLogsQuery): Promise<LogResult[][]> {
getPrivateLogsByTags(query: ResolvedLogsQuery<PrivateLogsQuery>): Promise<LogResult[][]> {
LogStore.#validateQuery(query);
return this.db.transactionAsync(() => this.#runQuery(query, /* contractHex */ undefined));
}

/** Returns one inner array per element of `query.tags`, in input order. */
getPublicLogsByTags(query: PublicLogsQuery): Promise<LogResult[][]> {
getPublicLogsByTags(query: ResolvedLogsQuery<PublicLogsQuery>): Promise<LogResult[][]> {
LogStore.#validateQuery(query);
return this.db.transactionAsync(() => this.#runQuery(query, fieldHex(query.contractAddress)));
}
Expand All @@ -204,7 +205,10 @@ export class LogStore {
}
}

async #runQuery(query: PrivateLogsQuery | PublicLogsQuery, contractHex: string | undefined): Promise<LogResult[][]> {
async #runQuery(
query: ResolvedLogsQuery<PrivateLogsQuery> | ResolvedLogsQuery<PublicLogsQuery>,
contractHex: string | undefined,
): Promise<LogResult[][]> {
const isPublic = contractHex !== undefined;
const tags = (query.tags as ReadonlyArray<TagQuery<Tag | SiloedTag>>) ?? [];
const primaryMap = isPublic ? this.#publicLogs : this.#privateLogs;
Expand All @@ -213,14 +217,15 @@ export class LogStore {
// genesis block is a valid anchor during early sync but is synthetic and never indexed in the block
// store, so resolve it directly to the genesis block number rather than mistaking it for a reorg.
let referenceBlockNumber: number | undefined;
if (query.referenceBlock) {
if (query.referenceBlock.equals(this.genesisBlockHash)) {
const referenceBlockHash = query.referenceBlock;
if (referenceBlockHash) {
if (referenceBlockHash.equals(this.genesisBlockHash)) {
referenceBlockNumber = INITIAL_L2_BLOCK_NUM - 1;
} else {
const refBlk = await this.blockStore.getBlockData({ hash: query.referenceBlock });
const refBlk = await this.blockStore.getBlockData({ hash: referenceBlockHash });
if (!refBlk) {
throw new Error(
`Reference block ${query.referenceBlock.toString()} not found in the node. This might indicate a reorg has occurred.`,
`Reference block ${referenceBlockHash.toString()} not found in the node. This might indicate a reorg has occurred.`,
);
}
referenceBlockNumber = refBlk.header.globalVariables.blockNumber;
Expand Down
Loading
Loading