1use 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 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
23}
24
25pub 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}