55 for (
int i = 31; i >= 0; --i) {
56 out.push_back(
static_cast<uint8_t
>(val.
data[i / 8] >> (8 * (i % 8))));
62 if (pos + 32 >
data.size()) {
66 for (
int i = 31; i >= 0; --i) {
67 val.
data[i / 8] |=
static_cast<uint64_t
>(
data[pos++]) << (8 * (i % 8));
93 template <
typename ScalarFn,
typename CommitmentFn>
95 CommitmentFn&& process_commitment,
96 size_t num_public_inputs)
99 for (
size_t i = 0; i < num_public_inputs; i++) {
104 process_commitment();
112 template <
typename ScalarFn,
typename CommitmentFn>
118 for (
size_t i = 0; i < 4; i++) {
119 process_commitment();
122 process_commitment();
124 for (
size_t i = 0; i < 13; i++) {
128 process_commitment();
129 process_commitment();
138 template <
typename ScalarFn,
typename CommitmentFn>
141 constexpr size_t log_n = CONST_ECCVM_LOG_N;
145 for (
size_t i = 0; i < num_witness; i++) {
146 process_commitment();
149 process_commitment();
153 for (
size_t i = 0; i < log_n; i++) {
154 process_commitment();
165 process_commitment();
166 process_commitment();
168 for (
size_t i = 0; i < log_n - 1; i++) {
169 process_commitment();
172 for (
size_t i = 0; i < log_n; i++) {
176 for (
size_t i = 0; i < NUM_SMALL_IPA_EVALUATIONS; i++) {
180 process_commitment();
184 process_commitment();
186 for (
size_t i = 0; i < NUM_TRANSLATION_EVALUATIONS; i++) {
192 process_commitment();
193 process_commitment();
195 for (
size_t i = 0; i < NUM_SMALL_IPA_EVALUATIONS; i++) {
199 process_commitment();
206 template <
typename ScalarFn,
typename CommitmentFn>
207 static void walk_ipa_proof(ScalarFn&& process_scalar, CommitmentFn&& process_commitment)
210 for (
size_t i = 0; i < CONST_ECCVM_LOG_N; i++) {
211 process_commitment();
212 process_commitment();
215 process_commitment();
226 template <
typename ScalarFn,
typename CommitmentFn>
232 process_commitment();
235 process_commitment();
238 process_commitment();
242 process_commitment();
247 for (
size_t round = 0; round <
JOINT_LOG_N; round++) {
254 process_commitment();
273 process_commitment();
274 process_commitment();
279 process_commitment();
286 for (
size_t i = 0; i < NUM_SMALL_IPA_EVALUATIONS; i++) {
290 process_commitment();
291 process_commitment();
298 template <
typename BN254ScalarFn,
typename BN254CommFn,
typename GrumpkinScalarFn,
typename GrumpkinCommFn>
300 BN254CommFn&& bn254_comm,
301 GrumpkinScalarFn&& grumpkin_scalar,
302 GrumpkinCommFn&& grumpkin_comm,
303 size_t mega_num_public_inputs)
408 auto counter = [&]() { count++; };
409 walk_chonk_proof(counter, counter, counter, counter, mega_num_public_inputs);
419 if (compressed_bytes % 32 != 0) {
420 throw_or_abort(
"proof_compression: compressed size not aligned to 32 bytes");
422 size_t total_elements = compressed_bytes / 32;
424 if (total_elements < fixed_elements) {
427 return total_elements - fixed_elements;
437 std::vector<uint8_t> out;
438 out.reserve(flat.size() * 32);
444 auto bn254_comm = [&]() {
445 bool is_infinity = flat[
offset].is_zero() && flat[
offset + 1].is_zero() && flat[
offset + 2].is_zero() &&
446 flat[
offset + 3].is_zero();
466 auto grumpkin_comm = [&]() {
484 auto grumpkin_scalar = [&]() {
490 size_t mega_num_pub_inputs =
492 walk_chonk_proof(bn254_scalar, bn254_comm, grumpkin_scalar, grumpkin_comm, mega_num_pub_inputs);
493 if (
offset != flat.size()) {
494 throw_or_abort(
"proof_compression: compress did not consume all proof elements");
505 auto bn254_scalar = [&]() {
510 flat.emplace_back(raw);
513 auto bn254_comm = [&]() {
521 for (
int j = 0; j < 4; j++) {
528 throw_or_abort(
"proof_compression: BN254 x-coordinate out of range");
532 auto [is_square, y] = y_squared.
sqrt();
543 flat.emplace_back(x_lo);
544 flat.emplace_back(x_hi);
545 flat.emplace_back(y_lo);
546 flat.emplace_back(y_hi);
550 auto grumpkin_comm = [&]() {
564 throw_or_abort(
"proof_compression: Grumpkin x-coordinate out of range");
568 auto [is_square, y] = y_squared.
sqrt();
577 flat.emplace_back(x);
578 flat.emplace_back(y);
581 auto grumpkin_scalar = [&]() {
584 throw_or_abort(
"proof_compression: Grumpkin scalar out of range");
588 flat.emplace_back(lo);
589 flat.emplace_back(hi);
592 walk_chonk_proof(bn254_scalar, bn254_comm, grumpkin_scalar, grumpkin_comm, mega_num_public_inputs);
593 if (pos != compressed.size()) {
594 throw_or_abort(
"proof_compression: decompression did not consume all bytes");
static constexpr size_t NUM_MASKING_POLYNOMIALS
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t PROOF_LENGTH
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WITNESS_ENTITIES
Compresses Chonk proofs from vector<fr> to compact byte representations.
static void walk_joint_proof(ScalarFn &&process_scalar, CommitmentFn &&process_commitment)
Walk the joint proof (translator oink + joint sumcheck + joint PCS, all BN254).
static constexpr size_t BN254_FRS_PER_COMM
static constexpr size_t EXPECTED_MERGE_FRS
static constexpr uint64_t FQ_SPLIT_BITS
static std::vector< uint8_t > compress_chonk_proof(const ChonkProof &proof)
static ChonkProof decompress_chonk_proof(const std::vector< uint8_t > &compressed, size_t mega_num_public_inputs)
static constexpr size_t EXPECTED_ECCVM_FRS
static size_t compressed_element_count(size_t mega_num_public_inputs=0)
Count the total compressed elements for a Chonk proof. Each element (scalar or commitment,...
static void walk_eccvm_proof(ScalarFn &&process_scalar, CommitmentFn &&process_commitment)
Walk an ECCVM proof (all Grumpkin).
curve::BN254::ScalarField Fr
static constexpr uint256_t SIGN_BIT_MASK
curve::BN254::BaseField Fq
static constexpr size_t GRUMPKIN_FRS_PER_SCALAR
static constexpr size_t EXPECTED_JOINT_FRS
static void write_u256(std::vector< uint8_t > &out, const uint256_t &val)
static constexpr size_t EXPECTED_IPA_FRS
static bool y_is_negative(const Field &y)
True if y is in the "upper half" of its field, used for point compression sign bit.
static void walk_merge_proof(ScalarFn &&process_scalar, CommitmentFn &&process_commitment)
Walk a Merge proof (42 Fr, all BN254).
static constexpr size_t GRUMPKIN_FRS_PER_COMM
static size_t compressed_mega_num_public_inputs(size_t compressed_bytes)
Derive mega_num_public_inputs from compressed proof size.
static void walk_chonk_proof(BN254ScalarFn &&bn254_scalar, BN254CommFn &&bn254_comm, GrumpkinScalarFn &&grumpkin_scalar, GrumpkinCommFn &&grumpkin_comm, size_t mega_num_public_inputs)
Walk a full Chonk proof (5 sub-proofs across two curves).
static Fq reconstruct_fq(const Fr &lo, const Fr &hi)
static void walk_ipa_proof(ScalarFn &&process_scalar, CommitmentFn &&process_commitment)
Walk an IPA proof (64 Fr, all Grumpkin).
static constexpr size_t EXPECTED_HIDING_OINK_FRS
static uint256_t read_u256(const std::vector< uint8_t > &data, size_t &pos)
static void walk_mega_zk_oink_proof(ScalarFn &&process_scalar, CommitmentFn &&process_commitment, size_t num_public_inputs)
Walk a MegaZK Oink-only proof (BN254).
static constexpr uint64_t NUM_LIMB_BITS
static constexpr size_t JOINT_LOG_N
static std::pair< Fr, Fr > split_fq(const Fq &val)
static constexpr size_t BN254_FRS_PER_SCALAR
static constexpr size_t NUM_FULL_CIRCUIT_EVALUATIONS
static constexpr size_t CONST_TRANSLATOR_LOG_N
static constexpr size_t NUM_MINICIRCUIT_EVALUATIONS
static constexpr size_t LOG_MINI_CIRCUIT_SIZE
static constexpr size_t NUM_COMMITMENTS_IN_PROOF
const std::vector< MemoryValue > data
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
static ChonkProof_ from_field_elements(const std::vector< FF > &fields)
Reconstruct proof from field elements.
HonkProof hiding_oink_proof
std::vector< FF > to_field_elements() const
Serialize proof to field elements (native mode)
Computes Oink proof length from flavor traits.
static constexpr uint256_t modulus
constexpr std::pair< bool, field > sqrt() const noexcept
Compute square root of the field element.
BB_INLINE constexpr bool is_zero() const noexcept
static constexpr field zero()
static constexpr bb::fr b
void throw_or_abort(std::string const &err)