15#include <gtest/gtest.h>
21std::vector<uint8_t>
compress(
const std::vector<uint8_t>& input);
22std::vector<uint8_t>
decompress(
const void* bytes,
size_t size);
30std::filesystem::path get_test_dir(
const std::string_view& test_name)
32 std::filesystem::path temp_dir =
"tmp_api_ultra_honk_test";
33 std::filesystem::create_directories(temp_dir);
34 std::filesystem::create_directories(temp_dir / test_name);
35 return temp_dir / test_name;
43 auto bytecode_path = test_dir /
"circuit.gz";
44 auto witness_path = test_dir /
"witness.gz";
49 return { bytecode_path, witness_path };
60 const auto*
info = ::testing::UnitTest::GetInstance()->current_test_info();
66 if (std::filesystem::exists(
test_dir)) {
67 std::filesystem::remove_all(
test_dir);
76 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
84 auto vk_output_path = test_dir /
"vk";
85 std::filesystem::create_directories(vk_output_path);
86 api.
write_vk(flags, bytecode_path, vk_output_path);
87 EXPECT_TRUE(std::filesystem::exists(vk_output_path /
"vk"));
90 auto proof_output_dir = test_dir /
"proof";
91 std::filesystem::create_directories(proof_output_dir);
92 api.
prove(flags, bytecode_path, witness_path, vk_output_path /
"vk", proof_output_dir);
95 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"proof"));
96 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"public_inputs"));
100 api.
verify(flags, proof_output_dir /
"public_inputs", proof_output_dir /
"proof", vk_output_path /
"vk");
101 EXPECT_TRUE(verified);
106 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
115 auto proof_output_dir = test_dir /
"proof";
116 std::filesystem::create_directories(proof_output_dir);
117 api.
prove(flags, bytecode_path, witness_path,
"", proof_output_dir);
120 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"proof"));
121 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"public_inputs"));
122 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"vk"));
123 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"vk_hash"));
127 api.
verify(flags, proof_output_dir /
"public_inputs", proof_output_dir /
"proof", proof_output_dir /
"vk");
128 EXPECT_TRUE(verified);
133 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
141 auto vk_output_path = test_dir /
"vk";
142 std::filesystem::create_directories(vk_output_path);
143 api.
write_vk(vk_flags, bytecode_path, vk_output_path);
144 EXPECT_TRUE(std::filesystem::exists(vk_output_path /
"vk"));
151 auto proof_output_dir = test_dir /
"proof";
152 std::filesystem::create_directories(proof_output_dir);
153 api.
prove(flags, bytecode_path, witness_path, vk_output_path /
"vk", proof_output_dir);
156 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"proof"));
157 EXPECT_TRUE(std::filesystem::exists(proof_output_dir /
"public_inputs"));
162 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
167 {
"poseidon2",
true },
169 {
"keccak",
true } };
171 for (
const auto& [oracle_hash_type, disable_zk] : test_cases) {
177 auto case_dir = test_dir / (oracle_hash_type +
"_" + (disable_zk ?
"no_zk" :
"zk"));
178 std::filesystem::create_directories(case_dir);
183 api.
prove(flags, bytecode_path, witness_path,
"", case_dir);
186 bool verified = api.
verify(flags, case_dir /
"public_inputs", case_dir /
"proof", case_dir /
"vk");
187 EXPECT_TRUE(verified) <<
"Failed with oracle_hash_type=" << oracle_hash_type <<
", disable_zk=" << disable_zk;
193 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
198 api.
write_vk(flags, bytecode_path, test_dir);
207 info(
"after write_vk, expected_vk size: {}", expected_vk.bytes.size());
208 EXPECT_EQ(expected_vk.bytes,
read_file(test_dir /
"vk"));
209 EXPECT_EQ(expected_vk.hash,
read_file(test_dir /
"vk_hash"));
212 auto vk_from_bytes = from_buffer<UltraFlavor::VerificationKey>(expected_vk.bytes);
213 auto vk_from_file = from_buffer<UltraFlavor::VerificationKey>(
read_file(test_dir /
"vk"));
214 EXPECT_EQ(vk_from_bytes.to_field_elements(), vk_from_file.to_field_elements());
220 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
223 testing::internal::CaptureStdout();
229 api.
gates(flags, bytecode_path);
231 std::string output = testing::internal::GetCapturedStdout();
234 EXPECT_TRUE(output.find(
"gates_per_opcode") != std::string::npos);
239 auto [bytecode_path, witness_path] = create_test_circuit_files(test_dir);
248 auto proof_output_dir = test_dir /
"proof";
249 std::filesystem::create_directories(proof_output_dir);
250 api.
prove(flags, bytecode_path, witness_path,
"", proof_output_dir);
253 auto nonexistent_vk_path = test_dir /
"nonexistent_vk";
255 api.
verify(flags, proof_output_dir /
"public_inputs", proof_output_dir /
"proof", nonexistent_vk_path);
256 FAIL() <<
"Expected an exception to be thrown";
257 }
catch (
const std::runtime_error& e) {
258 std::string error_msg = e.what();
260 EXPECT_TRUE(error_msg.find(
"--write_vk") != std::string::npos)
261 <<
"Error message should mention --write_vk flag. Got: " << error_msg;
262 EXPECT_TRUE(error_msg.find(
"bb write_vk") != std::string::npos)
263 <<
"Error message should mention bb write_vk command. Got: " << error_msg;
264 EXPECT_TRUE(error_msg.find(
"--vk_path") != std::string::npos)
265 <<
"Error message should mention --vk_path option. Got: " << error_msg;
TEST_F(ApiUltraHonkTest, ProveAndVerify)
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
UltraHonk-specific command definitions for the Barretenberg RPC API.
static void SetUpTestSuite()
std::filesystem::path test_dir
void prove(const Flags &flags, const std::filesystem::path &bytecode_path, const std::filesystem::path &witness_path, const std::filesystem::path &vk_path, const std::filesystem::path &output_dir)
void write_vk(const Flags &flags, const std::filesystem::path &bytecode_path, const std::filesystem::path &output_path) override
bool verify(const Flags &flags, const std::filesystem::path &public_inputs_path, const std::filesystem::path &proof_path, const std::filesystem::path &vk_path) override
void gates(const Flags &flags, const std::filesystem::path &bytecode_path) override
std::pair< std::vector< uint8_t >, std::vector< uint8_t > > create_simple_circuit_bytecode(size_t num_constraints=1)
Helper function to create a minimal circuit bytecode and witness for testing.
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
std::vector< uint8_t > compress(const std::vector< uint8_t > &input)
Save modified ivc-inputs.msgpack when VKs are rewritten.
std::vector< uint8_t > decompress(const void *bytes, size_t size)
Decompress bytecode and witness fields from ivc-inputs.msgpack.
std::vector< uint8_t > read_file(const std::string &filename, size_t bytes=0)
void write_file(const std::string &filename, std::vector< uint8_t > const &data)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bool include_gates_per_opcode
std::string oracle_hash_type