21 std::string
const& class_name,
22 bool include_types_import =
false)
25 const auto print_u256_const = [&](
const auto& element,
const std::string& name) {
26 os <<
"uint256 constant " << name <<
" = " << element <<
";" <<
std::endl;
29 const auto print_u256 = [&](
const auto& element,
const std::string& name) {
30 os <<
" " << name <<
": uint256(" << element <<
")," <<
std::endl;
33 const auto print_g1 = [&](
const auto& element,
const std::string& name,
const bool last =
false) {
34 os <<
" " << name <<
": Honk.G1Point({ \n"
37 <<
"uint256(" << element.x <<
"),\n"
40 <<
"uint256(" << element.y <<
")\n"
52 const auto print_types_import = [&]() {
53 if (include_types_import) {
54 os <<
"import { Honk } from \"../HonkTypes.sol\";\n";
61 "// SPDX-License-Identifier: Apache-2.0\n"
62 "// Copyright 2022 Aztec\n"
63 "pragma solidity >=0.8.21;\n"
67 print_u256_const(1 <<
key->log_circuit_size,
"N");
68 print_u256_const(
key->log_circuit_size,
"LOG_N");
69 print_u256_const(
key->num_public_inputs,
"NUMBER_OF_PUBLIC_INPUTS");
70 print_u256_const(
key->hash(),
"VK_HASH");
72 "library " << class_name <<
" {\n"
73 " function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) {\n"
74 " Honk.VerificationKey memory vk = Honk.VerificationKey({\n";
75 print_u256(1 <<
key->log_circuit_size,
"circuitSize");
76 print_u256(
key->log_circuit_size,
"logCircuitSize");
77 print_u256(
key->num_public_inputs,
"publicInputsSize");
78 print_g1(
key->q_l,
"ql");
79 print_g1(
key->q_r,
"qr");
80 print_g1(
key->q_o,
"qo");
81 print_g1(
key->q_4,
"q4");
82 print_g1(
key->q_m,
"qm");
83 print_g1(
key->q_c,
"qc");
84 print_g1(
key->q_lookup,
"qLookup");
85 print_g1(
key->q_arith,
"qArith");
86 print_g1(
key->q_delta_range,
"qDeltaRange");
87 print_g1(
key->q_elliptic,
"qElliptic");
88 print_g1(
key->q_memory,
"qMemory");
89 print_g1(
key->q_nnf,
"qNnf");
90 print_g1(
key->q_poseidon2_external,
"qPoseidon2External");
91 print_g1(
key->q_poseidon2_internal,
"qPoseidon2Internal");
92 print_g1(
key->sigma_1,
"s1");
93 print_g1(
key->sigma_2,
"s2");
94 print_g1(
key->sigma_3,
"s3");
95 print_g1(
key->sigma_4,
"s4");
96 print_g1(
key->table_1,
"t1");
97 print_g1(
key->table_2,
"t2");
98 print_g1(
key->table_3,
"t3");
99 print_g1(
key->table_4,
"t4");
100 print_g1(
key->id_1,
"id1");
101 print_g1(
key->id_2,
"id2");
102 print_g1(
key->id_3,
"id3");
103 print_g1(
key->id_4,
"id4");
104 print_g1(
key->lagrange_first,
"lagrangeFirst");
105 print_g1(
key->lagrange_last,
"lagrangeLast",
true);
void output_vk_sol_ultra_honk(std::ostream &os, auto const &key, std::string const &class_name, bool include_types_import=false)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept