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(
6 array_chunks,
7 array_windows,
8 generic_const_exprs,
9 portable_simd,
10 step_trait
11)]
12
13pub mod chia;
14pub mod chiapos;
15pub mod shim;
16
17use ab_core_primitives::pos::{PosProof, PosSeed};
18use ab_core_primitives::solutions::SolutionPotVerifier;
19#[cfg(feature = "alloc")]
20use core::fmt;
21
22#[derive(Debug, Clone, Copy)]
24pub enum PosTableType {
25 Chia,
27 Shim,
29}
30
31#[cfg(feature = "alloc")]
33pub trait TableGenerator<T: Table>: fmt::Debug + Default + Clone + Send + Sized + 'static {
34 fn generate(&mut self, seed: &PosSeed) -> T;
38
39 #[cfg(any(feature = "parallel", test))]
44 fn generate_parallel(&mut self, seed: &PosSeed) -> T {
45 self.generate(seed)
46 }
47}
48
49pub trait Table: SolutionPotVerifier + Sized + Send + Sync + 'static {
51 const TABLE_TYPE: PosTableType;
53 #[cfg(feature = "alloc")]
55 type Generator: TableGenerator<Self>;
56
57 #[cfg(feature = "alloc")]
61 fn generate(seed: &PosSeed) -> Self;
62
63 #[cfg(all(feature = "alloc", any(feature = "parallel", test)))]
68 fn generate_parallel(seed: &PosSeed) -> Self {
69 Self::generate(seed)
70 }
71
72 #[cfg(feature = "alloc")]
74 fn find_proof(&self, challenge_index: u32) -> Option<PosProof>;
75
76 fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool;
78
79 #[cfg(feature = "alloc")]
81 fn generator() -> Self::Generator {
82 Self::Generator::default()
83 }
84}