plonky2/evm/src/all_stark.rs

176 lines
6.1 KiB
Rust
Raw Normal View History

use std::iter;
use plonky2::field::extension::Extendable;
use plonky2::field::types::Field;
2022-05-06 17:22:30 +02:00
use plonky2::hash::hash_types::RichField;
2022-05-13 10:48:56 +02:00
use crate::config::StarkConfig;
use crate::cpu::cpu_stark;
2022-05-18 09:22:58 +02:00
use crate::cpu::cpu_stark::CpuStark;
use crate::cpu::membus::NUM_GP_CHANNELS;
2022-12-02 13:56:52 -08:00
use crate::cross_table_lookup::{Column, CrossTableLookup, TableWithColumns};
use crate::keccak::keccak_stark;
2022-05-18 09:22:58 +02:00
use crate::keccak::keccak_stark::KeccakStark;
use crate::keccak_sponge::columns::{KECCAK_RATE_BYTES};
use crate::keccak_sponge::keccak_sponge_stark;
use crate::keccak_sponge::keccak_sponge_stark::{num_logic_ctls, KeccakSpongeStark};
use crate::logic;
use crate::logic::LogicStark;
use crate::memory::memory_stark;
use crate::memory::memory_stark::MemoryStark;
2022-05-06 17:22:30 +02:00
use crate::stark::Stark;
2022-05-12 20:38:11 +02:00
#[derive(Clone)]
2022-05-06 17:35:25 +02:00
pub struct AllStark<F: RichField + Extendable<D>, const D: usize> {
2022-05-11 14:35:33 +02:00
pub cpu_stark: CpuStark<F, D>,
pub keccak_stark: KeccakStark<F, D>,
pub keccak_sponge_stark: KeccakSpongeStark<F, D>,
pub logic_stark: LogicStark<F, D>,
pub memory_stark: MemoryStark<F, D>,
2022-05-17 09:24:22 +02:00
pub cross_table_lookups: Vec<CrossTableLookup<F>>,
2022-05-06 17:22:30 +02:00
}
impl<F: RichField + Extendable<D>, const D: usize> Default for AllStark<F, D> {
fn default() -> Self {
Self {
cpu_stark: CpuStark::default(),
keccak_stark: KeccakStark::default(),
keccak_sponge_stark: KeccakSpongeStark::default(),
logic_stark: LogicStark::default(),
memory_stark: MemoryStark::default(),
cross_table_lookups: all_cross_table_lookups(),
}
}
}
2022-05-13 10:48:56 +02:00
impl<F: RichField + Extendable<D>, const D: usize> AllStark<F, D> {
2022-08-26 10:12:45 +02:00
pub(crate) fn nums_permutation_zs(&self, config: &StarkConfig) -> [usize; NUM_TABLES] {
[
2022-05-13 10:48:56 +02:00
self.cpu_stark.num_permutation_batches(config),
self.keccak_stark.num_permutation_batches(config),
self.keccak_sponge_stark.num_permutation_batches(config),
self.logic_stark.num_permutation_batches(config),
2022-06-17 16:38:31 -07:00
self.memory_stark.num_permutation_batches(config),
2022-08-26 10:12:45 +02:00
]
2022-05-19 09:41:15 +02:00
}
2022-08-26 10:12:45 +02:00
pub(crate) fn permutation_batch_sizes(&self) -> [usize; NUM_TABLES] {
[
2022-05-19 09:41:15 +02:00
self.cpu_stark.permutation_batch_size(),
self.keccak_stark.permutation_batch_size(),
self.keccak_sponge_stark.permutation_batch_size(),
self.logic_stark.permutation_batch_size(),
2022-06-17 16:38:31 -07:00
self.memory_stark.permutation_batch_size(),
2022-08-26 10:12:45 +02:00
]
2022-05-13 10:48:56 +02:00
}
}
2022-08-25 22:04:28 +02:00
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
2022-05-06 17:22:30 +02:00
pub enum Table {
Cpu = 0,
Keccak = 1,
KeccakSponge = 2,
2022-08-14 16:36:07 -07:00
Logic = 3,
Memory = 4,
2022-05-06 17:22:30 +02:00
}
2022-08-26 10:12:45 +02:00
pub(crate) const NUM_TABLES: usize = Table::Memory as usize + 1;
2022-05-19 09:41:15 +02:00
pub(crate) fn all_cross_table_lookups<F: Field>() -> Vec<CrossTableLookup<F>> {
let mut ctls = vec![ctl_keccak(), ctl_logic(), ctl_memory(), ctl_keccak_sponge()];
2022-12-02 13:56:52 -08:00
// TODO: Some CTLs temporarily disabled while we get them working.
disable_ctl(&mut ctls[0]);
disable_ctl(&mut ctls[1]); // Enable once we populate logic log in keccak_sponge_log.
2022-12-02 13:56:52 -08:00
disable_ctl(&mut ctls[2]);
disable_ctl(&mut ctls[3]);
ctls
}
fn disable_ctl<F: Field>(ctl: &mut CrossTableLookup<F>) {
for table in &mut ctl.looking_tables {
table.filter_column = Some(Column::zero());
}
ctl.looked_table.filter_column = Some(Column::zero());
}
fn ctl_keccak<F: Field>() -> CrossTableLookup<F> {
let keccak_sponge_looking = TableWithColumns::new(
Table::KeccakSponge,
keccak_sponge_stark::ctl_looking_keccak(),
Some(keccak_sponge_stark::ctl_looking_keccak_filter()),
2022-08-14 16:36:07 -07:00
);
let keccak_looked = TableWithColumns::new(
Table::Keccak,
keccak_stark::ctl_data(),
Some(keccak_stark::ctl_filter()),
2022-08-14 16:36:07 -07:00
);
CrossTableLookup::new(vec![keccak_sponge_looking], keccak_looked, None)
}
fn ctl_keccak_sponge<F: Field>() -> CrossTableLookup<F> {
let cpu_looking = TableWithColumns::new(
Table::Cpu,
cpu_stark::ctl_data_keccak_sponge(),
Some(cpu_stark::ctl_filter_keccak_sponge()),
);
let keccak_sponge_looked = TableWithColumns::new(
Table::KeccakSponge,
keccak_sponge_stark::ctl_looked_data(),
Some(keccak_sponge_stark::ctl_looked_filter()),
);
CrossTableLookup::new(vec![cpu_looking], keccak_sponge_looked, None)
2022-08-14 16:36:07 -07:00
}
fn ctl_logic<F: Field>() -> CrossTableLookup<F> {
let cpu_looking = TableWithColumns::new(
Table::Cpu,
cpu_stark::ctl_data_logic(),
Some(cpu_stark::ctl_filter_logic()),
);
let mut all_lookers = vec![cpu_looking];
for i in 0..num_logic_ctls() {
let keccak_sponge_looking = TableWithColumns::new(
Table::KeccakSponge,
keccak_sponge_stark::ctl_looking_logic(i),
// TODO: Double check, but I think it's the same filter for memory and logic?
Some(keccak_sponge_stark::ctl_looking_memory_filter(i)),
);
all_lookers.push(keccak_sponge_looking);
}
let logic_looked =
TableWithColumns::new(Table::Logic, logic::ctl_data(), Some(logic::ctl_filter()));
CrossTableLookup::new(all_lookers, logic_looked, None)
}
2022-08-23 17:24:35 -07:00
fn ctl_memory<F: Field>() -> CrossTableLookup<F> {
let cpu_memory_code_read = TableWithColumns::new(
Table::Cpu,
cpu_stark::ctl_data_code_memory(),
Some(cpu_stark::ctl_filter_code_memory()),
);
let cpu_memory_gp_ops = (0..NUM_GP_CHANNELS).map(|channel| {
2022-08-14 16:36:07 -07:00
TableWithColumns::new(
Table::Cpu,
cpu_stark::ctl_data_gp_memory(channel),
Some(cpu_stark::ctl_filter_gp_memory(channel)),
2022-08-14 16:36:07 -07:00
)
});
let keccak_sponge_reads = (0..KECCAK_RATE_BYTES).map(|i| {
2022-08-14 16:36:07 -07:00
TableWithColumns::new(
Table::KeccakSponge,
keccak_sponge_stark::ctl_looking_memory(i),
Some(keccak_sponge_stark::ctl_looking_memory_filter(i)),
2022-08-14 16:36:07 -07:00
)
});
let all_lookers = iter::once(cpu_memory_code_read)
.chain(cpu_memory_gp_ops)
.chain(keccak_sponge_reads)
2022-08-14 16:36:07 -07:00
.collect();
let memory_looked = TableWithColumns::new(
Table::Memory,
memory_stark::ctl_data(),
Some(memory_stark::ctl_filter()),
);
CrossTableLookup::new(all_lookers, memory_looked, None)
2022-05-06 17:22:30 +02:00
}