subspace_proof_of_space/
chia_v2.rs1use 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#[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
38pub 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;