1#![deny(missing_docs)]
9
10use displaydoc::Display;
11use jf_merkle_tree::MerkleTreeError;
12use jf_poseidon2::Poseidon2Error;
13use serde::{Deserialize, Serialize};
14
15pub mod avid_m;
16mod utils;
17
18type VerificationResult = Result<(), ()>;
24
25#[derive(Display, Debug)]
27pub enum VidError {
28 Argument(String),
30 Internal(anyhow::Error),
32 InsufficientShares,
34 IndexOutOfBound,
36 InvalidParam,
38 InvalidShare,
40}
41
42impl From<Poseidon2Error> for VidError {
43 fn from(err: Poseidon2Error) -> Self {
44 VidError::Internal(err.into())
45 }
46}
47
48impl From<MerkleTreeError> for VidError {
49 fn from(err: MerkleTreeError) -> Self {
50 VidError::Internal(err.into())
51 }
52}
53
54type VidResult<T> = Result<T, VidError>;
56
57pub trait VidScheme {
59 type Param: Send + Sync + Serialize + for<'a> Deserialize<'a>;
61
62 type Share: Send + Sync + Serialize + for<'a> Deserialize<'a>;
64
65 type Commit: Eq + PartialEq + Send + Sync + Serialize + for<'a> Deserialize<'a>;
67
68 fn commit(param: &Self::Param, payload: &[u8]) -> VidResult<Self::Commit>;
70
71 fn disperse(
73 param: &Self::Param,
74 distribution: &[u32],
75 payload: &[u8],
76 ) -> VidResult<(Self::Commit, Vec<Self::Share>)>;
77
78 #[allow(clippy::result_unit_err)]
80 fn verify_share(
81 param: &Self::Param,
82 commit: &Self::Commit,
83 share: &Self::Share,
84 ) -> VidResult<VerificationResult>;
85
86 fn recover(
88 param: &Self::Param,
89 commit: &Self::Commit,
90 shares: &[Self::Share],
91 ) -> VidResult<Vec<u8>>;
92}