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};
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
23impl TableGenerator<ChiaV2Table> for ChiaV2TableGenerator {
24    fn generate(&self, seed: &PosSeed) -> ChiaV2Table {
25        ChiaV2Table {
26            proofs: Tables::<K>::create_proofs((*seed).into()),
27        }
28    }
29
30    #[cfg(feature = "parallel")]
31    fn generate_parallel(&self, seed: &PosSeed) -> ChiaV2Table {
32        ChiaV2Table {
33            proofs: Tables::<K>::create_proofs_parallel((*seed).into()),
34        }
35    }
36}
37
38/// Proof of space table.
39///
40/// Chia implementation.
41pub struct ChiaV2Table {
42    proofs: Box<Proofs<K>>,
43}
44
45impl fmt::Debug for ChiaV2Table {
46    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47        f.debug_struct("ChiaV2Table").finish_non_exhaustive()
48    }
49}
50
51impl SolutionPotVerifier for ChiaV2Table {
52    fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool {
53        <ChiaTable as SolutionPotVerifier>::is_proof_valid(seed, challenge_index, proof)
54    }
55}
56
57impl Table for ChiaV2Table {
58    const TABLE_TYPE: PosTableType = PosTableType::Chia;
59    type Generator = ChiaV2TableGenerator;
60
61    fn find_proof(&self, challenge_index: u32) -> Option<PosProof> {
62        self.proofs
63            .for_s_bucket(SBucket::from(challenge_index as u16))
64            .map(PosProof::from)
65    }
66
67    fn is_proof_valid(seed: &PosSeed, challenge_index: u32, proof: &PosProof) -> bool {
68        <Self as SolutionPotVerifier>::is_proof_valid(seed, challenge_index, proof)
69    }
70}
71
72#[cfg(test)]
73mod tests;