vid/avidm/
config.rs

1//! This module configures base fields, Merkle tree, etc for the AVID-M scheme
2
3use ark_ff::FftField;
4use ark_serialize::CanonicalSerialize;
5use jf_merkle_tree::hasher::HasherNode;
6use sha2::Digest;
7
8use crate::{VidError, VidResult};
9
10pub trait AvidMConfig {
11    type BaseField: FftField;
12
13    type Digest: jf_merkle_tree::NodeValue;
14
15    type MerkleTree: jf_merkle_tree::MerkleTreeScheme<Element = Self::Digest, Commitment = Self::Digest>;
16
17    /// Digest the raw shares into the element type for Merkle tree.
18    ///
19    /// # Errors
20    ///
21    /// This function will return an error if digest function fails.
22    fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
23}
24
25/// Configuration of Keccak256 based AVID-M scheme
26pub struct Keccak256Config;
27
28impl AvidMConfig for Keccak256Config {
29    type BaseField = ark_bn254::Fr;
30
31    type Digest = HasherNode<sha3::Keccak256>;
32
33    type MerkleTree = jf_merkle_tree::hasher::HasherMerkleTree<sha3::Keccak256, Self::Digest>;
34
35    fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest> {
36        let mut hasher = sha3::Keccak256::new();
37        raw_shares
38            .serialize_uncompressed(&mut hasher)
39            .map_err(|err| VidError::Internal(err.into()))?;
40        Ok(HasherNode::from(hasher.finalize()))
41    }
42}