From 0aa7f231f2c7c077f5aee7f439895cdc55c9a28b Mon Sep 17 00:00:00 2001 From: Leila Wang Date: Sun, 14 Apr 2024 11:37:12 +0000 Subject: [PATCH] Silo leaf slots in each iteration. --- .../src/sequencer/abstract_phase_manager.ts | 22 +--------------- .../src/sequencer/public_processor.test.ts | 18 ++++++++----- .../simulator/src/public/execution.ts | 25 ++++--------------- .../src/public/public_execution_context.ts | 25 ++++++++++++++++++- 4 files changed, 42 insertions(+), 48 deletions(-) diff --git a/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts b/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts index ca12297b5faa..b8f6fc109b58 100644 --- a/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts +++ b/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts @@ -500,29 +500,9 @@ function patchPublicStorageActionOrdering( // so the returned result will be a subset of the public kernel output. const simPublicDataReads = collectPublicDataReads(execResult); - // verify that each read is in the kernel output - for (const read of simPublicDataReads) { - if (!publicDataReads.find(item => item.equals(read))) { - throw new Error( - `Public data reads from simulator do not match those from public kernel.\nFrom simulator: ${simPublicDataReads - .map(p => p.toFriendlyJSON()) - .join(', ')}\nFrom public kernel: ${publicDataReads.map(i => i.toFriendlyJSON()).join(', ')}`, - ); - } - } const simPublicDataUpdateRequests = collectPublicDataUpdateRequests(execResult); - for (const update of simPublicDataUpdateRequests) { - if (!publicDataUpdateRequests.find(item => item.equals(update))) { - throw new Error( - `Public data update requests from simulator do not match those from public kernel.\nFrom simulator: ${simPublicDataUpdateRequests - .map(p => p.toFriendlyJSON()) - .join(', ')}\nFrom public kernel revertible: ${publicDataUpdateRequests - .map(i => i.toFriendlyJSON()) - .join(', ')}`, - ); - } - } + // We only want to reorder the items from the public inputs of the // most recently processed top/enqueued call. diff --git a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts index bc9c12a1ce0f..32048d28f3c6 100644 --- a/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/public_processor.test.ts @@ -29,7 +29,6 @@ import { StateReference, makeEmptyProof, } from '@aztec/circuits.js'; -import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { fr, makeAztecAddress, makePublicCallRequest, makeSelector } from '@aztec/circuits.js/testing'; import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection'; import { openTmpStore } from '@aztec/kv-store/utils'; @@ -425,11 +424,14 @@ describe('public_processor', () => { const txEffect = toTxEffect(processed[0]); expect(arrayNonEmptyLength(txEffect.publicDataWrites, PublicDataWrite.isEmpty)).toEqual(2); + // TODO: Leave slots should be siloed once we do it in the tail circuit. expect(txEffect.publicDataWrites[0]).toEqual( - new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotA), fr(0x101)), + // new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotA), fr(0x101)), + new PublicDataWrite(contractSlotA, fr(0x101)), ); expect(txEffect.publicDataWrites[1]).toEqual( - new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotC), fr(0x201)), + // new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotC), fr(0x201)), + new PublicDataWrite(contractSlotC, fr(0x201)), ); expect(txEffect.encryptedLogs.getTotalLogCount()).toBe(0); expect(txEffect.unencryptedLogs.getTotalLogCount()).toBe(0); @@ -711,14 +713,18 @@ describe('public_processor', () => { const txEffect = toTxEffect(processed[0]); expect(arrayNonEmptyLength(txEffect.publicDataWrites, PublicDataWrite.isEmpty)).toEqual(3); + // TODO: Leave slots should be siloed once we do it in the tail circuit. expect(txEffect.publicDataWrites[0]).toEqual( - new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotC), fr(0x201)), + // new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotC), fr(0x201)), + new PublicDataWrite(contractSlotC, fr(0x201)), ); expect(txEffect.publicDataWrites[1]).toEqual( - new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotA), fr(0x102)), + // new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotA), fr(0x102)), + new PublicDataWrite(contractSlotA, fr(0x102)), ); expect(txEffect.publicDataWrites[2]).toEqual( - new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotB), fr(0x151)), + // new PublicDataWrite(computePublicDataTreeLeafSlot(baseContractAddress, contractSlotB), fr(0x151)), + new PublicDataWrite(contractSlotB, fr(0x151)), ); expect(txEffect.encryptedLogs.getTotalLogCount()).toBe(0); expect(txEffect.unencryptedLogs.getTotalLogCount()).toBe(0); diff --git a/yarn-project/simulator/src/public/execution.ts b/yarn-project/simulator/src/public/execution.ts index 96ac9e84e97c..6bd508694c67 100644 --- a/yarn-project/simulator/src/public/execution.ts +++ b/yarn-project/simulator/src/public/execution.ts @@ -1,6 +1,5 @@ import { type SimulationError, type UnencryptedFunctionL2Logs } from '@aztec/circuit-types'; import { - type AztecAddress, type ContractStorageRead, type ContractStorageUpdateRequest, type Fr, @@ -12,7 +11,6 @@ import { type SideEffect, type SideEffectLinkedToNoteHash, } from '@aztec/circuits.js'; -import { computePublicDataTreeLeafSlot, computePublicDataTreeValue } from '@aztec/circuits.js/hash'; /** * The public function execution result. @@ -81,10 +79,8 @@ export function isPublicExecutionResult( */ export function collectPublicDataReads(execResult: PublicExecutionResult): PublicDataRead[] { // HACK(#1622): part of temporary hack - may be able to remove this function after public state ordering is fixed - const contractAddress = execResult.execution.callContext.storageContractAddress; - const thisExecPublicDataReads = execResult.contractStorageReads.map(read => - contractStorageReadToPublicDataRead(read, contractAddress), + contractStorageReadToPublicDataRead(read), ); const unsorted = [ ...thisExecPublicDataReads, @@ -101,10 +97,8 @@ export function collectPublicDataReads(execResult: PublicExecutionResult): Publi */ export function collectPublicDataUpdateRequests(execResult: PublicExecutionResult): PublicDataUpdateRequest[] { // HACK(#1622): part of temporary hack - may be able to remove this function after public state ordering is fixed - const contractAddress = execResult.execution.callContext.storageContractAddress; - const thisExecPublicDataUpdateRequests = execResult.contractStorageUpdateRequests.map(update => - contractStorageUpdateRequestToPublicDataUpdateRequest(update, contractAddress), + contractStorageUpdateRequestToPublicDataUpdateRequest(update), ); const unsorted = [ ...thisExecPublicDataUpdateRequests, @@ -119,12 +113,8 @@ export function collectPublicDataUpdateRequests(execResult: PublicExecutionResul * @param contractAddress - the contract address of the read * @returns The public data read. */ -function contractStorageReadToPublicDataRead(read: ContractStorageRead, contractAddress: AztecAddress): PublicDataRead { - return new PublicDataRead( - computePublicDataTreeLeafSlot(contractAddress, read.storageSlot), - computePublicDataTreeValue(read.currentValue), - read.sideEffectCounter!, - ); +function contractStorageReadToPublicDataRead(read: ContractStorageRead): PublicDataRead { + return new PublicDataRead(read.storageSlot, read.currentValue, read.sideEffectCounter!); } /** @@ -135,13 +125,8 @@ function contractStorageReadToPublicDataRead(read: ContractStorageRead, contract */ function contractStorageUpdateRequestToPublicDataUpdateRequest( update: ContractStorageUpdateRequest, - contractAddress: AztecAddress, ): PublicDataUpdateRequest { - return new PublicDataUpdateRequest( - computePublicDataTreeLeafSlot(contractAddress, update.storageSlot), - computePublicDataTreeValue(update.newValue), - update.sideEffectCounter!, - ); + return new PublicDataUpdateRequest(update.storageSlot, update.newValue, update.sideEffectCounter!); } /** diff --git a/yarn-project/simulator/src/public/public_execution_context.ts b/yarn-project/simulator/src/public/public_execution_context.ts index b681df3f95a4..bc9852971f88 100644 --- a/yarn-project/simulator/src/public/public_execution_context.ts +++ b/yarn-project/simulator/src/public/public_execution_context.ts @@ -5,12 +5,15 @@ import { } from '@aztec/circuit-types'; import { CallContext, + ContractStorageRead, + ContractStorageUpdateRequest, FunctionData, type FunctionSelector, GasSettings, type GlobalVariables, type Header, } from '@aztec/circuits.js'; +import { computePublicDataTreeLeafSlot, computePublicDataTreeValue } from '@aztec/circuits.js/hash'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; @@ -91,7 +94,27 @@ export class PublicExecutionContext extends TypedOracle { */ public getStorageActionData() { const [contractStorageReads, contractStorageUpdateRequests] = this.storageActions.collect(); - return { contractStorageReads, contractStorageUpdateRequests }; + // TODO: Silo values in public tail circuit. + return { + contractStorageReads: contractStorageReads.map(r => + r.isEmpty() + ? r + : new ContractStorageRead( + computePublicDataTreeLeafSlot(this.execution.callContext.storageContractAddress, r.storageSlot), + computePublicDataTreeValue(r.currentValue), + r.sideEffectCounter, + ), + ), + contractStorageUpdateRequests: contractStorageUpdateRequests.map(w => + w.isEmpty() + ? w + : new ContractStorageUpdateRequest( + computePublicDataTreeLeafSlot(this.execution.callContext.storageContractAddress, w.storageSlot), + computePublicDataTreeValue(w.newValue), + w.sideEffectCounter, + ), + ), + }; } /**