1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
use crate::error::Result; use crate::hasher::{Domain, HashFunction, Hasher}; use crate::merkle::MerkleTree; use crate::proof::ProofScheme; #[derive(Debug)] pub struct PublicParams { pub time: usize, } #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct Tau<T> { pub comm_r: T, pub comm_d: T, } impl<T: Domain> Tau<T> { pub fn new(comm_d: T, comm_r: T) -> Self { Tau { comm_d, comm_r } } } #[derive(Debug)] pub struct PublicInputs<'a, T: Domain> { pub id: &'a [u8], pub r: usize, pub tau: Tau<T>, } #[derive(Debug)] pub struct PrivateInputs<'a> { pub replica: &'a [u8], } #[derive(Debug, Clone)] pub struct ProverAux<H: Hasher> { pub tree_d: MerkleTree<H::Domain, H::Function>, pub tree_r: MerkleTree<H::Domain, H::Function>, } impl<H: Hasher> ProverAux<H> { pub fn new( tree_d: MerkleTree<H::Domain, H::Function>, tree_r: MerkleTree<H::Domain, H::Function>, ) -> Self { ProverAux { tree_d, tree_r } } } pub trait PoRep<'a, H: Hasher>: ProofScheme<'a> { type Tau; type ProverAux; fn replicate( pub_params: &'a Self::PublicParams, replica_id: &H::Domain, data: &mut [u8], data_tree: Option<MerkleTree<H::Domain, H::Function>>, ) -> Result<(Self::Tau, Self::ProverAux)>; fn extract_all( pub_params: &'a Self::PublicParams, replica_id: &H::Domain, replica: &[u8], ) -> Result<Vec<u8>>; fn extract( pub_params: &'a Self::PublicParams, replica_id: &H::Domain, replica: &[u8], node: usize, ) -> Result<Vec<u8>>; } pub fn replica_id<H: Hasher>(prover_id: [u8; 32], sector_id: [u8; 32]) -> H::Domain { let mut to_hash = [0; 64]; to_hash[..32].copy_from_slice(&prover_id); to_hash[32..].copy_from_slice(§or_id); H::Function::hash_leaf(&to_hash) }