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_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    /// Digest the raw shares into the element type for Merkle tree.
25    ///
26    /// # Errors
27    ///
28    /// This function will return an error if digest function fails.
29    fn raw_share_digest(raw_shares: &[Self::BaseField]) -> VidResult<Self::Digest>;
30}
31
32/// Configuration of Poseidon2 based AVID-M scheme
33pub 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
59/// Configuration of Sha256 based AVID-M scheme
60pub 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
78/// Configuration of Keccak256 based AVID-M scheme
79pub 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}