24 request.ivc_stack_depth = 0;
31 if (!request.ivc_in_progress) {
35 request.loaded_circuit_name = circuit.name;
37 request.loaded_circuit_vk = circuit.verification_key;
39 info(
"ChonkLoad - loaded circuit '", request.loaded_circuit_name,
"'");
47 if (!request.ivc_in_progress) {
51 if (!request.loaded_circuit_constraints.has_value()) {
59 auto circuit = acir_format::create_circuit<IVCBase::ClientCircuit>(program, metadata);
64 precomputed_vk =
nullptr;
66 if (!request.loaded_circuit_vk.empty()) {
67 validate_vk_size<Chonk::MegaVerificationKey>(request.loaded_circuit_vk);
68 precomputed_vk = from_buffer<std::shared_ptr<Chonk::MegaVerificationKey>>(request.loaded_circuit_vk);
75 if (*precomputed_vk != *computed_vk) {
76 throw_or_abort(
"VK check failed for circuit '" + request.loaded_circuit_name +
77 "': provided VK does not match computed VK");
82 throw_or_abort(
"Invalid VK policy. Valid options: default, check, recompute");
85 info(
"ChonkAccumulate - accumulating circuit '", request.loaded_circuit_name,
"'");
86 request.ivc_in_progress->accumulate(circuit, precomputed_vk);
87 request.ivc_stack_depth++;
89 request.loaded_circuit_constraints.reset();
90 request.loaded_circuit_vk.clear();
98 if (!request.ivc_in_progress) {
102 if (request.ivc_stack_depth == 0) {
103 throw_or_abort(
"No circuits accumulated. Call ChonkAccumulate first.");
106 info(
"ChonkProve - generating proof for ", request.ivc_stack_depth,
" accumulated circuits");
110 bool verification_passed =
false;
112 info(
"ChonkProve - using Chonk");
114 auto proof = chonk->prove();
115 auto vk_and_hash = chonk->get_hiding_kernel_vk_and_hash();
119 info(
"ChonkProve - verifying the generated proof as a sanity check");
121 verification_passed = verifier.
verify(proof);
123 if (!verification_passed) {
129 request.ivc_in_progress.reset();
130 request.ivc_stack_depth = 0;
140 validate_vk_size<VerificationKey>(
vk);
146 const size_t expected_proof_size =
148 if (proof.size() != expected_proof_size) {
156 const bool verified = verifier.
verify(proof);
158 return { .valid = verified };
165 if (proofs.size() != vks.size()) {
169 if (proofs.empty()) {
176 inputs.reserve(proofs.size());
178 for (
size_t i = 0; i < proofs.size(); ++i) {
179 validate_vk_size<VerificationKey>(vks[i]);
182 const size_t expected_proof_size =
184 if (proofs[i].size() != expected_proof_size) {
195 return { .valid = verified };
209 info(
"ChonkComputeVk - deriving MegaVerificationKey for circuit '", circuit.name,
"'");
217 info(
"ChonkComputeVk - VK derived, size: ",
to_buffer(*verification_key).size(),
" bytes");
219 return { .bytes =
to_buffer(*verification_key), .fields = verification_key->to_field_elements() };
231 if (circuit.verification_key.empty()) {
232 info(
"FAIL: Expected precomputed vk for function ", circuit.name);
236 validate_vk_size<Chonk::MegaVerificationKey>(circuit.verification_key);
239 auto precomputed_vk = from_buffer<std::shared_ptr<Chonk::MegaVerificationKey>>(circuit.verification_key);
242 response.
valid =
true;
243 if (*computed_vk != *precomputed_vk) {
244 response.valid =
false;
245 response.actual_vk =
to_buffer(computed_vk);
259 const auto& ivc_constraints = constraint_system.hn_recursion_constraints;
264 .collect_gates_per_opcode = include_gates_per_opcode
268 auto builder = acir_format::create_circuit<MegaCircuitBuilder>(program, metadata);
269 builder.finalize_circuit(
true);
272 response.
acir_opcodes = program.constraints.num_acir_opcodes;
276 if (include_gates_per_opcode) {
277 response.
gates_per_opcode = std::vector<uint32_t>(program.constraints.gates_per_opcode.begin(),
278 program.constraints.gates_per_opcode.end());
282 info(
"ChonkStats - circuit: ",
#define BB_BENCH_NAME(name)
Chonk-specific command definitions for the Barretenberg RPC API.
static bool verify(std::span< const Input > inputs)
Verify multiple Chonk proofs with batched IPA verification.
Flavor::VerificationKey MegaVerificationKey
Verifier for Chonk IVC proofs (both native and recursive).
Output verify(const Proof &proof)
Verify a Chonk proof.
Base Native verification key class.
static std::vector< uint8_t > compress_chonk_proof(const ChonkProof &proof)
static ChonkProof decompress_chonk_proof(const std::vector< uint8_t > &compressed, size_t mega_num_public_inputs)
static size_t compressed_mega_num_public_inputs(size_t compressed_bytes)
Derive mega_num_public_inputs from compressed proof size.
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
std::vector< uint8_t > to_buffer(T const &value)
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
The size of a Chonk proof without backend-added public inputs.
Empty response indicating successful circuit accumulation.
Response execute(BBApiRequest &request) &&
Response execute(const BBApiRequest &request={}) &&
Contains the validation result.
bool valid
True if the precomputed VK matches the circuit.
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Contains the computed verification key in multiple formats.
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Empty response indicating successful circuit loading.
Response execute(BBApiRequest &request) &&
Contains the generated IVC proof.
ChonkProof proof
Complete IVC proof for all accumulated circuits.
Response execute(BBApiRequest &request) &&
Empty response indicating successful initialization.
Response execute(BBApiRequest &request) &&
Contains gate count information.
uint32_t circuit_size
Circuit size (total number of gates)
uint32_t acir_opcodes
Number of ACIR opcodes.
std::vector< uint32_t > gates_per_opcode
Optional: gate counts per opcode.
Response execute(BBApiRequest &request) &&
Contains the verification result.
Response execute(const BBApiRequest &request={}) &&
void throw_or_abort(std::string const &err)