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<
16 Element = Self::Digest,
17 Commitment = Self::Digest,
18 >;
19
20 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
26}
27
28pub 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}