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