From b57695cac6b82c4f60c779ea63f4999f00812b1c Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 29 Oct 2024 12:18:42 +0000 Subject: [PATCH] Missing recursives in calls --- barretenberg/cpp/src/barretenberg/bb/main.cpp | 4 +-- .../barretenberg/dsl/acir_proofs/c_bind.cpp | 2 +- .../barretenberg/dsl/acir_proofs/c_bind.hpp | 4 +-- .../src/prover/bb_private_kernel_prover.ts | 6 +++-- .../bb-prover/src/prover/bb_prover.ts | 9 ++++--- yarn-project/bb-prover/src/stats.ts | 26 +++++++++++++++++++ .../bb-prover/src/verifier/bb_verifier.ts | 4 ++- 7 files changed, 43 insertions(+), 12 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 6e4e73ee183..74f70e2c348 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -444,7 +444,7 @@ bool verify_client_ivc(const std::filesystem::path& proof_path, return verified; } -bool foldAndVerifyProgram(const std::string& bytecodePath, const std::string& witnessPath) +bool foldAndVerifyProgram(const std::string& bytecodePath, const bool recursive, const std::string& witnessPath) { using Flavor = MegaFlavor; // This is the only option using Builder = Flavor::CircuitBuilder; @@ -467,7 +467,7 @@ bool foldAndVerifyProgram(const std::string& bytecodePath, const std::string& wi // Construct a bberg circuit from the acir representation auto builder = acir_format::create_circuit(stack_item.constraints, - /*recursive=*/false, + recursive, 0, stack_item.witness, /*honk_recursion=*/false, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp index cbe92d5f0c2..1df64705092 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp @@ -60,7 +60,7 @@ WASM_EXPORT void acir_create_proof( } WASM_EXPORT void acir_prove_and_verify_ultra_honk(uint8_t const* acir_vec, - boolean const* recursive, + bool const* recursive, uint8_t const* witness_vec, bool* result) { diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp index 570ef8a6dcd..2ed4613b666 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp @@ -36,8 +36,8 @@ WASM_EXPORT void acir_create_proof(in_ptr acir_composer_ptr, * */ WASM_EXPORT void acir_prove_and_verify_ultra_honk(uint8_t const* constraint_system_buf, - uint8_t const* witness_buf, bool const* recursive, + uint8_t const* witness_buf, bool* result); /** @@ -45,8 +45,8 @@ WASM_EXPORT void acir_prove_and_verify_ultra_honk(uint8_t const* constraint_syst * */ WASM_EXPORT void acir_prove_and_verify_mega_honk(uint8_t const* constraint_system_buf, - uint8_t const* witness_buf, bool const* recursive, + uint8_t const* witness_buf, bool* result); /** 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 36eb04f19a9..aa19adee602 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 @@ -123,10 +123,10 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { return proof; } - async createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise { + async createClientIvcProof(acirs: Buffer[], recursive: boolean, witnessStack: WitnessMap[]): Promise { this.log.info(`Generating Client IVC proof`); const operation = async (directory: string) => { - return await this._createClientIvcProof(directory, acirs, witnessStack); + return await this._createClientIvcProof(directory, acirs, recursive, witnessStack); }; return await this.runInDirectory(operation); } @@ -296,6 +296,7 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { private async computeVerificationKey( directory: string, bytecode: Buffer, + recursive: boolean, circuitType: ClientProtocolArtifact | 'App', appCircuitName?: string, ): Promise<{ @@ -311,6 +312,7 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { directory, circuitType, bytecode, + recursive, circuitType === 'App' ? 'mega_honk' : getUltraHonkFlavorForCircuit(circuitType), this.log.debug, ); diff --git a/yarn-project/bb-prover/src/prover/bb_prover.ts b/yarn-project/bb-prover/src/prover/bb_prover.ts index d862ead7c4b..5e6031df2bb 100644 --- a/yarn-project/bb-prover/src/prover/bb_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_prover.ts @@ -103,6 +103,9 @@ import { extractAvmVkData, extractVkData } from '../verification_key/verificatio const logger = createDebugLogger('aztec:bb-prover'); +// All `ServerCircuitArtifact` are recursive. +const SERVER_CIRCUIT_RECURSIVE = true; + export interface BBProverConfig extends BBConfig, ACVMConfig { // list of circuits supported by this prover. defaults to all circuits if empty circuitFilter?: ServerProtocolArtifact[]; @@ -504,15 +507,12 @@ export class BBNativeRollupProver implements ServerCircuitProver { // Now prove the circuit from the generated witness logger.debug(`Proving ${circuitType}...`); - // All `ServerProtocolArtifact` types are recursive. - const recursive = true; - const provingResult = await generateProof( this.config.bbBinaryPath, workingDirectory, circuitType, Buffer.from(artifact.bytecode, 'base64'), - recursive, + SERVER_CIRCUIT_RECURSIVE, outputWitnessFile, getUltraHonkFlavorForCircuit(circuitType), logger.debug, @@ -865,6 +865,7 @@ export class BBNativeRollupProver implements ServerCircuitProver { this.config.bbWorkingDirectory, circuitType, ServerCircuitArtifacts[circuitType], + SERVER_CIRCUIT_RECURSIVE, flavor, logger.debug, ).then(result => { diff --git a/yarn-project/bb-prover/src/stats.ts b/yarn-project/bb-prover/src/stats.ts index b517acdb1ca..6256764dd05 100644 --- a/yarn-project/bb-prover/src/stats.ts +++ b/yarn-project/bb-prover/src/stats.ts @@ -43,3 +43,29 @@ export function mapProtocolArtifactNameToCircuitName( } } } + +export function isProtocolArtifactRecursive( + artifact: ServerProtocolArtifact | ClientProtocolArtifact, +): boolean { + switch (artifact) { + case 'EmptyNestedArtifact': + case 'PrivateKernelEmptyArtifact': + case 'BaseParityArtifact': + case 'RootParityArtifact': + case 'PrivateBaseRollupArtifact': + case 'PublicBaseRollupArtifact': + case 'MergeRollupArtifact': + case 'BlockRootRollupArtifact': + case 'EmptyBlockRootRollupArtifact': + case 'BlockMergeRollupArtifact': + case 'RootRollupArtifact': + return true; + default: { + if (artifact.startsWith('PrivateKernel')) { + return false; + } + throw new Error(`Unknown circuit type: ${artifact}`); + } + } +} + diff --git a/yarn-project/bb-prover/src/verifier/bb_verifier.ts b/yarn-project/bb-prover/src/verifier/bb_verifier.ts index 394b582c17f..79f1a395402 100644 --- a/yarn-project/bb-prover/src/verifier/bb_verifier.ts +++ b/yarn-project/bb-prover/src/verifier/bb_verifier.ts @@ -23,7 +23,7 @@ import { } from '../bb/execute.js'; import { type BBConfig } from '../config.js'; import { type UltraKeccakHonkProtocolArtifact, getUltraHonkFlavorForCircuit } from '../honk.js'; -import { mapProtocolArtifactNameToCircuitName } from '../stats.js'; +import { mapProtocolArtifactNameToCircuitName, isProtocolArtifactRecursive } from '../stats.js'; import { extractVkData } from '../verification_key/verification_key_data.js'; export class BBCircuitVerifier implements ClientProtocolCircuitVerifier { @@ -63,6 +63,7 @@ export class BBCircuitVerifier implements ClientProtocolCircuitVerifier { workingDirectory, circuit, ProtocolCircuitArtifacts[circuit], + isProtocolArtifactRecursive(circuit), getUltraHonkFlavorForCircuit(circuit), logFn, ).then(result => { @@ -133,6 +134,7 @@ export class BBCircuitVerifier implements ClientProtocolCircuitVerifier { this.config.bbWorkingDirectory, circuit, ProtocolCircuitArtifacts[circuit], + isProtocolArtifactRecursive(circuit), contractName, this.logger.debug, );