ab_proof_of_space/
chiapos.rs

1//! Chia proof of space reimplementation in Rust
2
3mod constants;
4mod table;
5mod tables;
6mod utils;
7
8pub use crate::chiapos::table::TablesCache;
9use crate::chiapos::table::metadata_size_bytes;
10use crate::chiapos::tables::TablesGeneric;
11use crate::chiapos::utils::EvaluatableUsize;
12
13type Seed = [u8; 32];
14type Challenge = [u8; 32];
15#[cfg(not(any(feature = "full-chiapos", test)))]
16type Quality = ();
17#[cfg(any(feature = "full-chiapos", test))]
18type Quality = [u8; 32];
19
20/// Collection of Chia tables
21#[derive(Debug)]
22pub struct Tables<const K: u8>(TablesGeneric<K>)
23where
24    EvaluatableUsize<{ metadata_size_bytes(K, 1) }>: Sized,
25    EvaluatableUsize<{ metadata_size_bytes(K, 2) }>: Sized,
26    EvaluatableUsize<{ metadata_size_bytes(K, 3) }>: Sized,
27    EvaluatableUsize<{ metadata_size_bytes(K, 4) }>: Sized,
28    EvaluatableUsize<{ metadata_size_bytes(K, 5) }>: Sized,
29    EvaluatableUsize<{ metadata_size_bytes(K, 6) }>: Sized,
30    EvaluatableUsize<{ metadata_size_bytes(K, 7) }>: Sized;
31
32macro_rules! impl_any {
33    ($($k: expr$(,)? )*) => {
34        $(
35impl Tables<$k> {
36    /// Create Chia proof of space tables. There also exists [`Self::create_parallel()`] that trades
37    /// CPU efficiency and memory usage for lower latency.
38    ///
39    /// Advanced version of [`Self::create_simple`] that allows to reuse cache.
40    pub fn create(seed: Seed, cache: &mut TablesCache<$k>) -> Self {
41        Self(TablesGeneric::<$k>::create(
42            seed, cache,
43        ))
44    }
45
46    /// Almost the same as [`Self::create()`], but uses parallelism internally for better
47    /// performance (though not efficiency of CPU and memory usage), if you create multiple tables
48    /// in parallel, prefer [`Self::create()`] for better overall performance.
49    #[cfg(any(feature = "parallel", test))]
50    pub fn create_parallel(seed: Seed, cache: &mut TablesCache<$k>) -> Self {
51        Self(TablesGeneric::<$k>::create_parallel(
52            seed, cache,
53        ))
54    }
55
56    /// Create Chia proof of space tables.
57    ///
58    /// Simpler version of [`Self::create`].
59    pub fn create_simple(seed: Seed) -> Self {
60        Self::create(seed, &mut TablesCache::default())
61    }
62
63    /// Find proof of space quality for given challenge.
64    #[cfg(any(feature = "full-chiapos", test))]
65    pub fn find_quality<'a>(
66        &'a self,
67        challenge: &'a Challenge,
68    ) -> impl Iterator<Item = Quality> + 'a {
69        self.0.find_quality(challenge)
70    }
71
72    /// Find proof of space for given challenge.
73    pub fn find_proof<'a>(
74        &'a self,
75        challenge: &'a Challenge,
76    ) -> impl Iterator<Item = [u8; 64 * $k / 8]> + 'a {
77        self.0.find_proof(challenge)
78    }
79
80    /// Verify proof of space for given seed and challenge.
81    pub fn verify(
82        seed: Seed,
83        challenge: &Challenge,
84        proof_of_space: &[u8; 64 * $k as usize / 8],
85    ) -> Option<Quality> {
86        TablesGeneric::<$k>::verify(seed, challenge, proof_of_space)
87    }
88}
89        )*
90    }
91}
92
93// Only these k values are supported by current implementation
94#[cfg(feature = "full-chiapos")]
95impl_any!(15, 16, 18, 19, 21, 22, 23, 24, 25);
96#[cfg(any(feature = "full-chiapos", test))]
97impl_any!(17);
98impl_any!(20);