diff --git a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts index b490c4715b97..dd5270abb2a8 100644 --- a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts @@ -1,5 +1,4 @@ import { createLogger } from '@aztec/foundation/log'; -import { Timer } from '@aztec/foundation/timer'; import { convertPrivateKernelInitInputsToWitnessMapWithAbi, convertPrivateKernelInitOutputsFromWitnessMapWithAbi, @@ -165,7 +164,6 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver { const witnessMap = convertInputs(inputs, compiledCircuit.abi); - const timer = new Timer(); const outputWitness = await this.simulationProvider .executeProtocolCircuit(witnessMap, compiledCircuit, foreignCallHandler) .catch((err: Error) => { @@ -175,12 +173,12 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver { }); throw err; }); - const output = convertOutputs(outputWitness, compiledCircuit.abi); + const output = convertOutputs(outputWitness.witness, compiledCircuit.abi); this.log.debug(`Simulated ${circuitType}`, { eventName: 'circuit-simulation', circuitName: mapProtocolArtifactNameToCircuitName(circuitType), - duration: timer.ms(), + duration: outputWitness.duration, inputSize: inputs.toBuffer().length, outputSize: output.toBuffer().length, } satisfies CircuitSimulationStats); @@ -203,18 +201,17 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver { ); const witnessMap = convertInputs(inputs, compiledCircuit.abi); - const timer = new Timer(); const outputWitness = await this.simulationProvider.executeProtocolCircuit( witnessMap, compiledCircuit, foreignCallHandler, ); - const output = convertOutputs(outputWitness, compiledCircuit.abi); + const output = convertOutputs(outputWitness.witness, compiledCircuit.abi); this.log.debug(`Generated witness for ${circuitType}`, { eventName: 'circuit-witness-generation', circuitName: mapProtocolArtifactNameToCircuitName(circuitType), - duration: timer.ms(), + duration: outputWitness.duration, inputSize: inputs.toBuffer().length, outputSize: output.toBuffer().length, } satisfies CircuitWitnessGenerationStats); @@ -225,7 +222,7 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver { const kernelOutput: PrivateKernelSimulateOutput = { publicInputs: output, verificationKey, - outputWitness, + outputWitness: outputWitness.witness, bytecode, }; return kernelOutput; diff --git a/yarn-project/bb-prover/src/prover/bb_prover.ts b/yarn-project/bb-prover/src/prover/bb_prover.ts index 3f0c3d971557..d424ccd8841e 100644 --- a/yarn-project/bb-prover/src/prover/bb_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_prover.ts @@ -11,7 +11,6 @@ import { Fr } from '@aztec/foundation/fields'; import { runInDirectory } from '@aztec/foundation/fs'; import { createLogger } from '@aztec/foundation/log'; import { BufferReader } from '@aztec/foundation/serialize'; -import { Timer } from '@aztec/foundation/timer'; import { type ServerProtocolArtifact, convertBaseParityInputsToWitnessMap, @@ -415,19 +414,18 @@ export class BBNativeRollupProver implements ServerCircuitProver { logger.debug(`Generating witness data for ${circuitType}`); const inputWitness = convertInput(input); - const timer = new Timer(); const foreignCallHandler = undefined; // We don't handle foreign calls in the native ACVM simulator - const outputWitness = await simulator.executeProtocolCircuit(inputWitness, artifact, foreignCallHandler); - const output = convertOutput(outputWitness); + const witnessResult = await simulator.executeProtocolCircuit(inputWitness, artifact, foreignCallHandler); + const output = convertOutput(witnessResult.witness); const circuitName = mapProtocolArtifactNameToCircuitName(circuitType); - this.instrumentation.recordDuration('witGenDuration', circuitName, timer); + this.instrumentation.recordDuration('witGenDuration', circuitName, witnessResult.duration); this.instrumentation.recordSize('witGenInputSize', circuitName, input.toBuffer().length); this.instrumentation.recordSize('witGenOutputSize', circuitName, output.toBuffer().length); logger.info(`Generated witness`, { circuitName, - duration: timer.ms(), + duration: witnessResult.duration, inputSize: input.toBuffer().length, outputSize: output.toBuffer().length, eventName: 'circuit-witness-generation', diff --git a/yarn-project/bb-prover/src/test/test_circuit_prover.ts b/yarn-project/bb-prover/src/test/test_circuit_prover.ts index 3e4b61fd756c..e9ede5aba0a5 100644 --- a/yarn-project/bb-prover/src/test/test_circuit_prover.ts +++ b/yarn-project/bb-prover/src/test/test_circuit_prover.ts @@ -356,17 +356,21 @@ export class TestCircuitProver implements ServerCircuitProver { // TODO(#10323): Native ACVM simulator does not support foreign call handler so we use the wasm simulator // when simulating block root rollup and single tx block root rollup circuits or when the native ACVM simulator // is not provided. - witness = await this.wasmSimulator.executeProtocolCircuit( - witnessMap, - getSimulatedServerCircuitArtifact(artifactName), - foreignCallHandler, - ); + witness = ( + await this.wasmSimulator.executeProtocolCircuit( + witnessMap, + getSimulatedServerCircuitArtifact(artifactName), + foreignCallHandler, + ) + ).witness; } else { - witness = await this.simulationProvider.executeProtocolCircuit( - witnessMap, - getSimulatedServerCircuitArtifact(artifactName), - undefined, // Native ACM simulator does not support foreign call handler - ); + witness = ( + await this.simulationProvider.executeProtocolCircuit( + witnessMap, + getSimulatedServerCircuitArtifact(artifactName), + undefined, // Native ACM simulator does not support foreign call handler + ) + ).witness; } const result = convertOutput(witness); diff --git a/yarn-project/simulator/src/private/providers/acvm_native.ts b/yarn-project/simulator/src/private/providers/acvm_native.ts index 5bb33398d703..26fe4f0456b0 100644 --- a/yarn-project/simulator/src/private/providers/acvm_native.ts +++ b/yarn-project/simulator/src/private/providers/acvm_native.ts @@ -123,14 +123,15 @@ export async function executeNativeCircuit( }); }); - const duration = new Timer(); + const timer = new Timer(); const output = await processPromise; + const duration = timer.ms(); if (outputFilename) { const outputWitnessFileName = `${workingDirectory}/output-witness.gz`; await fs.copyFile(outputWitnessFileName, outputFilename); } const witness = parseIntoWitnessMap(output); - return { status: ACVM_RESULT.SUCCESS, witness, duration: duration.ms() }; + return { status: ACVM_RESULT.SUCCESS, witness, duration }; } catch (error) { return { status: ACVM_RESULT.FAILURE, reason: `${error}` }; } @@ -143,7 +144,7 @@ export class NativeACVMSimulator implements SimulationProvider { input: ACVMWitness, artifact: NoirCompiledCircuitWithName, callback: ForeignCallHandler | undefined, - ): Promise { + ): Promise { // Execute the circuit on those initial witness values if (callback) { @@ -166,7 +167,7 @@ export class NativeACVMSimulator implements SimulationProvider { throw new Error(`Failed to generate witness: ${result.reason}`); } - return result.witness; + return result; }; return await runInDirectory(this.workingDirectory, operation, false, logger); diff --git a/yarn-project/simulator/src/private/providers/acvm_wasm.ts b/yarn-project/simulator/src/private/providers/acvm_wasm.ts index 3b10b8b5d9ab..3171b61e0c6d 100644 --- a/yarn-project/simulator/src/private/providers/acvm_wasm.ts +++ b/yarn-project/simulator/src/private/providers/acvm_wasm.ts @@ -1,4 +1,5 @@ import { createLogger } from '@aztec/foundation/log'; +import { Timer } from '@aztec/foundation/timer'; import initACVM, { type ExecutionError, type ForeignCallHandler, executeCircuit } from '@aztec/noir-acvm_js'; import initAbi from '@aztec/noir-noirc_abi'; import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi'; @@ -6,6 +7,7 @@ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir'; import { type ACIRCallback, type ACIRExecutionResult, acvm } from '../acvm/acvm.js'; import type { ACVMWitness } from '../acvm/acvm_types.js'; +import type { ACVMSuccess } from './acvm_native.js'; import { type SimulationProvider, enrichNoirError } from './simulation_provider.js'; export class WASMSimulator implements SimulationProvider { @@ -25,7 +27,7 @@ export class WASMSimulator implements SimulationProvider { input: ACVMWitness, artifact: NoirCompiledCircuitWithName, callback: ForeignCallHandler, - ): Promise { + ): Promise { this.log.debug('init', { hash: artifact.hash }); await this.init(); @@ -34,13 +36,14 @@ export class WASMSimulator implements SimulationProvider { // // Execute the circuit try { + const timer = new Timer(); const result = await executeCircuit( decodedBytecode, input, callback, // handle calls to debug_log ); this.log.debug('execution successful', { hash: artifact.hash }); - return result; + return { witness: result, duration: timer.ms() } as ACVMSuccess; } catch (err) { // Typescript types caught errors as unknown or any, so we need to narrow its type to check if it has raw // assertion payload. diff --git a/yarn-project/simulator/src/private/providers/acvm_wasm_with_blobs.ts b/yarn-project/simulator/src/private/providers/acvm_wasm_with_blobs.ts index 0506a4824bad..76b53b337c7a 100644 --- a/yarn-project/simulator/src/private/providers/acvm_wasm_with_blobs.ts +++ b/yarn-project/simulator/src/private/providers/acvm_wasm_with_blobs.ts @@ -1,3 +1,4 @@ +import { Timer } from '@aztec/foundation/timer'; import { type ExecutionError, type ForeignCallHandler, executeCircuit } from '@aztec/noir-acvm_js'; import type { WitnessMap } from '@aztec/noir-types'; import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi'; @@ -5,6 +6,7 @@ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir'; import type { ACIRCallback, ACIRExecutionResult } from '../acvm/acvm.js'; import type { ACVMWitness } from '../acvm/acvm_types.js'; +import type { ACVMSuccess } from './acvm_native.js'; import { type SimulationProvider, enrichNoirError } from './simulation_provider.js'; /** @@ -19,19 +21,19 @@ export class WASMSimulatorWithBlobs implements SimulationProvider { input: WitnessMap, artifact: NoirCompiledCircuitWithName, callback: ForeignCallHandler, - ): Promise { + ): Promise { // Decode the bytecode from base64 since the acvm does not know about base64 encoding const decodedBytecode = Buffer.from(artifact.bytecode, 'base64'); // // Execute the circuit try { + const timer = new Timer(); const _witnessMap = await executeCircuit( decodedBytecode, input, callback, // handle calls to debug_log and evaluate_blobs mock ); - - return _witnessMap; + return { witness: _witnessMap, duration: timer.ms() } as ACVMSuccess; } catch (err) { // Typescript types caught errors as unknown or any, so we need to narrow its type to check if it has raw // assertion payload. diff --git a/yarn-project/simulator/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts b/yarn-project/simulator/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts index 825c5b56dac6..fdd2123d8aa7 100644 --- a/yarn-project/simulator/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +++ b/yarn-project/simulator/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts @@ -4,6 +4,7 @@ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir'; import type { ACIRCallback, ACIRExecutionResult } from '../../acvm/acvm.js'; import type { ACVMWitness } from '../../acvm/acvm_types.js'; +import type { ACVMSuccess } from '../acvm_native.js'; import type { SimulationProvider } from '../simulation_provider.js'; import { CircuitRecorder } from './circuit_recorder.js'; @@ -18,10 +19,10 @@ export class SimulationProviderRecorderWrapper implements SimulationProvider { input: ACVMWitness, artifact: NoirCompiledCircuitWithName, callback: ForeignCallHandler | undefined, - ): Promise { + ): Promise { const bytecode = Buffer.from(artifact.bytecode, 'base64'); - return this.#simulate( + return this.#simulate( wrappedCallback => this.simulator.executeProtocolCircuit(input, artifact, wrappedCallback), input, bytecode, diff --git a/yarn-project/simulator/src/private/providers/simulation_provider.ts b/yarn-project/simulator/src/private/providers/simulation_provider.ts index da6589d2f790..1d7d23da0987 100644 --- a/yarn-project/simulator/src/private/providers/simulation_provider.ts +++ b/yarn-project/simulator/src/private/providers/simulation_provider.ts @@ -6,6 +6,7 @@ import type { NoirCompiledCircuit, NoirCompiledCircuitWithName } from '@aztec/st import { type ACIRCallback, type ACIRExecutionResult, extractCallStack } from '../acvm/acvm.js'; import type { ACVMWitness } from '../acvm/acvm_types.js'; +import type { ACVMSuccess } from './acvm_native.js'; /** * Low level simulation interface @@ -23,7 +24,7 @@ export interface SimulationProvider { input: ACVMWitness, artifact: NoirCompiledCircuitWithName, callback: ForeignCallHandler | undefined, - ): Promise; + ): Promise; /** * Execute a user circuit (smart contract function)/generate a witness