Skip to content

Commit 7967002

Browse files
mverzilliAztecBotbenesjan
authored andcommitted
fix: reject log retrieval requests for not-in-context contracts (#22047)
Closes F-476 --------- Co-authored-by: AztecBot <tech@aztec-labs.com> Co-authored-by: Jan Beneš <janbenes1234@gmail.com>
1 parent 8e28dcf commit 7967002

3 files changed

Lines changed: 24 additions & 5 deletions

File tree

yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
623623
this.logger.getBindings(),
624624
);
625625

626-
const maybeLogRetrievalResponses = await logService.fetchLogsByTag(logRetrievalRequests);
626+
const maybeLogRetrievalResponses = await logService.fetchLogsByTag(contractAddress, logRetrievalRequests);
627627

628628
// Requests are cleared once we're done.
629629
await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, [], this.jobId, scope);

yarn-project/pxe/src/logs/log_service.test.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ describe('LogService', () => {
6565
aztecNode.getPrivateLogsByTags.mockResolvedValue([[]]);
6666
aztecNode.getPublicLogsByTagsFromContract.mockResolvedValue([[]]);
6767
const request = new LogRetrievalRequest(contractAddress, tag);
68-
const responses = await logService.fetchLogsByTag([request]);
68+
const responses = await logService.fetchLogsByTag(contractAddress, [request]);
6969
expect(responses.length).toEqual(1);
7070
expect(responses[0]).toBeNull();
7171
});
@@ -78,7 +78,7 @@ describe('LogService', () => {
7878

7979
const request = new LogRetrievalRequest(contractAddress, new Tag(scopedLog.logData[0]));
8080

81-
const responses = await logService.fetchLogsByTag([request]);
81+
const responses = await logService.fetchLogsByTag(contractAddress, [request]);
8282

8383
expect(responses.length).toEqual(1);
8484
expect(responses[0]).not.toBeNull();
@@ -92,10 +92,20 @@ describe('LogService', () => {
9292

9393
const request = new LogRetrievalRequest(contractAddress, new Tag(scopedLog.logData[0]));
9494

95-
const responses = await logService.fetchLogsByTag([request]);
95+
const responses = await logService.fetchLogsByTag(contractAddress, [request]);
9696

9797
expect(responses.length).toEqual(1);
9898
expect(responses[0]).not.toBeNull();
9999
});
100+
101+
it('rejects a batch where at least one request targets a different contract', async () => {
102+
const differentContract = await AztecAddress.random();
103+
const validRequest = new LogRetrievalRequest(contractAddress, tag);
104+
const invalidRequest = new LogRetrievalRequest(differentContract, new Tag(Fr.random()));
105+
106+
await expect(logService.fetchLogsByTag(contractAddress, [validRequest, invalidRequest])).rejects.toThrow(
107+
/Got a log retrieval request from/,
108+
);
109+
});
100110
});
101111
});

yarn-project/pxe/src/logs/log_service.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ export class LogService {
4141
this.log = createLogger('pxe:log_service', bindings);
4242
}
4343

44-
public async fetchLogsByTag(logRetrievalRequests: LogRetrievalRequest[]): Promise<(LogRetrievalResponse | null)[]> {
44+
public async fetchLogsByTag(
45+
contractAddress: AztecAddress,
46+
logRetrievalRequests: LogRetrievalRequest[],
47+
): Promise<(LogRetrievalResponse | null)[]> {
48+
for (const request of logRetrievalRequests) {
49+
if (!contractAddress.equals(request.contractAddress)) {
50+
throw new Error(`Got a log retrieval request from ${request.contractAddress}, expected ${contractAddress}`);
51+
}
52+
}
53+
4554
return await Promise.all(
4655
logRetrievalRequests.map(async request => {
4756
const [publicLog, privateLog] = await Promise.all([

0 commit comments

Comments
 (0)