Skip to content

Commit 01bdd60

Browse files
committed
wip
1 parent 0c9d4cd commit 01bdd60

File tree

2 files changed

+50
-28
lines changed

2 files changed

+50
-28
lines changed

yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.test.ts

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ describe('loadLogsForRange', () => {
2929
return SiloedTag.compute(tag, app);
3030
}
3131

32-
function makeLog(txHash: TxHash, blockHash: L2BlockHash, blockNumber: number, tag: Fr) {
33-
return new TxScopedL2Log(txHash, 0, 0, BlockNumber(blockNumber), blockHash, PrivateLog.random(tag));
32+
function makeLog(txHash: TxHash, blockHash: L2BlockHash, blockNumber: number, tag: SiloedTag) {
33+
return new TxScopedL2Log(txHash, 0, 0, BlockNumber(blockNumber), blockHash, PrivateLog.random(tag.value));
3434
}
3535

3636
beforeAll(async () => {
@@ -64,7 +64,7 @@ describe('loadLogsForRange', () => {
6464

6565
aztecNode.getLogsByTags.mockImplementation((tags: Fr[]) => {
6666
return Promise.resolve(
67-
tags.map((t: Fr) => (t.equals(tag.value) ? [makeLog(txHash, blockHash, blockNumber, tag.value)] : [])),
67+
tags.map((t: Fr) => (t.equals(tag.value) ? [makeLog(txHash, blockHash, blockNumber, tag)] : [])),
6868
);
6969
});
7070

@@ -92,7 +92,7 @@ describe('loadLogsForRange', () => {
9292
const tag = await computeSiloedTagForIndex(index);
9393
const blockHeader = makeBlockHeader(0, { timestamp });
9494

95-
const privateLog = makeLog(txHash, blockHash, blockNumber, tag.value);
95+
const privateLog = makeLog(txHash, blockHash, blockNumber, tag);
9696
const publicLog = new TxScopedL2Log(
9797
TxHash.random(),
9898
0,
@@ -140,9 +140,9 @@ describe('loadLogsForRange', () => {
140140
return Promise.resolve(
141141
tags.map((t: Fr) => {
142142
if (t.equals(tag1.value)) {
143-
return [makeLog(txHash1, blockHash1, blockNumber1, tag1.value)];
143+
return [makeLog(txHash1, blockHash1, blockNumber1, tag1)];
144144
} else if (t.equals(tag2.value)) {
145-
return [makeLog(txHash2, blockHash2, blockNumber2, tag2.value)];
145+
return [makeLog(txHash2, blockHash2, blockNumber2, tag2)];
146146
}
147147
return [];
148148
}),
@@ -186,9 +186,9 @@ describe('loadLogsForRange', () => {
186186
return Promise.resolve(
187187
tags.map((t: Fr) => {
188188
if (t.equals(tag1.value)) {
189-
return [makeLog(txHash1, blockHash, blockNumber, tag1.value)];
189+
return [makeLog(txHash1, blockHash, blockNumber, tag1)];
190190
} else if (t.equals(tag2.value)) {
191-
return [makeLog(txHash2, blockHash, blockNumber, tag2.value)];
191+
return [makeLog(txHash2, blockHash, blockNumber, tag2)];
192192
}
193193
return [];
194194
}),
@@ -230,9 +230,9 @@ describe('loadLogsForRange', () => {
230230
return Promise.resolve(
231231
tags.map((t: Fr) => {
232232
if (t.equals(tagAtStart.value)) {
233-
return [makeLog(txHashAtStart, blockHash, 5, tagAtStart.value)];
233+
return [makeLog(txHashAtStart, blockHash, 5, tagAtStart)];
234234
} else if (t.equals(tagAtEnd.value)) {
235-
return [makeLog(txHashAtEnd, blockHash, 6, tagAtEnd.value)];
235+
return [makeLog(txHashAtEnd, blockHash, 6, tagAtEnd)];
236236
}
237237
return [];
238238
}),
@@ -254,26 +254,49 @@ describe('loadLogsForRange', () => {
254254
expect(result[0].log.txHash.equals(txHashAtStart)).toBe(true);
255255
});
256256

257-
it('throws error when block header is not found', async () => {
258-
const txHash = TxHash.random();
259-
const blockHash = L2BlockHash.random();
260-
const blockNumber = 5;
261-
const index = 3;
262-
const tag = await computeSiloedTagForIndex(index);
257+
it('ignores logs from reorged blocks', async () => {
258+
const txHashReorged = TxHash.random();
259+
const txHashValid = TxHash.random();
260+
const blockHashReorged = L2BlockHash.random();
261+
const blockHashValid = L2BlockHash.random();
262+
const blockNumberReorged = 5;
263+
const blockNumberValid = 6;
264+
const index1 = 3;
265+
const index2 = 4;
266+
const timestamp = 2000n;
267+
const tag1 = await computeSiloedTagForIndex(index1);
268+
const tag2 = await computeSiloedTagForIndex(index2);
269+
const blockHeaderValid = makeBlockHeader(1, { timestamp });
263270

264271
aztecNode.getLogsByTags.mockImplementation((tags: Fr[]) => {
265272
return Promise.resolve(
266-
tags.map((t: Fr) => (t.equals(tag.value) ? [makeLog(txHash, blockHash, blockNumber, tag.value)] : [])),
273+
tags.map((t: Fr) => {
274+
if (t.equals(tag1.value)) {
275+
return [makeLog(txHashReorged, blockHashReorged, blockNumberReorged, tag1)];
276+
} else if (t.equals(tag2.value)) {
277+
return [makeLog(txHashValid, blockHashValid, blockNumberValid, tag2)];
278+
}
279+
return [];
280+
}),
267281
);
268282
});
269283

270-
aztecNode.getBlockHeaderByHash.mockImplementation(() => {
284+
aztecNode.getBlockHeaderByHash.mockImplementation((hash: Fr) => {
285+
// Block header for reorged block is not found (returns undefined)
286+
if (hash.toBigInt() === blockHashReorged.toBigInt()) {
287+
return Promise.resolve(undefined);
288+
} else if (hash.toBigInt() === blockHashValid.toBigInt()) {
289+
return Promise.resolve(blockHeaderValid);
290+
}
271291
return Promise.resolve(undefined);
272292
});
273293

274-
await expect(loadLogsForRange(secret, app, aztecNode, 0, 10, NON_INTERFERING_ANCHOR_BLOCK_NUMBER)).rejects.toThrow(
275-
'not found when syncing logs. This could be a reorg.',
276-
);
294+
const result = await loadLogsForRange(secret, app, aztecNode, 0, 10, NON_INTERFERING_ANCHOR_BLOCK_NUMBER);
295+
296+
// Should only include the log from the valid block, ignoring the log from the reorged block
297+
expect(result).toHaveLength(1);
298+
expect(result[0].log.txHash.equals(txHashValid)).toBe(true);
299+
expect(result[0].taggingIndex).toBe(index2);
277300
});
278301

279302
it('handles multiple logs at the same index', async () => {
@@ -294,10 +317,7 @@ describe('loadLogsForRange', () => {
294317
return Promise.resolve(
295318
tags.map((t: Fr) =>
296319
t.equals(tag.value)
297-
? [
298-
makeLog(txHash1, blockHash1, blockNumber1, tag.value),
299-
makeLog(txHash2, blockHash2, blockNumber2, tag.value),
300-
]
320+
? [makeLog(txHash1, blockHash1, blockNumber1, tag), makeLog(txHash2, blockHash2, blockNumber2, tag)]
301321
: [],
302322
),
303323
);
@@ -340,9 +360,9 @@ describe('loadLogsForRange', () => {
340360
tags.map((t: Fr) =>
341361
t.equals(tag.value)
342362
? [
343-
makeLog(TxHash.random(), blockHashBefore, anchorBlockNumber - 1, tag.value),
344-
makeLog(TxHash.random(), blockHashAtAnchor, anchorBlockNumber, tag.value),
345-
makeLog(TxHash.random(), blockHashAfter, anchorBlockNumber + 1, tag.value),
363+
makeLog(TxHash.random(), blockHashBefore, anchorBlockNumber - 1, tag),
364+
makeLog(TxHash.random(), blockHashAtAnchor, anchorBlockNumber, tag),
365+
makeLog(TxHash.random(), blockHashAfter, anchorBlockNumber + 1, tag),
346366
]
347367
: [],
348368
),

yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { Tag } from '../../tag.js';
1010
/**
1111
* Gets private logs with their corresponding block timestamps and tagging indexes for the given index range, `app` and
1212
* `secret`. At most load logs from blocks up to and including `anchorBlockNumber`.
13+
*
14+
* TODO: Optimize Aztec Node API such that this function performs only a single call.
1315
*/
1416
export async function loadLogsForRange(
1517
secret: DirectionalAppTaggingSecret,

0 commit comments

Comments
 (0)