diff --git a/yarn-project/end-to-end/src/bench/client_flows/amm.test.ts b/yarn-project/end-to-end/src/bench/client_flows/amm.test.ts index 8e057945b9de..b3b33244d019 100644 --- a/yarn-project/end-to-end/src/bench/client_flows/amm.test.ts +++ b/yarn-project/end-to-end/src/bench/client_flows/amm.test.ts @@ -22,7 +22,7 @@ const AMOUNT_PER_NOTE = 1_000_000; const MINIMUM_NOTES_FOR_RECURSION_LEVEL = [0, 2, 10]; // Set to true to print out the round trip information to the console. -const DEBUG_ROUND_TRIPS = true; +const DEBUG_ROUND_TRIPS = false; // Expected number of node round trips per account contract and payment method. const EXPECTED_ROUND_TRIPS: Record = { diff --git a/yarn-project/pxe/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts b/yarn-project/pxe/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts index 34eae94968ac..3418d14d6c31 100644 --- a/yarn-project/pxe/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +++ b/yarn-project/pxe/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts @@ -157,16 +157,6 @@ export class PrivateKernelResetPrivateInputsBuilder { allowRemainder, ); - const previousVkMembershipWitness = await oracle.getVkMembershipWitness( - this.previousKernelOutput.verificationKey.keyAsFields, - ); - const vkData = new VkData( - this.previousKernelOutput.verificationKey, - Number(previousVkMembershipWitness.leafIndex), - previousVkMembershipWitness.siblingPath, - ); - const previousKernelData = new PrivateKernelData(this.previousKernelOutput.publicInputs, vkData); - this.reduceReadRequestActions( this.noteHashResetActions, dimensions.NOTE_HASH_PENDING_READ, @@ -178,29 +168,51 @@ export class PrivateKernelResetPrivateInputsBuilder { dimensions.NULLIFIER_SETTLED_READ, ); - // TODO: Enable padding when we have a better idea what are the final amounts we should pad to. - const paddedSideEffects = PaddedSideEffects.empty(); - - return new PrivateKernelResetCircuitPrivateInputs( - previousKernelData, - paddedSideEffects, - new PrivateKernelResetHints( - await buildNoteHashReadRequestHintsFromResetActions( + // Execute all the expensive node querying operations in parallel. + const [previousVkMembershipWitness, noteHashReadRequestHints, nullifierReadRequestHints, keyValidationHints] = + await Promise.all([ + oracle.getVkMembershipWitness(this.previousKernelOutput.verificationKey.keyAsFields), + buildNoteHashReadRequestHintsFromResetActions< + typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX + >( oracle, this.previousKernel.validationRequests.noteHashReadRequests, this.previousKernel.end.noteHashes, this.noteHashResetActions, ), - await buildNullifierReadRequestHintsFromResetActions( + buildNullifierReadRequestHintsFromResetActions< + typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, + typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX + >( { getNullifierMembershipWitness: getNullifierMembershipWitnessResolver(oracle) }, this.previousKernel.validationRequests.nullifierReadRequests, this.nullifierResetActions, ), - await getMasterSecretKeysAndAppKeyGenerators( + getMasterSecretKeysAndAppKeyGenerators( this.previousKernel.validationRequests.scopedKeyValidationRequestsAndGenerators, dimensions.KEY_VALIDATION, oracle, ), + ]); + + const vkData = new VkData( + this.previousKernelOutput.verificationKey, + Number(previousVkMembershipWitness.leafIndex), + previousVkMembershipWitness.siblingPath, + ); + const previousKernelData = new PrivateKernelData(this.previousKernelOutput.publicInputs, vkData); + + // TODO: Enable padding when we have a better idea what are the final amounts we should pad to. + const paddedSideEffects = PaddedSideEffects.empty(); + + return new PrivateKernelResetCircuitPrivateInputs( + previousKernelData, + paddedSideEffects, + new PrivateKernelResetHints( + noteHashReadRequestHints, + nullifierReadRequestHints, + keyValidationHints, this.transientDataSquashingHints, ), dimensions, diff --git a/yarn-project/stdlib/src/kernel/hints/build_note_hash_read_request_hints.ts b/yarn-project/stdlib/src/kernel/hints/build_note_hash_read_request_hints.ts index 9d94313872ee..9316818471a5 100644 --- a/yarn-project/stdlib/src/kernel/hints/build_note_hash_read_request_hints.ts +++ b/yarn-project/stdlib/src/kernel/hints/build_note_hash_read_request_hints.ts @@ -76,17 +76,28 @@ export async function buildNoteHashReadRequestHintsFromResetActions oracle.getNoteHashMembershipWitness(readRequest.value)), + ); + + // Add settled read requests to builder + for (let i = 0; i < settledRequests.length; i++) { + const membershipWitness = membershipWitnesses[i]; + if (!membershipWitness) { + throw new Error('Read request is reading an unknown note hash.'); + } + builder.addSettledReadRequest(settledRequests[i].index, membershipWitness, settledRequests[i].readRequest.value); + } + const noteHashMap: Map = new Map(); noteHashes.getActiveItems().forEach((noteHash, index) => { const value = noteHash.value.toBigInt(); diff --git a/yarn-project/stdlib/src/kernel/hints/build_nullifier_read_request_hints.ts b/yarn-project/stdlib/src/kernel/hints/build_nullifier_read_request_hints.ts index 29a2af4cdea6..6c4f30e19a67 100644 --- a/yarn-project/stdlib/src/kernel/hints/build_nullifier_read_request_hints.ts +++ b/yarn-project/stdlib/src/kernel/hints/build_nullifier_read_request_hints.ts @@ -82,21 +82,33 @@ export async function buildNullifierReadRequestHintsFromResetActions readRequest.value) + : await Promise.all( + settledRequests.map(({ readRequest }) => siloNullifier(readRequest.contractAddress, readRequest.value)), + ); + + // Fetch all membership witnesses in parallel + const membershipWitnesses = await Promise.all(siloedValues.map(value => oracle.getNullifierMembershipWitness(value))); + + // Add settled read requests to builder + for (let i = 0; i < settledRequests.length; i++) { + builder.addSettledReadRequest( + settledRequests[i].index, + membershipWitnesses[i].membershipWitness, + membershipWitnesses[i].leafPreimage, + ); + } + return builder.toHints(); }