vid/avid_m/
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<
16        Element = Self::Digest,
17        Commitment = Self::Digest,
18    >;
19
20    /// Digest the raw shares into the element type for Merkle tree.
21    ///
22    /// # Errors
23    ///
24    /// This function will return an error if digest function fails.
25    fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
26}
27
28/// Configuration of Keccak256 based AVID-M scheme
29pub struct Keccak256Config;
30
31impl AvidMConfig for Keccak256Config {
32    type BaseField = ark_bn254::Fr;
33
34    type Digest = HasherNode<sha3::Keccak256>;
35
36    type MerkleTree = jf_merkle_tree::hasher::HasherMerkleTree<sha3::Keccak256, Self::Digest>;
37
38    fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest> {
39        let mut hasher = sha3::Keccak256::new();
40        raw_shares
41            .serialize_uncompressed(&mut hasher)
42            .map_err(|err| VidError::Internal(err.into()))?;
43        Ok(HasherNode::from(hasher.finalize()))
44    }
45}