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;
17pub mod utils;
21
22type VerificationResult = Result<(), ()>;
28
29#[derive(Display, Debug)]
31pub enum VidError {
32 Argument(String),
34 Internal(anyhow::Error),
36 InsufficientShares,
38 IndexOutOfBound,
40 InvalidParam,
42 InvalidShare,
44}
45
46impl From<Poseidon2Error> for VidError {
47 fn from(err: Poseidon2Error) -> Self {
48 VidError::Internal(err.into())
49 }
50}
51
52impl From<MerkleTreeError> for VidError {
53 fn from(err: MerkleTreeError) -> Self {
54 VidError::Internal(err.into())
55 }
56}
57
58impl From<reed_solomon_simd::Error> for VidError {
59 fn from(err: reed_solomon_simd::Error) -> Self {
60 VidError::Internal(err.into())
61 }
62}
63
64type VidResult<T> = Result<T, VidError>;
66
67pub trait VidScheme {
69 type Param: Send + Sync + Serialize + for<'a> Deserialize<'a>;
71
72 type Share: Send + Sync + Serialize + for<'a> Deserialize<'a>;
74
75 type Commit: Eq + PartialEq + Send + Sync + Serialize + for<'a> Deserialize<'a>;
77
78 fn commit(param: &Self::Param, payload: &[u8]) -> VidResult<Self::Commit>;
80
81 fn disperse(
83 param: &Self::Param,
84 distribution: &[u32],
85 payload: &[u8],
86 ) -> VidResult<(Self::Commit, Vec<Self::Share>)>;
87
88 #[allow(clippy::result_unit_err)]
90 fn verify_share(
91 param: &Self::Param,
92 commit: &Self::Commit,
93 share: &Self::Share,
94 ) -> VidResult<VerificationResult>;
95
96 fn recover(
98 param: &Self::Param,
99 commit: &Self::Commit,
100 shares: &[Self::Share],
101 ) -> VidResult<Vec<u8>>;
102}