use ff::Field;
pub const PRACTICAL_MAX_FILES: usize = 1024;
pub const MAX_NUM_CHALLENGES: usize = 10_000;
pub const BASE_CIRCUIT_ARITY: usize = 2;
#[inline]
pub fn circuit_arity(files_per_step: usize) -> usize {
BASE_CIRCUIT_ARITY + files_per_step + files_per_step + files_per_step + files_per_step
}
#[derive(Debug, Clone)]
pub struct PublicIOLayout {
pub files_per_step: usize,
}
impl PublicIOLayout {
pub const FIXED: usize = BASE_CIRCUIT_ARITY;
pub fn new(files_per_step: usize) -> Self {
Self { files_per_step }
}
pub fn arity(&self) -> usize {
Self::FIXED + 4 * self.files_per_step
}
fn section_start(&self, section: usize) -> usize {
Self::FIXED + section * self.files_per_step
}
pub fn idx_agg_root(&self) -> usize {
0
}
pub fn idx_state_in(&self) -> usize {
1
}
pub fn idx_ledger(&self, i: usize) -> usize {
self.section_start(0) + i
}
pub fn ledger_indices_range(&self) -> std::ops::Range<usize> {
self.section_start(0)..self.section_start(1)
}
pub fn idx_depth(&self, i: usize) -> usize {
self.section_start(1) + i
}
pub fn depths_range(&self) -> std::ops::Range<usize> {
self.section_start(1)..self.section_start(2)
}
pub fn idx_seed(&self, i: usize) -> usize {
self.section_start(2) + i
}
pub fn seeds_range(&self) -> std::ops::Range<usize> {
self.section_start(2)..self.section_start(3)
}
pub fn idx_leaf(&self, i: usize) -> usize {
self.section_start(3) + i
}
pub fn leaf_outputs_range(&self) -> std::ops::Range<usize> {
self.section_start(3)..self.section_start(4)
}
pub fn build_z0_primary(
&self,
aggregated_root: crate::api::FieldElement,
ledger_indices: &[usize],
depths: &[usize],
seeds: &[crate::api::FieldElement],
) -> Vec<crate::api::FieldElement> {
use crate::api::FieldElement;
let mut z0_primary = Vec::with_capacity(self.arity());
z0_primary.push(aggregated_root); z0_primary.push(FieldElement::ZERO);
for &idx in ledger_indices.iter() {
z0_primary.push(FieldElement::from(idx as u64));
}
while z0_primary.len() < Self::FIXED + self.files_per_step {
z0_primary.push(FieldElement::ZERO);
}
for &depth in depths.iter() {
z0_primary.push(FieldElement::from(depth as u64));
}
while z0_primary.len() < Self::FIXED + self.files_per_step + self.files_per_step {
z0_primary.push(FieldElement::ZERO);
}
for &seed in seeds.iter() {
z0_primary.push(seed);
}
while z0_primary.len()
< Self::FIXED + self.files_per_step + self.files_per_step + self.files_per_step
{
z0_primary.push(FieldElement::ZERO);
}
for _ in 0..self.files_per_step {
z0_primary.push(FieldElement::ZERO);
}
z0_primary
}
}
pub const DEFAULT_TEST_TREE_DEPTH: usize = 3;
#[inline]
pub fn derive_shape(num_files: usize, max_depth: usize) -> (usize, usize) {
let files_per_step = num_files.next_power_of_two().max(1);
let file_tree_depth = max_depth.max(1);
(files_per_step, file_tree_depth)
}
pub const CHUNK_SIZE_BYTES: usize = 31;
pub const DATA_SYMBOLS_PER_CODEWORD: usize = 231;
pub const PARITY_SYMBOLS_PER_CODEWORD: usize = 24;
pub const TOTAL_SYMBOLS_PER_CODEWORD: usize = 255;
pub const DEFAULT_ERASURE_DATA_SHARDS: usize = 10;
pub const DEFAULT_ERASURE_PARITY_SHARDS: usize = 1;
pub const MAX_LEDGER_SIZE_BYTES: usize = 100 * 1024 * 1024;
pub const LEDGER_FORMAT_VERSION: u16 = 1;
pub const TEST_RANDOM_SEED: u64 = 42;
pub const BTC_TX_FEE_USD_DEFAULT: f64 = 0.50;
pub const SINGLE_PROOF_SIZE_BYTES: usize = 10240;
pub const BLOCKS_PER_HOUR: usize = 6;
pub const BLOCKS_PER_DAY: usize = BLOCKS_PER_HOUR * 24;
pub const CHALLENGE_SPACING_BLOCKS: u64 = 50;
pub const CIRCUIT_COST_PER_DEPTH: usize = 100;
pub const S_CHAL: usize = 100;
pub const W_PROOF: u64 = 2016;