8#include "../acir_format/acir_to_constraint_buf.hpp"
27 uint8_t
const* acir_vec,
bool const* recursive,
bool const* honk_recursion, uint32_t* total, uint32_t* subgroup)
30 .honk_recursion = *honk_recursion,
31 .size_hint = 1 << 19 };
36 *total = htonl((uint32_t)
builder.get_finalized_total_circuit_size());
37 *subgroup = htonl((uint32_t)
builder.get_circuit_subgroup_size(
builder.get_finalized_total_circuit_size()));
48 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
52 UltraProver prover{ proving_key, verification_key };
57 *result = verifier.template verify_proof<DefaultIO>(proof).result;
58 info(
"verified: ", *result);
70 auto builder = acir_format::create_circuit<MegaCircuitBuilder>(program, metadata);
74 MegaProver prover{ proving_key, verification_key };
79 *result = verifier.template verify_proof<DefaultIO>(proof).result;
84 auto ivc_inputs_vec = from_buffer<std::vector<uint8_t>>(ivc_inputs_buf);
86 auto start = std::chrono::steady_clock::now();
90 auto end = std::chrono::steady_clock::now();
91 auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
92 vinfo(
"time to construct and accumulate all circuits: ", diff.count());
94 vinfo(
"calling ivc.prove ...");
96 end = std::chrono::steady_clock::now();
98 diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
99 vinfo(
"time to construct, accumulate, prove all circuits: ", diff.count());
101 start = std::chrono::steady_clock::now();
103 end = std::chrono::steady_clock::now();
104 diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
105 vinfo(
"time to serialize proof: ", diff.count());
107 start = std::chrono::steady_clock::now();
109 end = std::chrono::steady_clock::now();
110 diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
111 vinfo(
"time to serialize vk: ", diff.count());
117 const auto vk = from_buffer<ClientIVC::VerificationKey>(
from_buffer<std::vector<uint8_t>>(vk_buf));
123 uint8_t
const* witness_vec,
124 uint8_t
const* vk_buf,
134 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
136 auto verification_key =
147 uint8_t
const* witness_vec,
148 uint8_t
const* vk_buf,
158 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
162 from_buffer<UltraKeccakFlavor::VerificationKey>(vk_buf));
170 uint8_t
const* witness_vec,
171 uint8_t
const* vk_buf,
181 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
185 from_buffer<UltraKeccakZKFlavor::VerificationKey>(vk_buf));
193 [[maybe_unused]] uint8_t
const* witness_vec,
194 [[maybe_unused]] uint8_t
const* vk_buf,
195 [[maybe_unused]] uint8_t** out)
197#ifdef STARKNET_GARAGA_FLAVORS
199 UltraStarknetProver prover = [&] {
205 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
207 return UltraStarknetProver(
builder);
209 auto proof = prover.construct_proof();
212 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
217 [[maybe_unused]] uint8_t
const* witness_vec,
218 [[maybe_unused]] uint8_t
const* vk_buf,
219 [[maybe_unused]] uint8_t** out)
221#ifdef STARKNET_GARAGA_FLAVORS
223 UltraStarknetZKProver prover = [&] {
229 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
231 return UltraStarknetZKProver(
builder);
233 auto proof = prover.construct_proof();
236 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
245 auto proof = many_from_buffer<bb::fr>(
from_buffer<std::vector<uint8_t>>(proof_buf));
248 Verifier verifier{ verification_key };
250 *result = verifier.template verify_proof<DefaultIO>(proof).result;
258 auto proof = many_from_buffer<uint256_t>(
from_buffer<std::vector<uint8_t>>(proof_buf));
261 Verifier verifier{ verification_key };
263 *result = verifier.template verify_proof<DefaultIO>(proof).result;
271 auto proof = many_from_buffer<uint256_t>(
from_buffer<std::vector<uint8_t>>(proof_buf));
274 Verifier verifier{ verification_key };
276 *result = verifier.template verify_proof<DefaultIO>(proof).result;
280 [[maybe_unused]] uint8_t
const* vk_buf,
281 [[maybe_unused]]
bool* result)
283#ifdef STARKNET_GARAGA_FLAVORS
287 auto proof = from_buffer<std::vector<bb::fr>>(from_buffer<std::vector<uint8_t>>(proof_buf));
290 Verifier verifier{ verification_key };
292 *result = verifier.template verify_proof<DefaultIO>(proof).result;
295 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
300 [[maybe_unused]] uint8_t
const* vk_buf,
301 [[maybe_unused]]
bool* result)
303#ifdef STARKNET_GARAGA_FLAVORS
307 auto proof = many_from_buffer<bb::fr>(
from_buffer<std::vector<uint8_t>>(proof_buf));
310 Verifier verifier{ verification_key };
312 *result = verifier.template verify_proof<DefaultIO>(proof).result;
314 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
327 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
331 vinfo(
"Constructed UltraHonk verification key");
345 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
349 vinfo(
"Constructed UltraKeccakHonk verification key");
363 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
367 vinfo(
"Constructed UltraKeccakZKHonk verification key");
372 [[maybe_unused]] uint8_t** out)
374#ifdef STARKNET_GARAGA_FLAVORS
383 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
387 vinfo(
"Constructed UltraStarknetHonk verification key");
390 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
395 [[maybe_unused]] uint8_t** out)
397#ifdef STARKNET_GARAGA_FLAVORS
406 auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
410 vinfo(
"Constructed UltraStarknetZKHonk verification key");
413 throw_or_abort(
"bb wasm was not compiled with starknet garaga flavors!");
421 auto proof = many_from_buffer<bb::fr>(
from_buffer<std::vector<uint8_t>>(proof_buf));
422 auto verification_key = from_buffer<VerificationKey>(vk_buf);
430 auto proof = many_from_buffer<bb::fr>(
from_buffer<std::vector<uint8_t>>(proof_buf));
454 auto ivc_inputs_vec = from_buffer<std::vector<uint8_t>>(ivc_inputs_buf);
457 std::vector<uint32_t> totals;
464 std::vector<uint8_t> bytecode_vec(step.bytecode.begin(), step.bytecode.end());
471 auto builder = acir_format::create_circuit<MegaCircuitBuilder>(program);
472 builder.finalize_circuit(
true);
473 totals.push_back(
static_cast<uint32_t
>(
builder.num_gates));
static bool verify(const Proof &proof, const VerificationKey &vk)
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
Flavor::PrecomputedData get_precomputed()
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
WASM_EXPORT void acir_prove_aztec_client(uint8_t const *ivc_inputs_buf, uint8_t **out_proof, uint8_t **out_vk)
WASM_EXPORT void acir_prove_ultra_starknet_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_honk_solidity_verifier(uint8_t const *proof_buf, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_verify_ultra_keccak_zk_honk(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_gates_aztec_client(uint8_t const *ivc_inputs_buf, uint8_t **out)
WASM_EXPORT void acir_prove_ultra_keccak_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_verify_ultra_starknet_zk_honk(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_write_vk_ultra_starknet_zk_honk(uint8_t const *acir_vec, uint8_t **out)
WASM_EXPORT void acir_prove_ultra_zk_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_prove_and_verify_ultra_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, bool *result)
Construct and verify an UltraHonk proof.
WASM_EXPORT void acir_vk_as_fields_mega_honk(uint8_t const *vk_buf, fr::vec_out_buf out_vkey)
WASM_EXPORT void acir_write_vk_ultra_keccak_zk_honk(uint8_t const *acir_vec, uint8_t **out)
WASM_EXPORT void acir_prove_ultra_starknet_zk_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_verify_ultra_zk_honk(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_verify_ultra_starknet_honk(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_proof_as_fields_ultra_honk(uint8_t const *proof_buf, fr::vec_out_buf out)
WASM_EXPORT void acir_get_circuit_sizes(uint8_t const *acir_vec, bool const *recursive, bool const *honk_recursion, uint32_t *total, uint32_t *subgroup)
WASM_EXPORT void acir_write_vk_ultra_keccak_honk(uint8_t const *acir_vec, uint8_t **out)
WASM_EXPORT void acir_prove_ultra_keccak_zk_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, uint8_t const *vk_buf, uint8_t **out)
WASM_EXPORT void acir_verify_ultra_keccak_honk(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_prove_and_verify_mega_honk(uint8_t const *acir_vec, uint8_t const *witness_vec, bool *result)
Construct and verify a ClientIVC proof.
WASM_EXPORT void acir_write_vk_ultra_honk(uint8_t const *acir_vec, uint8_t **out)
WASM_EXPORT void acir_verify_aztec_client(uint8_t const *proof_buf, uint8_t const *vk_buf, bool *result)
WASM_EXPORT void acir_write_vk_ultra_starknet_honk(uint8_t const *acir_vec, uint8_t **out)
WASM_EXPORT void acir_vk_as_fields_ultra_honk(uint8_t const *vk_buf, fr::vec_out_buf out_vkey)
std::string get_honk_solidity_verifier(auto const &verification_key)
UltraKeccakFlavor::VerificationKey VerificationKey
DeciderProvingKey_< UltraKeccakFlavor > DeciderProvingKey
UltraProver_< UltraKeccakFlavor > UltraKeccakProver
UltraProver_< UltraKeccakZKFlavor > UltraKeccakZKProver
UltraProver_< UltraZKFlavor > UltraZKProver
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
T from_buffer(B const &buffer, size_t offset=0)
std::vector< uint8_t > to_buffer(T const &value)
uint8_t * to_heap_buffer(T const &value)
A full proof for the IVC scheme containing a Mega proof showing correctness of the hiding circuit (wh...
static Proof from_msgpack_buffer(uint8_t const *&buffer)
uint8_t * to_msgpack_heap_buffer() const
Very quirky method to convert a msgpack buffer to a "heap" buffer.
This is the msgpack encoding of the objects returned by the following typescript: const stepToStruct ...
static std::vector< PrivateExecutionStepRaw > parse_uncompressed(const std::vector< uint8_t > &buf)
std::shared_ptr< ClientIVC > accumulate()
void parse(std::vector< PrivateExecutionStepRaw > &&steps)
void throw_or_abort(std::string const &err)