|
Barretenberg
The ZK-SNARK library at the core of Aztec
|
Manages ECC operations for the Goblin proving system. More...
#include <ecc_op_queue.hpp>
Public Member Functions | |
| ECCOpQueue () | |
| Instantiate an initial ECC op subtable. | |
| void | initialize_new_subtable () |
| Initialize a new subtable for eccvm and ultra ops with the given merge settings. | |
| size_t | num_subtables () const |
| size_t | get_current_subtable_size () const |
| size_t | get_append_offset () const |
| Compute the fixed append offset for the final APPEND merge. | |
| void | merge () |
| void | merge_fixed_append (size_t ultra_fixed_offset) |
| std::array< Polynomial< Fr >, ULTRA_TABLE_WIDTH > | construct_zk_columns () |
| std::vector< std::array< Polynomial< Fr >, ULTRA_TABLE_WIDTH > > | construct_subtable_columns () const |
| std::array< Polynomial< Fr >, ULTRA_TABLE_WIDTH > | construct_ultra_ops_table_columns (const bool include_zk_ops=true) const |
| std::array< Polynomial< Fr >, ULTRA_TABLE_WIDTH > | construct_table_columns_up_to_tail () const |
| std::array< Polynomial< Fr >, ULTRA_TABLE_WIDTH > | construct_current_ultra_ops_subtable_columns () const |
| void | construct_full_eccvm_ops_table () |
| void | construct_zk_reconstructed_ultra_ops_table () |
| void | construct_no_zk_reconstructed_ultra_ops_table () |
| size_t | get_ultra_ops_table_num_rows () const |
| size_t | get_ultra_ops_count () const |
| size_t | get_ultra_ops_table_num_rows_up_to_tail () const |
| std::vector< ECCVMOperation > & | get_eccvm_ops () |
| std::vector< UltraOp > & | get_no_zk_reconstructed_ultra_ops () |
| std::vector< UltraOp > & | get_zk_reconstructed_ultra_ops () |
| size_t | get_num_msm_rows () const |
| Get the number of rows in the 'msm' column section, for all msms in the circuit. | |
| size_t | get_num_rows () const |
| Get the number of rows for the current ECCVM circuit. | |
| uint32_t | get_number_of_muls () const |
| Get number of muls for the current ECCVM circuit. | |
| void | set_eccvm_ops_for_fuzzing (std::vector< ECCVMOperation > &eccvm_ops_in) |
| A fuzzing only method for setting eccvm ops directly. | |
| void | add_erroneous_equality_op_for_testing () |
| A testing only method that adds an erroneous equality op to the eccvm ops. | |
| void | empty_row_for_testing () |
| Write empty row to queue. | |
| Point | get_accumulator () |
| UltraOp | add_accumulate (const Point &to_add) |
| Write point addition op to queue and natively perform addition. | |
| UltraOp | mul_accumulate (const Point &to_mul, const Fr &scalar) |
| Write multiply and add op to queue and natively perform operation. | |
| UltraOp | no_op_ultra_only () |
| Writes a no-op to the ultra ops table but adds no eccvm operations. | |
| UltraOp | random_op_ultra_only () |
| Writes randomness to the ultra ops table but adds no eccvm operations. | |
| UltraOp | eq_and_reset () |
| Write equality op using internal accumulator point. | |
| UltraOp | append_hiding_op (const Fq &Px, const Fq &Py) |
| Add a hiding op with random Px, Py values to both ECCVM and Ultra ops tables. | |
Static Public Attributes | |
| static const size_t | OP_QUEUE_SIZE = 1 << CONST_OP_QUEUE_LOG_SIZE |
Private Types | |
| using | Curve = curve::BN254 |
| using | Point = Curve::AffineElement |
| using | Fr = Curve::ScalarField |
| using | Fq = Curve::BaseField |
Private Member Functions | |
| void | append_eccvm_op (const ECCVMOperation &op) |
| Append an eccvm operation to the eccvm ops table; update the eccvm row tracker. | |
| UltraOp | construct_and_populate_ultra_ops (EccOpCode op_code, const Point &point, const Fr &scalar=Fr::zero()) |
| Given an ecc operation and its inputs, decompose into ultra format and populate ultra_ops. | |
Private Attributes | |
| Point | point_at_infinity = Curve::Group::affine_point_at_infinity |
| Point | accumulator = point_at_infinity |
| EccvmOpsTable | eccvm_ops_table |
| UltraEccOpsTable | ultra_ops_table |
| std::vector< ECCVMOperation > | eccvm_ops_reconstructed |
| std::vector< UltraOp > | ultra_ops_zk_reconstructed |
| std::vector< UltraOp > | ultra_ops_no_zk_reconstructed |
| EccvmRowTracker | eccvm_row_tracker |
| ECCVMOperation | hiding_op_for_eccvm |
| bool | has_hiding_op = false |
Static Private Attributes | |
| static constexpr size_t | ULTRA_TABLE_WIDTH = UltraEccOpsTable::TABLE_WIDTH |
Manages ECC operations for the Goblin proving system.
This class maintains two parallel representations of ECC operations:
Operations are added via add_accumulate(), mul_accumulate(), and eq_and_reset(). Each operation:
Tables grow by appending subtables (one per circuit in an IVC). See ecc_ops_table.hpp for details.
TODO(https://github.com/AztecProtocol/barretenberg/issues/1267): consider possible efficiency improvements
Definition at line 38 of file ecc_op_queue.hpp.
|
private |
Definition at line 39 of file ecc_op_queue.hpp.
|
private |
Definition at line 42 of file ecc_op_queue.hpp.
|
private |
Definition at line 41 of file ecc_op_queue.hpp.
|
private |
Definition at line 40 of file ecc_op_queue.hpp.
|
inline |
Instantiate an initial ECC op subtable.
Definition at line 69 of file ecc_op_queue.hpp.
Write point addition op to queue and natively perform addition.
| to_add |
Definition at line 249 of file ecc_op_queue.hpp.
|
inline |
A testing only method that adds an erroneous equality op to the eccvm ops.
May be used to ensure that ECCVM responds as expected when encountering a bad op
Definition at line 225 of file ecc_op_queue.hpp.
|
inlineprivate |
Append an eccvm operation to the eccvm ops table; update the eccvm row tracker.
Definition at line 397 of file ecc_op_queue.hpp.
Add a hiding op with random Px, Py values to both ECCVM and Ultra ops tables.
The hiding op contributes random Px, Py field elements to both ECCVM transcript polynomials and Translator's accumulated_result, providing statistical hiding.
In ECCVM: stored separately and prepended to eccvm_ops_reconstructed at index 0 during get_eccvm_ops(). This places it at row 1 in the ECCVM transcript table (row 0 is the zero row for shifts), where lagrange_second = 1. The eq and on-curve constraints are gated by (1 - lagrange_second) so they don't apply to this row. The transcript relation enforces q_eq = 1 and q_reset = 1 at this row, ensuring the accumulator is reset so that is_accumulator_empty = 1 at row 2 (the first real op row).
In Ultra/Translator: appended to current subtable through normal flow, landing in the accumulation range.
The hiding op uses opcode q_eq = 1, q_reset = 1 (value = 3) to preserve the Px, Py values in the transcript. The eq constraint is gated by (1 - lagrange_second) so it doesn't actually check equality. The on-curve check is similarly gated. q_reset = 1 is required for Translator compatibility (only opcodes {0,3,4,8} are allowed).
This method writes the same hiding op to both the ECCVM and Ultra tables in one step, ensuring the two representations agree (required for the translation check).
| Px | Random field element (not necessarily a valid x-coordinate on BN254) |
| Py | Random field element (not necessarily a valid y-coordinate on BN254) |
Definition at line 367 of file ecc_op_queue.hpp.
|
inlineprivate |
Given an ecc operation and its inputs, decompose into ultra format and populate ultra_ops.
| op_code | |
| point | |
| scalar |
Definition at line 410 of file ecc_op_queue.hpp.
|
inline |
Definition at line 138 of file ecc_op_queue.hpp.
|
inline |
Definition at line 144 of file ecc_op_queue.hpp.
|
inline |
Definition at line 153 of file ecc_op_queue.hpp.
|
inline |
Definition at line 119 of file ecc_op_queue.hpp.
|
inline |
Definition at line 132 of file ecc_op_queue.hpp.
|
inline |
Definition at line 125 of file ecc_op_queue.hpp.
|
inline |
Definition at line 110 of file ecc_op_queue.hpp.
|
inline |
Definition at line 147 of file ecc_op_queue.hpp.
|
inline |
Write empty row to queue.
Definition at line 236 of file ecc_op_queue.hpp.
|
inline |
Write equality op using internal accumulator point.
Definition at line 329 of file ecc_op_queue.hpp.
|
inline |
Definition at line 242 of file ecc_op_queue.hpp.
|
inline |
Compute the fixed append offset for the final APPEND merge.
Places the appended subtable so the merged polynomial fits exactly in MINI_CIRCUIT_SIZE rows. The appended subtable carries UltraEccOpsTable::APPEND_TRACE_OFFSET leading zero rows internally, matching the appender flavor's ecc_op_wire layout.
Definition at line 91 of file ecc_op_queue.hpp.
|
inline |
Definition at line 83 of file ecc_op_queue.hpp.
|
inline |
Definition at line 166 of file ecc_op_queue.hpp.
|
inline |
Definition at line 179 of file ecc_op_queue.hpp.
|
inline |
Get the number of rows in the 'msm' column section, for all msms in the circuit.
Definition at line 198 of file ecc_op_queue.hpp.
|
inline |
Get the number of rows for the current ECCVM circuit.
Definition at line 204 of file ecc_op_queue.hpp.
|
inline |
Get number of muls for the current ECCVM circuit.
Definition at line 209 of file ecc_op_queue.hpp.
|
inline |
Definition at line 160 of file ecc_op_queue.hpp.
|
inline |
Definition at line 159 of file ecc_op_queue.hpp.
|
inline |
Definition at line 162 of file ecc_op_queue.hpp.
|
inline |
Definition at line 187 of file ecc_op_queue.hpp.
|
inline |
Initialize a new subtable for eccvm and ultra ops with the given merge settings.
Definition at line 75 of file ecc_op_queue.hpp.
|
inline |
Definition at line 98 of file ecc_op_queue.hpp.
|
inline |
Definition at line 104 of file ecc_op_queue.hpp.
Write multiply and add op to queue and natively perform operation.
| to_add |
Definition at line 266 of file ecc_op_queue.hpp.
|
inline |
Writes a no-op to the ultra ops table but adds no eccvm operations.
Adds two zero rows (one no-op = NUM_ROWS_PER_OP rows) to the ultra ops table. Translator needs two leading zero rows for polynomial shiftability.
Definition at line 294 of file ecc_op_queue.hpp.
|
inline |
Definition at line 81 of file ecc_op_queue.hpp.
|
inline |
Writes randomness to the ultra ops table but adds no eccvm operations.
This method is used to add randomness to the ultra ops table with the aim of randomising the commitment and evaluations of its corresponding columns
Definition at line 308 of file ecc_op_queue.hpp.
|
inline |
A fuzzing only method for setting eccvm ops directly.
Definition at line 215 of file ecc_op_queue.hpp.
|
private |
Definition at line 47 of file ecc_op_queue.hpp.
|
private |
Definition at line 54 of file ecc_op_queue.hpp.
|
private |
Definition at line 49 of file ecc_op_queue.hpp.
|
private |
Definition at line 62 of file ecc_op_queue.hpp.
|
private |
Definition at line 391 of file ecc_op_queue.hpp.
|
private |
Definition at line 390 of file ecc_op_queue.hpp.
|
static |
Definition at line 65 of file ecc_op_queue.hpp.
|
private |
Definition at line 44 of file ecc_op_queue.hpp.
|
private |
Definition at line 59 of file ecc_op_queue.hpp.
|
private |
Definition at line 50 of file ecc_op_queue.hpp.
|
private |
Definition at line 58 of file ecc_op_queue.hpp.
|
staticconstexprprivate |
Definition at line 43 of file ecc_op_queue.hpp.