Skip to main content

subspace_proof_of_space/
chia_v2.rs

1//! Chia proof of space backed by abundance's `ab-proof-of-space`.
2//!
3//! Proofs are looked up under Subspace's s-bucket convention, so they verify under the existing
4//! [`ChiaTable`] verifier.
5
6use crate::chia::ChiaTable;
7use crate::{PosTableType, Table, TableGenerator};
8use ab_proof_of_space::chiapos::{Proofs, Tables, TablesCache};
9use alloc::boxed::Box;
10use core::fmt;
11use subspace_core_primitives::pos::{PosProof, PosSeed};
12use subspace_core_primitives::sectors::SBucket;
13use subspace_core_primitives::solutions::SolutionPotVerifier;
14
15const K: u8 = PosProof::K;
16
17/// Proof of space table generator.
18///
19/// Chia implementation.
20#[derive(Debug, Default, Clone)]
21pub struct ChiaV2TableGenerator {
22    tables_cache: TablesCache,
23}
24
25impl TableGenerator<ChiaV2Table> for ChiaV2TableGenerator {
26    fn generate(&self, seed: &PosSeed) -> ChiaV2Table {
27        ChiaV2Table {
28            proofs: Tables::<K>::create_proofs((*seed).into(), &self.tables_cache),
29        }
30    }
31
32    #[cfg(feature = "parallel")]
33    fn generate_parallel(&self, seed: &PosSeed) -> ChiaV2Table {
34        ChiaV2Table {
35            proofs: Tables::<K>::create_proofs_parallel((*seed).into(), &self.tables_cache),
36        }
37    }
38}
39
40/// Proof of space table.
41///
42/// Chia implementation.
43pub struct ChiaV2Table {
44    proofs: Box<Proofs<K>>,
45}
46
47impl fmt::Debug for ChiaV2Table {
48    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49        f.debug_struct("ChiaV2Table").finish_non_exhaustive()
50    }
51}
52
53impl SolutionPotVerifier for ChiaV2Table {
54    fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool {
55        <ChiaTable as SolutionPotVerifier>::is_proof_valid(seed, challenge_index, proof)
56    }
57}
58
59impl Table for ChiaV2Table {
60    const TABLE_TYPE: PosTableType = PosTableType::Chia;
61    type Generator = ChiaV2TableGenerator;
62
63    fn find_proof(&self, challenge_index: u32) -> Option<PosProof> {
64        self.proofs
65            .for_s_bucket(SBucket::from(challenge_index as u16))
66            .map(PosProof::from)
67    }
68
69    fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool {
70        <Self as SolutionPotVerifier>::is_proof_valid(seed, challenge_index, proof)
71    }
72}
73
74#[cfg(test)]
75mod tests;