1use ark_ff::FftField;
4use ark_serialize::CanonicalSerialize;
5use jf_crhf::CRHF;
6use jf_merkle_tree::hasher::HasherNode;
7use jf_poseidon2::{
8 constants::bn254::Poseidon2ParamsBn3, crhf::FixedLenPoseidon2Hash, sponge::Poseidon2SpongeState,
9};
10use sha2::Digest;
11
12use crate::{VidError, VidResult};
13
14pub trait AvidMConfig {
15 type BaseField: FftField;
16
17 type Digest: jf_merkle_tree::NodeValue;
18
19 type MerkleTree: jf_merkle_tree::MerkleTreeScheme<
20 Element = Self::Digest,
21 Commitment = Self::Digest,
22 >;
23
24 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
30}
31
32pub struct Poseidon2Config;
34
35type Poseidon2SpongeStateBnN3R1 = Poseidon2SpongeState<ark_bn254::Fr, 3, 1, Poseidon2ParamsBn3>;
36
37impl AvidMConfig for Poseidon2Config {
38 type BaseField = ark_bn254::Fr;
39
40 type Digest = ark_bn254::Fr;
41
42 type MerkleTree = jf_merkle_tree::append_only::MerkleTree<
43 Self::Digest,
44 FixedLenPoseidon2Hash<Self::BaseField, Poseidon2SpongeStateBnN3R1, 3, 1>,
45 u64,
46 3,
47 Self::Digest,
48 >;
49
50 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest> {
51 jf_poseidon2::crhf::VariableLenPoseidon2Hash::<Self::BaseField, Poseidon2SpongeStateBnN3R1, 1>::evaluate(
52 raw_shares,
53 )
54 .map(|v| v[0])
55 .map_err(|err| VidError::Internal(err.into()))
56 }
57}
58
59pub struct Sha256Config;
61
62impl AvidMConfig for Sha256Config {
63 type BaseField = ark_bn254::Fr;
64
65 type Digest = HasherNode<sha2::Sha256>;
66
67 type MerkleTree = jf_merkle_tree::hasher::HasherMerkleTree<sha2::Sha256, Self::Digest>;
68
69 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest> {
70 let mut hasher = sha2::Sha256::new();
71 raw_shares
72 .serialize_uncompressed(&mut hasher)
73 .map_err(|err| VidError::Internal(err.into()))?;
74 Ok(HasherNode::from(hasher.finalize()))
75 }
76}
77
78pub struct Keccak256Config;
80
81impl AvidMConfig for Keccak256Config {
82 type BaseField = ark_bn254::Fr;
83
84 type Digest = HasherNode<sha3::Keccak256>;
85
86 type MerkleTree = jf_merkle_tree::hasher::HasherMerkleTree<sha3::Keccak256, Self::Digest>;
87
88 fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest> {
89 let mut hasher = sha3::Keccak256::new();
90 raw_shares
91 .serialize_uncompressed(&mut hasher)
92 .map_err(|err| VidError::Internal(err.into()))?;
93 Ok(HasherNode::from(hasher.finalize()))
94 }
95}