22template <
typename Flavor,
typename IO,
typename Circuit =
typename Flavor::CircuitBuilder>
30 if (!witness.empty()) {
33 return acir_format::create_circuit<Circuit>(program, metadata);
36template <
typename Flavor,
typename IO>
38 std::vector<uint8_t>&& witness)
41 auto initial_time = std::chrono::high_resolution_clock::now();
44 auto final_time = std::chrono::high_resolution_clock::now();
45 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(final_time - initial_time);
46 info(
"CircuitProve: Proving key computed in ", duration.count(),
" ms");
51 if constexpr (IO::HasIPA) {
52 BB_ASSERT(!prover_instance->ipa_proof.empty(),
53 "RollupIO circuit expected IPA proof but none was provided. "
54 "Ensure the circuit includes IPA accumulation data.");
56 BB_ASSERT(prover_instance->ipa_proof.empty(),
57 "Non-rollup circuit should not have IPA proof. "
58 "Use ipa_accumulation=true in settings for rollup circuits.");
61 return prover_instance;
64template <
typename Flavor,
typename IO>
65bool _verify(
const std::vector<uint8_t>& vk_bytes,
70 using VKAndHash =
typename Flavor::VKAndHash;
75 if (vk_bytes.size() != expected_vk_size) {
77 "Proof verification failed: invalid VK size. Expected ", expected_vk_size,
" bytes, got ", vk_bytes.size());
83 Verifier verifier{ vk_and_hash };
86 const size_t log_n = verifier.compute_log_n();
88 if (proof.size() != expected_size) {
89 info(
"Proof verification failed: invalid proof size. Expected ", expected_size,
", got ", proof.size());
93 auto complete_proof = concatenate_proof<Flavor>(public_inputs, proof);
94 bool verified = verifier.verify_proof(complete_proof).result;
97 info(
"Proof verified successfully");
99 info(
"Proof verification failed");
105template <
typename Flavor,
typename IO>
107 std::vector<uint8_t>&& witness,
108 std::vector<uint8_t>&& vk_bytes)
116 std::shared_ptr<VerificationKey>
vk;
117 if (vk_bytes.empty()) {
118 info(
"WARNING: computing verification key while proving. Pass in a precomputed vk for better performance.");
121 validate_vk_size<VerificationKey>(vk_bytes);
130 size_t num_public_inputs = prover.num_public_inputs();
131 BB_ASSERT_GTE(num_public_inputs, IO::PUBLIC_INPUTS_SIZE,
"Public inputs should contain the expected IO structure.");
132 size_t num_inner_public_inputs = num_public_inputs - IO::PUBLIC_INPUTS_SIZE;
136 if (vk_bytes.empty()) {
144 full_proof.begin() +
static_cast<std::ptrdiff_t>(num_inner_public_inputs) },
151 if (!_verify<Flavor, IO>(
to_buffer(*
vk), response.public_inputs, response.proof)) {
170 auto prover_instance = _compute_prover_instance<Flavor, IO>(
std::move(circuit.bytecode), {});
178template <
typename Flavor,
typename IO>
188 response.
num_acir_opcodes =
static_cast<uint32_t
>(constraint_system.num_acir_opcodes);
191 auto builder = acir_format::create_circuit<Circuit>(program, metadata);
194 response.
num_gates =
static_cast<uint32_t
>(
builder.get_finalized_total_circuit_size());
198 std::vector<uint32_t>(program.constraints.gates_per_opcode.begin(), program.constraints.gates_per_opcode.end());
207 return _stats<Flavor, IO>(
std::move(circuit.bytecode), include_gates_per_opcode);
215 return _verify<Flavor, IO>(verification_key, public_inputs, proof);
225 validate_vk_size<VK>(verification_key);
228 auto vk = from_buffer<VK>(verification_key);
229 std::vector<bb::fr> fields;
230 fields =
vk.to_field_elements();
240 validate_vk_size<VK>(verification_key);
243 auto vk = from_buffer<VK>(verification_key);
244 std::vector<bb::fr> fields;
245 fields =
vk.to_field_elements();
255 validate_vk_size<VK>(verification_key);
257 auto vk = from_buffer<VK>(verification_key);
258 return {
vk.to_field_elements() };
266 validate_vk_size<VK>(verification_key);
268 auto vk = from_buffer<VK>(verification_key);
269 return {
vk.to_field_elements() };
277 validate_vk_size<VK>(verification_key);
279 auto vk = from_buffer<VK>(verification_key);
280 return {
vk.to_field_elements() };
287 validate_vk_size<VK>(verification_key);
296 if (settings.optimized_solidity_verifier) {
#define BB_ASSERT(expression,...)
#define BB_ASSERT_GTE(left, right,...)
#define BB_BENCH_NAME(name)
Shared type definitions for the Barretenberg RPC API.
UltraHonk-specific command definitions for the Barretenberg RPC API.
ECCVMCircuitBuilder CircuitBuilder
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key stores commitments to the precomputed (non-witness) polynomials used by the veri...
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
Base Native verification key class.
static constexpr size_t calc_num_data_types()
Calculate the number of field elements needed for serialization.
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key stores commitments to the precomputed (non-witness) polynomials used by the veri...
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
std::vector< uint8_t > bytecode
std::string get_honk_solidity_verifier(auto const &verification_key)
std::string get_optimized_honk_solidity_verifier(auto const &verification_key)
std::string get_honk_zk_solidity_verifier(auto const &verification_key)
std::string get_optimized_honk_zk_solidity_verifier(auto const &verification_key)
std::shared_ptr< ProverInstance_< Flavor > > _compute_prover_instance(std::vector< uint8_t > &&bytecode, std::vector< uint8_t > &&witness)
bool _verify(const std::vector< uint8_t > &vk_bytes, const std::vector< uint256_t > &public_inputs, const std::vector< uint256_t > &proof)
acir_format::ProgramMetadata _create_program_metadata()
Circuit _compute_circuit(std::vector< uint8_t > &&bytecode, std::vector< uint8_t > &&witness)
CircuitStats::Response _stats(std::vector< uint8_t > &&bytecode, bool include_gates_per_opcode)
std::vector< uint256_t > vk_to_uint256_fields(const VK &vk)
Convert VK to uint256 field elements, handling flavor-specific return types.
CircuitProve::Response _prove(std::vector< uint8_t > &&bytecode, std::vector< uint8_t > &&witness, std::vector< uint8_t > &&vk_bytes)
auto dispatch_by_settings(const ProofSystemSettings &settings, Operation &&operation)
Dispatch to the correct Flavor and IO type based on proof system settings.
field< Bn254FrParams > fr
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< uint8_t > to_buffer(T const &value)
Full Honk proof layout (used by UltraVerifier).
std::vector< uint8_t > bytes
Response execute(const BBApiRequest &request={}) &&
Contains proof and public inputs. Both are given as vectors of fields. To be used for verification....
std::vector< uint256_t > public_inputs
Response execute(const BBApiRequest &request={}) &&
uint32_t num_gates_dyadic
std::vector< uint32_t > gates_per_opcode
uint32_t num_acir_opcodes
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
Response execute(const BBApiRequest &request={}) &&
void throw_or_abort(std::string const &err)