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