1#![deny(missing_docs)]
9
10use displaydoc::Display;
11use jf_merkle_tree::MerkleTreeError;
12use jf_poseidon2::Poseidon2Error;
13use serde::{Deserialize, Serialize};
14
15pub mod avidm;
16pub mod avidm_gf2;
17mod utils;
18
19type VerificationResult = Result<(), ()>;
25
26#[derive(Display, Debug)]
28pub enum VidError {
29 Argument(String),
31 Internal(anyhow::Error),
33 InsufficientShares,
35 IndexOutOfBound,
37 InvalidParam,
39 InvalidShare,
41}
42
43impl From<Poseidon2Error> for VidError {
44 fn from(err: Poseidon2Error) -> Self {
45 VidError::Internal(err.into())
46 }
47}
48
49impl From<MerkleTreeError> for VidError {
50 fn from(err: MerkleTreeError) -> Self {
51 VidError::Internal(err.into())
52 }
53}
54
55impl From<reed_solomon_simd::Error> for VidError {
56 fn from(err: reed_solomon_simd::Error) -> Self {
57 VidError::Internal(err.into())
58 }
59}
60
61type VidResult<T> = Result<T, VidError>;
63
64pub trait VidScheme {
66 type Param: Send + Sync + Serialize + for<'a> Deserialize<'a>;
68
69 type Share: Send + Sync + Serialize + for<'a> Deserialize<'a>;
71
72 type Commit: Eq + PartialEq + Send + Sync + Serialize + for<'a> Deserialize<'a>;
74
75 fn commit(param: &Self::Param, payload: &[u8]) -> VidResult<Self::Commit>;
77
78 fn disperse(
80 param: &Self::Param,
81 distribution: &[u32],
82 payload: &[u8],
83 ) -> VidResult<(Self::Commit, Vec<Self::Share>)>;
84
85 #[allow(clippy::result_unit_err)]
87 fn verify_share(
88 param: &Self::Param,
89 commit: &Self::Commit,
90 share: &Self::Share,
91 ) -> VidResult<VerificationResult>;
92
93 fn recover(
95 param: &Self::Param,
96 commit: &Self::Commit,
97 shares: &[Self::Share],
98 ) -> VidResult<Vec<u8>>;
99}