From 74490fb629c00ba94508e7c7193b47ee80e8b1e8 Mon Sep 17 00:00:00 2001 From: jeanmon Date: Wed, 31 May 2023 14:00:09 +0000 Subject: [PATCH 1/6] 502 - rename private_kernel__sim into private_kernel__sim_init --- .../cpp/src/aztec3/circuits/kernel/private/.test.cpp | 12 ++++++------ .../src/aztec3/circuits/kernel/private/c_bind.cpp | 12 ++++++------ .../cpp/src/aztec3/circuits/kernel/private/c_bind.h | 12 ++++++------ .../circuits.js/src/kernel/private_kernel.ts | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp index ff441857bedc..bd3f4ce9fefe 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp @@ -651,12 +651,12 @@ TEST(private_kernel_tests, circuit_create_proof_cbinds) uint8_t const* public_inputs_buf = nullptr; size_t public_inputs_size = 0; // info("Simulating to generate public inputs..."); - uint8_t* const circuit_failure_ptr = private_kernel__sim(signed_constructor_tx_request_vec.data(), - nullptr, // no previous kernel on first iteration - private_constructor_call_vec.data(), - true, // first iteration - &public_inputs_size, - &public_inputs_buf); + uint8_t* const circuit_failure_ptr = private_kernel__sim_init(signed_constructor_tx_request_vec.data(), + nullptr, // no previous kernel on first iteration + private_constructor_call_vec.data(), + true, // first iteration + &public_inputs_size, + &public_inputs_buf); ASSERT_TRUE(circuit_failure_ptr == nullptr); // TODO better equality check diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp index 4d3876417d77..63e887e22a34 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp @@ -65,12 +65,12 @@ CBIND(private_kernel__dummy_previous_kernel, []() { return dummy_previous_kernel // TODO(dbanks12): comment about how public_inputs is a confusing name // returns size of public inputs -WASM_EXPORT uint8_t* private_kernel__sim(uint8_t const* signed_tx_request_buf, - uint8_t const* previous_kernel_buf, - uint8_t const* private_call_buf, - bool first_iteration, - size_t* private_kernel_public_inputs_size_out, - uint8_t const** private_kernel_public_inputs_buf) +WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, + uint8_t const* previous_kernel_buf, + uint8_t const* private_call_buf, + bool first_iteration, + size_t* private_kernel_public_inputs_size_out, + uint8_t const** private_kernel_public_inputs_buf) { DummyComposer composer = DummyComposer("private_kernel__sim"); PrivateCallData private_call_data; diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h index 9dc5a7f5841a..30bda67eaa56 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h @@ -7,12 +7,12 @@ WASM_EXPORT size_t private_kernel__init_proving_key(uint8_t const** pk_buf); WASM_EXPORT size_t private_kernel__init_verification_key(uint8_t const* pk_buf, uint8_t const** vk_buf); CBIND_DECL(private_kernel__dummy_previous_kernel); -WASM_EXPORT uint8_t* private_kernel__sim(uint8_t const* signed_tx_request_buf, - uint8_t const* previous_kernel_buf, - uint8_t const* private_call_buf, - bool first_iteration, - size_t* private_kernel_public_inputs_size_out, - uint8_t const** private_kernel_public_inputs_buf); +WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, + uint8_t const* previous_kernel_buf, + uint8_t const* private_call_buf, + bool first_iteration, + size_t* private_kernel_public_inputs_size_out, + uint8_t const** private_kernel_public_inputs_buf); WASM_EXPORT size_t private_kernel__prove(uint8_t const* signed_tx_request_buf, uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, diff --git a/yarn-project/circuits.js/src/kernel/private_kernel.ts b/yarn-project/circuits.js/src/kernel/private_kernel.ts index 2f4eec6826e6..090dde6dd6c5 100644 --- a/yarn-project/circuits.js/src/kernel/private_kernel.ts +++ b/yarn-project/circuits.js/src/kernel/private_kernel.ts @@ -120,7 +120,7 @@ export async function privateKernelSim( const outputBufPtrPtr = wasm.call('bbmalloc', 4); // Run and read outputs const circuitFailureBufPtr = await wasm.asyncCall( - 'private_kernel__sim', + 'private_kernel__sim_init', 0, previousKernelBufferOffset, privateCallDataOffset, From 94291bb1403cb98a36eb121cfaba67927dd772e3 Mon Sep 17 00:00:00 2001 From: jeanmon Date: Wed, 31 May 2023 14:21:37 +0000 Subject: [PATCH 2/6] 502 - create inner version of private_kernel__sim and adapt internal logic --- .../aztec3/circuits/kernel/private/.test.cpp | 1 - .../aztec3/circuits/kernel/private/c_bind.cpp | 60 ++++++++++++------- .../aztec3/circuits/kernel/private/c_bind.h | 5 +- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp index bd3f4ce9fefe..bc436dd13825 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp @@ -654,7 +654,6 @@ TEST(private_kernel_tests, circuit_create_proof_cbinds) uint8_t* const circuit_failure_ptr = private_kernel__sim_init(signed_constructor_tx_request_vec.data(), nullptr, // no previous kernel on first iteration private_constructor_call_vec.data(), - true, // first iteration &public_inputs_size, &public_inputs_buf); ASSERT_TRUE(circuit_failure_ptr == nullptr); diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp index 63e887e22a34..98691f9ab0c2 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp @@ -68,40 +68,56 @@ CBIND(private_kernel__dummy_previous_kernel, []() { return dummy_previous_kernel WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, - bool first_iteration, size_t* private_kernel_public_inputs_size_out, uint8_t const** private_kernel_public_inputs_buf) { - DummyComposer composer = DummyComposer("private_kernel__sim"); + DummyComposer composer = DummyComposer("private_kernel__sim_init"); + PrivateCallData private_call_data; read(private_call_buf, private_call_data); - KernelCircuitPublicInputs public_inputs = KernelCircuitPublicInputs{}; + SignedTxRequest signed_tx_request; + read(signed_tx_request_buf, signed_tx_request); - if (first_iteration) { - SignedTxRequest signed_tx_request; - read(signed_tx_request_buf, signed_tx_request); + // Assert that previous_kernel_buf is empty (i.e. nullptr) + ASSERT(previous_kernel_buf == nullptr); - // Assert that previous_kernel_buf is empty (i.e. nullptr) - ASSERT(previous_kernel_buf == nullptr); + PrivateKernelInputsInit const private_inputs = PrivateKernelInputsInit{ + .signed_tx_request = signed_tx_request, + .private_call = private_call_data, + }; - PrivateKernelInputsInit const private_inputs = PrivateKernelInputsInit{ - .signed_tx_request = signed_tx_request, - .private_call = private_call_data, - }; + auto public_inputs = native_private_kernel_circuit_initial(composer, private_inputs); - public_inputs = native_private_kernel_circuit_initial(composer, private_inputs); - } else { - PreviousKernelData previous_kernel; - read(previous_kernel_buf, previous_kernel); + // serialize public inputs to bytes vec + std::vector public_inputs_vec; + write(public_inputs_vec, public_inputs); + // copy public inputs to output buffer + auto* raw_public_inputs_buf = (uint8_t*)malloc(public_inputs_vec.size()); + memcpy(raw_public_inputs_buf, (void*)public_inputs_vec.data(), public_inputs_vec.size()); + *private_kernel_public_inputs_buf = raw_public_inputs_buf; + *private_kernel_public_inputs_size_out = public_inputs_vec.size(); + return composer.alloc_and_serialize_first_failure(); +} - PrivateKernelInputsInner const private_inputs = PrivateKernelInputsInner{ - .previous_kernel = previous_kernel, - .private_call = private_call_data, - }; +WASM_EXPORT uint8_t* private_kernel__sim_inner(uint8_t const* previous_kernel_buf, + uint8_t const* private_call_buf, + size_t* private_kernel_public_inputs_size_out, + uint8_t const** private_kernel_public_inputs_buf) +{ + DummyComposer composer = DummyComposer("private_kernel__sim_inner"); + PrivateCallData private_call_data; + read(private_call_buf, private_call_data); - public_inputs = native_private_kernel_circuit_inner(composer, private_inputs); - } + PreviousKernelData previous_kernel; + read(previous_kernel_buf, previous_kernel); + + PrivateKernelInputsInner const private_inputs = PrivateKernelInputsInner{ + .previous_kernel = previous_kernel, + .private_call = private_call_data, + }; + + auto public_inputs = native_private_kernel_circuit_inner(composer, private_inputs); // serialize public inputs to bytes vec std::vector public_inputs_vec; diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h index 30bda67eaa56..422d918aee5b 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h @@ -10,9 +10,12 @@ CBIND_DECL(private_kernel__dummy_previous_kernel); WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, - bool first_iteration, size_t* private_kernel_public_inputs_size_out, uint8_t const** private_kernel_public_inputs_buf); +WASM_EXPORT uint8_t* private_kernel__sim_inner(uint8_t const* previous_kernel_buf, + uint8_t const* private_call_buf, + size_t* private_kernel_public_inputs_size_out, + uint8_t const** private_kernel_public_inputs_buf); WASM_EXPORT size_t private_kernel__prove(uint8_t const* signed_tx_request_buf, uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, From 7c8e3da14b02998b3d3cbe69c5376bc27face173 Mon Sep 17 00:00:00 2001 From: jeanmon Date: Thu, 1 Jun 2023 07:40:12 +0000 Subject: [PATCH 3/6] Propagate inner/init split in ts code and adapt tests typo in ts --- .../aztec3/circuits/kernel/private/.test.cpp | 1 - .../aztec3/circuits/kernel/private/c_bind.cpp | 4 -- .../aztec3/circuits/kernel/private/c_bind.h | 1 - .../src/kernel_prover/kernel_prover.test.ts | 18 +++--- .../src/kernel_prover/kernel_prover.ts | 17 ++++-- .../src/kernel_prover/proof_creator.ts | 50 ++++++++++++---- .../circuits.js/src/kernel/private_kernel.ts | 60 +++++++++++++++---- 7 files changed, 108 insertions(+), 43 deletions(-) diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp index bc436dd13825..534dde73a4bc 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/.test.cpp @@ -652,7 +652,6 @@ TEST(private_kernel_tests, circuit_create_proof_cbinds) size_t public_inputs_size = 0; // info("Simulating to generate public inputs..."); uint8_t* const circuit_failure_ptr = private_kernel__sim_init(signed_constructor_tx_request_vec.data(), - nullptr, // no previous kernel on first iteration private_constructor_call_vec.data(), &public_inputs_size, &public_inputs_buf); diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp index 98691f9ab0c2..e6578c45be15 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.cpp @@ -66,7 +66,6 @@ CBIND(private_kernel__dummy_previous_kernel, []() { return dummy_previous_kernel // TODO(dbanks12): comment about how public_inputs is a confusing name // returns size of public inputs WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, - uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, size_t* private_kernel_public_inputs_size_out, uint8_t const** private_kernel_public_inputs_buf) @@ -79,9 +78,6 @@ WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_b SignedTxRequest signed_tx_request; read(signed_tx_request_buf, signed_tx_request); - // Assert that previous_kernel_buf is empty (i.e. nullptr) - ASSERT(previous_kernel_buf == nullptr); - PrivateKernelInputsInit const private_inputs = PrivateKernelInputsInit{ .signed_tx_request = signed_tx_request, .private_call = private_call_data, diff --git a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h index 422d918aee5b..c0a095727f27 100644 --- a/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h +++ b/circuits/cpp/src/aztec3/circuits/kernel/private/c_bind.h @@ -8,7 +8,6 @@ WASM_EXPORT size_t private_kernel__init_proving_key(uint8_t const** pk_buf); WASM_EXPORT size_t private_kernel__init_verification_key(uint8_t const* pk_buf, uint8_t const** vk_buf); CBIND_DECL(private_kernel__dummy_previous_kernel); WASM_EXPORT uint8_t* private_kernel__sim_init(uint8_t const* signed_tx_request_buf, - uint8_t const* previous_kernel_buf, uint8_t const* private_call_buf, size_t* private_kernel_public_inputs_size_out, uint8_t const** private_kernel_public_inputs_buf); diff --git a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts index 67dfab99c80e..ca055c4cb6b7 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts @@ -69,9 +69,12 @@ describe('Kernel Prover', () => { }; const expectExecution = (fns: string[]) => { - const callStackItems = proofCreator.createProof.mock.calls.map(args => args[2].callStackItem.functionData); - expect(callStackItems).toEqual(fns); - proofCreator.createProof.mockClear(); + const callStackItemsInit = proofCreator.createProofInit.mock.calls.map(args => args[1].callStackItem.functionData); + const callStackItemsInner = proofCreator.createProofInner.mock.calls.map(args => args[1].callStackItem.functionData); + + expect(callStackItemsInit.concat(callStackItemsInner)).toEqual(fns); + proofCreator.createProofInner.mockClear(); + proofCreator.createProofInit.mockClear(); }; const expectOutputNotes = (outputNotes: OutputNoteData[], expectedNoteIndices: number[]) => { @@ -94,7 +97,8 @@ describe('Kernel Prover', () => { proofCreator.getSiloedCommitments.mockImplementation(publicInputs => Promise.resolve(publicInputs.newCommitments.map(createFakeSiloedCommitment)), ); - proofCreator.createProof.mockResolvedValue(createProofOutput([])); + proofCreator.createProofInit.mockResolvedValue(createProofOutput([])); + proofCreator.createProofInner.mockResolvedValue(createProofOutput([])); prover = new KernelProver(oracle, proofCreator); }); @@ -141,9 +145,9 @@ describe('Kernel Prover', () => { const resultA = createExecutionResult('a', [1, 2, 3]); const resultB = createExecutionResult('b', [4]); const resultC = createExecutionResult('c', [5, 6]); - proofCreator.createProof.mockResolvedValueOnce(createProofOutput([1, 2, 3])); - proofCreator.createProof.mockResolvedValueOnce(createProofOutput([1, 3, 4])); - proofCreator.createProof.mockResolvedValueOnce(createProofOutput([1, 3, 5, 6])); + proofCreator.createProofInit.mockResolvedValueOnce(createProofOutput([1, 2, 3])); + proofCreator.createProofInner.mockResolvedValueOnce(createProofOutput([1, 3, 4])); + proofCreator.createProofInner.mockResolvedValueOnce(createProofOutput([1, 3, 5, 6])); const executionResult = { ...resultA, diff --git a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts index 9cfd08d440cc..a0f5f6ffe645 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts @@ -114,12 +114,17 @@ export class KernelProver { const privateCallData = await this.createPrivateCallData(currentExecution, privateCallStackPreimages); - output = await this.proofCreator.createProof( - signedTxRequest, - previousKernelData, - privateCallData, - firstIteration, - ); + if (firstIteration) { + output = await this.proofCreator.createProofInit( + signedTxRequest, + privateCallData, + ); + } else { + output = await this.proofCreator.createProofInner( + previousKernelData, + privateCallData, + ); + } (await this.getNewNotes(currentExecution)).forEach(n => { newNotes[n.commitment.toString()] = n; }); diff --git a/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts b/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts index 48c3bb729efd..25bd41ef34d7 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts @@ -9,7 +9,8 @@ import { Proof, SignedTxRequest, makeEmptyProof, - privateKernelSim, + privateKernelSimInner, + privateKernelSimInit, } from '@aztec/circuits.js'; import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -35,11 +36,13 @@ export interface ProofOutput { */ export interface ProofCreator { getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs): Promise; - createProof( + createProofInit( signedTxRequest: SignedTxRequest, + privateCallData: PrivateCallData, + ): Promise; + createProofInner( previousKernelData: PreviousKernelData, privateCallData: PrivateCallData, - firstIteration: boolean, ): Promise; } @@ -73,28 +76,51 @@ export class KernelProofCreator { } /** - * Creates a proof output for a given signed transaction request, previous kernel data, private call data, and first iteration flag. + * Creates a proof output for a given signed transaction request and private call data for the first iteration. * * @param signedTxRequest - The signed transaction request object. - * @param previousKernelData - The previous kernel data object. * @param privateCallData - The private call data object. - * @param firstIteration - A boolean flag indicating if it's the first iteration of the kernel proof creation process. * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof. */ - public async createProof( + public async createProofInit( signedTxRequest: SignedTxRequest, - previousKernelData: PreviousKernelData, privateCallData: PrivateCallData, - firstIteration: boolean, ): Promise { const wasm = await CircuitsWasm.get(); - this.log('Executing private kernel simulation...'); - const publicInputs = await privateKernelSim( + this.log('Executing private kernel simulation init...'); + const publicInputs = await privateKernelSimInit( wasm, signedTxRequest, + privateCallData, + ); + this.log('Skipping private kernel proving...'); + // TODO + const proof = makeEmptyProof(); + this.log('Kernel Prover Completed!'); + + return { + publicInputs, + proof, + }; + } + + /** + * Creates a proof output for a given previous kernel data and private call data for an inner iteration. + * + * @param previousKernelData - The previous kernel data object. + * @param privateCallData - The private call data object. + * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof. + */ + public async createProofInner( + previousKernelData: PreviousKernelData, + privateCallData: PrivateCallData, + ): Promise { + const wasm = await CircuitsWasm.get(); + this.log('Executing private kernel simulation inner...'); + const publicInputs = await privateKernelSimInner( + wasm, previousKernelData, privateCallData, - firstIteration, ); this.log('Skipping private kernel proving...'); // TODO diff --git a/yarn-project/circuits.js/src/kernel/private_kernel.ts b/yarn-project/circuits.js/src/kernel/private_kernel.ts index 090dde6dd6c5..dc0b1c7d4526 100644 --- a/yarn-project/circuits.js/src/kernel/private_kernel.ts +++ b/yarn-project/circuits.js/src/kernel/private_kernel.ts @@ -92,29 +92,22 @@ export async function privateKernelProve( } /** - * Computes the public inputs of the private kernel without computing the proof. + * Computes the public inputs of the private kernel first iteration without computing the proof. * @param wasm - The circuits wasm instance. * @param signedTxRequest - The signed transaction request. - * @param previousKernel - The previous kernel data (dummy if this is the first kernel in the chain). * @param privateCallData - The private call data. - * @param firstIteration - Whether this is the first iteration of the private kernel. * @returns The public inputs of the private kernel. */ -export async function privateKernelSim( +export async function privateKernelSimInit( wasm: CircuitsWasm, signedTxRequest: SignedTxRequest, - previousKernel: PreviousKernelData, privateCallData: PrivateCallData, - firstIteration: boolean, ): Promise { wasm.call('pedersen__init'); const signedTxRequestBuffer = signedTxRequest.toBuffer(); - const previousKernelBuffer = previousKernel.toBuffer(); const privateCallDataBuffer = privateCallData.toBuffer(); - const previousKernelBufferOffset = signedTxRequestBuffer.length; - const privateCallDataOffset = previousKernelBufferOffset + previousKernelBuffer.length; + const privateCallDataOffset = signedTxRequestBuffer.length; wasm.writeMemory(0, signedTxRequestBuffer); - wasm.writeMemory(previousKernelBufferOffset, previousKernelBuffer); wasm.writeMemory(privateCallDataOffset, privateCallDataBuffer); const outputBufSizePtr = wasm.call('bbmalloc', 4); const outputBufPtrPtr = wasm.call('bbmalloc', 4); @@ -122,9 +115,7 @@ export async function privateKernelSim( const circuitFailureBufPtr = await wasm.asyncCall( 'private_kernel__sim_init', 0, - previousKernelBufferOffset, privateCallDataOffset, - firstIteration, outputBufSizePtr, outputBufPtrPtr, ); @@ -144,3 +135,48 @@ export async function privateKernelSim( wasm.call('bbfree', circuitFailureBufPtr); } } + +/** + * Computes the public inputs of a private kernel inner iteration without computing the proof. + * @param wasm - The circuits wasm instance. + * @param previousKernel - The previous kernel data (dummy if this is the first kernel in the chain). + * @param privateCallData - The private call data. + * @returns The public inputs of the private kernel. + */ +export async function privateKernelSimInner( + wasm: CircuitsWasm, + previousKernel: PreviousKernelData, + privateCallData: PrivateCallData, +): Promise { + wasm.call('pedersen__init'); + const previousKernelBuffer = previousKernel.toBuffer(); + const privateCallDataBuffer = privateCallData.toBuffer(); + const privateCallDataOffset = previousKernelBuffer.length; + wasm.writeMemory(0, previousKernelBuffer); + wasm.writeMemory(privateCallDataOffset, privateCallDataBuffer); + const outputBufSizePtr = wasm.call('bbmalloc', 4); + const outputBufPtrPtr = wasm.call('bbmalloc', 4); + // Run and read outputs + const circuitFailureBufPtr = await wasm.asyncCall( + 'private_kernel__sim_inner', + 0, + privateCallDataOffset, + outputBufSizePtr, + outputBufPtrPtr, + ); + try { + // Try deserializing the output to `KernelCircuitPublicInputs` and throw if it fails + return handleCircuitOutput( + wasm, + outputBufSizePtr, + outputBufPtrPtr, + circuitFailureBufPtr, + KernelCircuitPublicInputs, + ); + } finally { + // Free memory + wasm.call('bbfree', outputBufSizePtr); + wasm.call('bbfree', outputBufPtrPtr); + wasm.call('bbfree', circuitFailureBufPtr); + } +} \ No newline at end of file From 0e96b21f56ee9fd72023d7753e632b30e06b6bba Mon Sep 17 00:00:00 2001 From: jeanmon Date: Thu, 1 Jun 2023 08:39:51 +0000 Subject: [PATCH 4/6] Small code simplification in kernel prover --- .../src/kernel_prover/kernel_prover.ts | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts index a0f5f6ffe645..df4f1965732d 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.ts @@ -87,17 +87,6 @@ export class KernelProver { proof: makeEmptyProof(), }; while (executionStack.length) { - const previousVkMembershipWitness = firstIteration - ? MembershipWitness.random(VK_TREE_HEIGHT) - : await this.oracle.getVkMembershipWitness(previousVerificationKey); - const previousKernelData = new PreviousKernelData( - output.publicInputs, - output.proof, - previousVerificationKey, - Number(previousVkMembershipWitness.leafIndex), - assertLength(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT), - ); - const currentExecution = executionStack.pop()!; executionStack.push(...currentExecution.nestedExecutions); const privateCallStackPreimages = currentExecution.nestedExecutions.map(result => result.callStackItem); @@ -115,15 +104,17 @@ export class KernelProver { const privateCallData = await this.createPrivateCallData(currentExecution, privateCallStackPreimages); if (firstIteration) { - output = await this.proofCreator.createProofInit( - signedTxRequest, - privateCallData, - ); + output = await this.proofCreator.createProofInit(signedTxRequest, privateCallData); } else { - output = await this.proofCreator.createProofInner( - previousKernelData, - privateCallData, + const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(previousVerificationKey); + const previousKernelData = new PreviousKernelData( + output.publicInputs, + output.proof, + previousVerificationKey, + Number(previousVkMembershipWitness.leafIndex), + assertLength(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT), ); + output = await this.proofCreator.createProofInner(previousKernelData, privateCallData); } (await this.getNewNotes(currentExecution)).forEach(n => { newNotes[n.commitment.toString()] = n; From c83507dfe5a9011f3b5541c9a144264adb9eff6d Mon Sep 17 00:00:00 2001 From: jeanmon Date: Thu, 1 Jun 2023 08:40:49 +0000 Subject: [PATCH 5/6] Format typescript --- .../src/kernel_prover/kernel_prover.test.ts | 4 +++- .../src/kernel_prover/proof_creator.ts | 24 ++++--------------- .../circuits.js/src/kernel/private_kernel.ts | 2 +- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts index ca055c4cb6b7..5f24767e112e 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts @@ -70,7 +70,9 @@ describe('Kernel Prover', () => { const expectExecution = (fns: string[]) => { const callStackItemsInit = proofCreator.createProofInit.mock.calls.map(args => args[1].callStackItem.functionData); - const callStackItemsInner = proofCreator.createProofInner.mock.calls.map(args => args[1].callStackItem.functionData); + const callStackItemsInner = proofCreator.createProofInner.mock.calls.map( + args => args[1].callStackItem.functionData, + ); expect(callStackItemsInit.concat(callStackItemsInner)).toEqual(fns); proofCreator.createProofInner.mockClear(); diff --git a/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts b/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts index 25bd41ef34d7..d189fe46e1e4 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/proof_creator.ts @@ -36,14 +36,8 @@ export interface ProofOutput { */ export interface ProofCreator { getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs): Promise; - createProofInit( - signedTxRequest: SignedTxRequest, - privateCallData: PrivateCallData, - ): Promise; - createProofInner( - previousKernelData: PreviousKernelData, - privateCallData: PrivateCallData, - ): Promise; + createProofInit(signedTxRequest: SignedTxRequest, privateCallData: PrivateCallData): Promise; + createProofInner(previousKernelData: PreviousKernelData, privateCallData: PrivateCallData): Promise; } const OUTER_COMMITMENT = 3; @@ -88,11 +82,7 @@ export class KernelProofCreator { ): Promise { const wasm = await CircuitsWasm.get(); this.log('Executing private kernel simulation init...'); - const publicInputs = await privateKernelSimInit( - wasm, - signedTxRequest, - privateCallData, - ); + const publicInputs = await privateKernelSimInit(wasm, signedTxRequest, privateCallData); this.log('Skipping private kernel proving...'); // TODO const proof = makeEmptyProof(); @@ -104,7 +94,7 @@ export class KernelProofCreator { }; } - /** + /** * Creates a proof output for a given previous kernel data and private call data for an inner iteration. * * @param previousKernelData - The previous kernel data object. @@ -117,11 +107,7 @@ export class KernelProofCreator { ): Promise { const wasm = await CircuitsWasm.get(); this.log('Executing private kernel simulation inner...'); - const publicInputs = await privateKernelSimInner( - wasm, - previousKernelData, - privateCallData, - ); + const publicInputs = await privateKernelSimInner(wasm, previousKernelData, privateCallData); this.log('Skipping private kernel proving...'); // TODO const proof = makeEmptyProof(); diff --git a/yarn-project/circuits.js/src/kernel/private_kernel.ts b/yarn-project/circuits.js/src/kernel/private_kernel.ts index dc0b1c7d4526..a3b2ee28d432 100644 --- a/yarn-project/circuits.js/src/kernel/private_kernel.ts +++ b/yarn-project/circuits.js/src/kernel/private_kernel.ts @@ -179,4 +179,4 @@ export async function privateKernelSimInner( wasm.call('bbfree', outputBufPtrPtr); wasm.call('bbfree', circuitFailureBufPtr); } -} \ No newline at end of file +} From d53dc28a5055596deb3025311fcbdca9200bed83 Mon Sep 17 00:00:00 2001 From: jeanmon Date: Thu, 1 Jun 2023 10:17:54 +0000 Subject: [PATCH 6/6] Address Leila's feedback: adding checks on number of calls to inner/init kernel --- yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts index 5f24767e112e..aa5436de25f7 100644 --- a/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/aztec-rpc/src/kernel_prover/kernel_prover.test.ts @@ -74,6 +74,8 @@ describe('Kernel Prover', () => { args => args[1].callStackItem.functionData, ); + expect(proofCreator.createProofInit).toHaveBeenCalledTimes(Math.min(1, fns.length)); + expect(proofCreator.createProofInner).toHaveBeenCalledTimes(Math.max(0, fns.length - 1)); expect(callStackItemsInit.concat(callStackItemsInner)).toEqual(fns); proofCreator.createProofInner.mockClear(); proofCreator.createProofInit.mockClear();