Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { createLogger } from '@aztec/foundation/log';
import { Timer } from '@aztec/foundation/timer';
import {
convertPrivateKernelInitInputsToWitnessMapWithAbi,
convertPrivateKernelInitOutputsFromWitnessMapWithAbi,
Expand Down Expand Up @@ -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) => {
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -225,7 +222,7 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
const kernelOutput: PrivateKernelSimulateOutput<O> = {
publicInputs: output,
verificationKey,
outputWitness,
outputWitness: outputWitness.witness,
bytecode,
};
return kernelOutput;
Expand Down
10 changes: 4 additions & 6 deletions yarn-project/bb-prover/src/prover/bb_prover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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',
Expand Down
24 changes: 14 additions & 10 deletions yarn-project/bb-prover/src/test/test_circuit_prover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
9 changes: 5 additions & 4 deletions yarn-project/simulator/src/private/providers/acvm_native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}` };
}
Expand All @@ -143,7 +144,7 @@ export class NativeACVMSimulator implements SimulationProvider {
input: ACVMWitness,
artifact: NoirCompiledCircuitWithName,
callback: ForeignCallHandler | undefined,
): Promise<ACVMWitness> {
): Promise<ACVMSuccess> {
// Execute the circuit on those initial witness values

if (callback) {
Expand All @@ -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);
Expand Down
7 changes: 5 additions & 2 deletions yarn-project/simulator/src/private/providers/acvm_wasm.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
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';
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 {
Expand All @@ -25,7 +27,7 @@ export class WASMSimulator implements SimulationProvider {
input: ACVMWitness,
artifact: NoirCompiledCircuitWithName,
callback: ForeignCallHandler,
): Promise<ACVMWitness> {
): Promise<ACVMSuccess> {
this.log.debug('init', { hash: artifact.hash });
await this.init();

Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
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';
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';

/**
Expand All @@ -19,19 +21,19 @@ export class WASMSimulatorWithBlobs implements SimulationProvider {
input: WitnessMap,
artifact: NoirCompiledCircuitWithName,
callback: ForeignCallHandler,
): Promise<WitnessMap> {
): Promise<ACVMSuccess> {
// 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -18,10 +19,10 @@ export class SimulationProviderRecorderWrapper implements SimulationProvider {
input: ACVMWitness,
artifact: NoirCompiledCircuitWithName,
callback: ForeignCallHandler | undefined,
): Promise<ACVMWitness> {
): Promise<ACVMSuccess> {
const bytecode = Buffer.from(artifact.bytecode, 'base64');

return this.#simulate<ForeignCallHandler | undefined, ACVMWitness>(
return this.#simulate<ForeignCallHandler | undefined, ACVMSuccess>(
wrappedCallback => this.simulator.executeProtocolCircuit(input, artifact, wrappedCallback),
input,
bytecode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -23,7 +24,7 @@ export interface SimulationProvider {
input: ACVMWitness,
artifact: NoirCompiledCircuitWithName,
callback: ForeignCallHandler | undefined,
): Promise<ACVMWitness>;
): Promise<ACVMSuccess>;

/**
* Execute a user circuit (smart contract function)/generate a witness
Expand Down
Loading