15void prove_tube(
const std::string& output_path,
const std::string& vk_path)
17 using namespace stdlib::recursion::honk;
20 using StdlibProof = ClientIVCRecursiveVerifier::StdlibProof;
24 std::string proof_path = output_path +
"/proof";
28 auto vk = from_buffer<ClientIVC::VerificationKey>(
read_file(vk_path));
31 ClientIVCRecursiveVerifier verifier{ &
builder,
vk.mega };
33 StdlibProof stdlib_proof(
builder, proof);
34 ClientIVCRecursiveVerifier::Output client_ivc_rec_verifier_output = verifier.verify(stdlib_proof);
40 for (
size_t i = 0; i < num_inner_public_inputs; i++) {
41 stdlib_proof.mega_proof[i].set_public();
46 inputs.
pairing_inputs = client_ivc_rec_verifier_output.points_accumulator;
47 inputs.
ipa_claim = client_ivc_rec_verifier_output.opening_claim;
51 builder.ipa_proof = client_ivc_rec_verifier_output.ipa_proof.get_value();
58 info(
"WARNING: computing tube vk in prove_tube, but a precomputed vk should be passed in.");
61 Prover tube_prover{ proving_key, tube_verification_key };
62 auto tube_proof = tube_prover.construct_proof();
63 std::string tubePublicInputsPath = output_path +
"/public_inputs";
64 std::string tubeProofPath = output_path +
"/proof";
67 tube_proof.begin() +
static_cast<std::ptrdiff_t>(num_inner_public_inputs)),
73 std::string tubePublicInputsAsFieldsPath = output_path +
"/public_inputs_fields.json";
74 std::string tubeProofAsFieldsPath = output_path +
"/proof_fields.json";
77 return std::string(
"[]");
81 auto public_inputs_data = to_json(public_inputs_and_proof.public_inputs);
82 auto proof_data = to_json(public_inputs_and_proof.proof);
83 write_file(tubePublicInputsAsFieldsPath, { public_inputs_data.begin(), public_inputs_data.end() });
84 write_file(tubeProofAsFieldsPath, { proof_data.begin(), proof_data.end() });
86 std::string tubeVkPath = output_path +
"/vk";
89 std::string tubeAsFieldsVkPath = output_path +
"/vk_fields.json";
90 auto field_els = tube_verification_key->to_field_elements();
91 info(
"verificaton key length in fields:", field_els.size());
92 auto data = to_json(field_els);
95 info(
"Native verification of the tube_proof");
97 Verifier tube_verifier(tube_verification_key, ipa_verification_key);
100 const size_t HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS =
104 HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS + num_inner_public_inputs,
105 "In prove_tube, tube proof length is incorrect.");
108 HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS - IPA_PROOF_LENGTH + num_inner_public_inputs);
109 auto ipa_proof =
HonkProof(tube_proof.begin() + honk_proof_with_pub_inputs_length, tube_proof.end());
110 auto tube_honk_proof =
HonkProof(tube_proof.begin(), tube_proof.end() + honk_proof_with_pub_inputs_length);
111 bool verified = tube_verifier.template verify_proof<bb::RollupIO>(tube_honk_proof, ipa_proof).result;
112 info(
"Tube proof verification: ", verified);