mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-14 11:43:12 +00:00
* Halo2 style lookup arguments in System Zero It's a really nice and simple protocol, particularly for the verifier since the constraints are trivial (aside from the underlying batched permutation checks, which we already support). See the [Halo2 book](https://zcash.github.io/halo2/design/proving-system/lookup.html) and this [talk](https://www.youtube.com/watch?v=YlTt12s7vGE&t=5237s) by @daira. Previously we generated the whole trace in row-wise form, but it's much more efficient to generate these "permuted" columns column-wise. So I changed our STARK framework to accept the trace in column-wise form. STARK impls now have the flexibility to do some generation row-wise and some column-wise (without extra costs; there's a single transpose as before). * sorting * fixes * PR feedback * into_iter * timing
38 lines
1.1 KiB
Rust
38 lines
1.1 KiB
Rust
//! Lookup unit.
|
|
//! See https://zcash.github.io/halo2/design/proving-system/lookup.html
|
|
|
|
const START_UNIT: usize = super::START_LOOKUP;
|
|
|
|
pub(crate) const NUM_LOOKUPS: usize =
|
|
super::range_check_16::NUM_RANGE_CHECKS + super::range_check_degree::NUM_RANGE_CHECKS;
|
|
|
|
pub(crate) const fn col_input(i: usize) -> usize {
|
|
if i < super::range_check_16::NUM_RANGE_CHECKS {
|
|
super::range_check_16::col_rc_16_input(i)
|
|
} else {
|
|
super::range_check_degree::col_rc_degree_input(i - super::range_check_16::NUM_RANGE_CHECKS)
|
|
}
|
|
}
|
|
|
|
/// This column contains a permutation of the input values.
|
|
pub(crate) const fn col_permuted_input(i: usize) -> usize {
|
|
debug_assert!(i < NUM_LOOKUPS);
|
|
START_UNIT + 2 * i
|
|
}
|
|
|
|
pub(crate) const fn col_table(i: usize) -> usize {
|
|
if i < super::range_check_16::NUM_RANGE_CHECKS {
|
|
super::core::COL_RANGE_16
|
|
} else {
|
|
super::core::COL_CLOCK
|
|
}
|
|
}
|
|
|
|
/// This column contains a permutation of the table values.
|
|
pub(crate) const fn col_permuted_table(i: usize) -> usize {
|
|
debug_assert!(i < NUM_LOOKUPS);
|
|
START_UNIT + 2 * i + 1
|
|
}
|
|
|
|
pub(super) const END: usize = START_UNIT + NUM_LOOKUPS * 2;
|