use ff::Field;
pub const DEFAULT_NUM_CHALLENGES: usize = 100;
pub const DEFAULT_FILE_SIZE: usize = 1024;
pub const DEFAULT_TOTAL_FILES: usize = 10;
pub const DEFAULT_CHALLENGED_FILES: usize = 3;
pub const DEFAULT_CLI_NUM_CHALLENGES: usize = 10;
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 BENCHMARK_FILE_SIZE_SMALL: usize = 16;
pub const BENCHMARK_FILE_SIZE_MEDIUM: usize = 32;
pub const BENCHMARK_HASH_ITERATIONS: usize = 10_000;
pub const BENCHMARK_PROOF_ITERATIONS: usize = 1_000;
pub const BENCHMARK_VERIFY_ITERATIONS: usize = 10;
pub const BENCHMARK_TREE_LEAVES: usize = 256;
pub const BENCHMARK_PROOF_LEAF_INDEX: usize = 42;
pub const BENCHMARK_TREE_DEPTH: usize = 8;
pub const BENCHMARK_SEED: u64 = 12345;