24 std::string
const& class_name,
25 bool include_types_import =
false)
28 const auto print_u256_const = [&](
const auto& element,
const std::string& name) {
29 os <<
"uint256 constant " << name <<
" = " << element <<
";" <<
std::endl;
32 const auto print_u256 = [&](
const auto& element,
const std::string& name) {
33 os <<
" " << name <<
": uint256(" << element <<
")," <<
std::endl;
36 const auto print_g1 = [&](
const auto& element,
const std::string& name,
const bool last =
false) {
37 os <<
" " << name <<
": Honk.G1Point({ \n"
40 <<
"uint256(" << element.x <<
"),\n"
43 <<
"uint256(" << element.y <<
")\n"
55 const auto print_types_import = [&]() {
56 if (include_types_import) {
57 os <<
"import { Honk } from \"../HonkTypes.sol\";\n";
63"// SPDX-License-Identifier: Apache-2.0\n"
64 "// Copyright 2022 Aztec\n"
65 "pragma solidity >=0.8.21;\n"
69 print_u256_const(1 <<
key->log_circuit_size,
"N");
70 print_u256_const(
key->log_circuit_size,
"LOG_N");
71 print_u256_const(
key->num_public_inputs,
"NUMBER_OF_PUBLIC_INPUTS");
72 print_u256_const(
key->hash(),
"VK_HASH");
74 "library " << class_name <<
" {\n"
75 " function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) {\n"
76 " Honk.VerificationKey memory vk = Honk.VerificationKey({\n";
77 print_u256(1 <<
key->log_circuit_size,
"circuitSize");
78 print_u256(
key->log_circuit_size,
"logCircuitSize");
79 print_u256(
key->num_public_inputs,
"publicInputsSize");
80 print_g1(
key->q_l,
"ql");
81 print_g1(
key->q_r,
"qr");
82 print_g1(
key->q_o,
"qo");
83 print_g1(
key->q_4,
"q4");
84 print_g1(
key->q_m,
"qm");
85 print_g1(
key->q_c,
"qc");
86 print_g1(
key->q_lookup,
"qLookup");
87 print_g1(
key->q_arith,
"qArith");
88 print_g1(
key->q_delta_range,
"qDeltaRange");
89 print_g1(
key->q_elliptic,
"qElliptic");
90 print_g1(
key->q_memory,
"qMemory");
91 print_g1(
key->q_nnf,
"qNnf");
92 print_g1(
key->q_poseidon2_external,
"qPoseidon2External");
93 print_g1(
key->q_poseidon2_internal,
"qPoseidon2Internal");
94 print_g1(
key->sigma_1,
"s1");
95 print_g1(
key->sigma_2,
"s2");
96 print_g1(
key->sigma_3,
"s3");
97 print_g1(
key->sigma_4,
"s4");
98 print_g1(
key->table_1,
"t1");
99 print_g1(
key->table_2,
"t2");
100 print_g1(
key->table_3,
"t3");
101 print_g1(
key->table_4,
"t4");
102 print_g1(
key->id_1,
"id1");
103 print_g1(
key->id_2,
"id2");
104 print_g1(
key->id_3,
"id3");
105 print_g1(
key->id_4,
"id4");
106 print_g1(
key->lagrange_first,
"lagrangeFirst");
107 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