1#![cfg_attr(not(feature = "std"), no_std)]
3#![expect(incomplete_features, reason = "generic_const_exprs")]
4#![warn(rust_2018_idioms, missing_debug_implementations, missing_docs)]
5#![feature(array_windows, generic_const_exprs, portable_simd, step_trait)]
6
7pub mod chia;
8pub mod chiapos;
9pub mod shim;
10
11use ab_core_primitives::pos::{PosProof, PosSeed};
12use ab_core_primitives::solutions::SolutionPotVerifier;
13#[cfg(feature = "alloc")]
14use core::fmt;
15
16#[derive(Debug, Clone, Copy)]
18pub enum PosTableType {
19 Chia,
21 Shim,
23}
24
25#[cfg(feature = "alloc")]
27pub trait TableGenerator<T: Table>: fmt::Debug + Default + Clone + Send + Sized + 'static {
28 fn generate(&mut self, seed: &PosSeed) -> T;
32
33 #[cfg(any(feature = "parallel", test))]
38 fn generate_parallel(&mut self, seed: &PosSeed) -> T {
39 self.generate(seed)
40 }
41}
42
43pub trait Table: SolutionPotVerifier + Sized + Send + Sync + 'static {
45 const TABLE_TYPE: PosTableType;
47 #[cfg(feature = "alloc")]
49 type Generator: TableGenerator<Self>;
50
51 #[cfg(feature = "alloc")]
55 fn generate(seed: &PosSeed) -> Self;
56
57 #[cfg(all(feature = "alloc", any(feature = "parallel", test)))]
62 fn generate_parallel(seed: &PosSeed) -> Self {
63 Self::generate(seed)
64 }
65
66 #[cfg(feature = "alloc")]
68 fn find_proof(&self, challenge_index: u32) -> Option<PosProof>;
69
70 fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool;
72
73 #[cfg(feature = "alloc")]
75 fn generator() -> Self::Generator {
76 Self::Generator::default()
77 }
78}