dragoonfri 0.1.0

Fast Reed-solomon Interactive oracle proof of proximity
Documentation
use dragoonfri_test_utils::{
    do_for_multiple_folding_factors, random_file, Fq, BLOWUP_FACTOR, DOMAIN_SIZE,
    NUMBER_OF_POLYNOMIALS, NUM_QUERIES, POLY_COEFFS_LEN,
};
use rand::{thread_rng, Rng};

use crate::{
    algorithms::Blake3,
    frida::{nth_evaluations, FridaCommitment},
    rng::FriChallenger,
    utils::{to_evaluations, HasherExt},
};

use super::FridaBuilder;

#[test]
fn test_frida() {
    let rng = FriChallenger::<Blake3>::default();
    let file = random_file::<Fq>(POLY_COEFFS_LEN, NUMBER_OF_POLYNOMIALS)
        .into_iter()
        .map(|poly| to_evaluations(poly, DOMAIN_SIZE))
        .collect::<Vec<_>>();

    do_for_multiple_folding_factors!(FACTOR = 2, 4, 8, 16 => {
        let builder =
            FridaBuilder::<_, Blake3>::new::<FACTOR, _>(&file, rng.clone(), BLOWUP_FACTOR, 1, NUM_QUERIES);

        let mut rng = thread_rng();

        let position = rng.gen_range(0..DOMAIN_SIZE);
        let proof = builder.prove_shards(&[position]);

        let mut positions = [rng.gen_range(0..DOMAIN_SIZE), rng.gen_range(0..DOMAIN_SIZE)];
        positions.sort();
        let proof2 = builder.prove_shards(&positions);

        let commit = FridaCommitment::from(builder);

        let rng = FriChallenger::<Blake3>::default();
        commit
            .verify::<FACTOR, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN, DOMAIN_SIZE)
            .unwrap();

        assert!(commit.verify::<{FACTOR*2}, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN, DOMAIN_SIZE).is_err());
        assert!(commit.verify::<{FACTOR/2}, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN, DOMAIN_SIZE).is_err());

        assert!(commit.verify::<FACTOR, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN, DOMAIN_SIZE / 2).is_err());
        assert!(commit.verify::<FACTOR, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN, DOMAIN_SIZE * 2).is_err());

        assert!(commit.verify::<FACTOR, _>(rng.clone(), NUM_QUERIES, POLY_COEFFS_LEN / 2, DOMAIN_SIZE).is_err());

        assert!(proof.verify(commit.tree_root(), &[position], &[Blake3::hash_item(&nth_evaluations(&file, position).collect::<Vec<_>>())], DOMAIN_SIZE));
        assert!(!proof.verify(commit.tree_root(), &[position], &[Blake3::hash_item(&nth_evaluations(&file, position + 1).collect::<Vec<_>>())], DOMAIN_SIZE));

        assert!(proof2.verify(commit.tree_root(), &positions, &Blake3::hash_many(&positions.iter().map(|&p| nth_evaluations(&file, p).collect::<Vec<_>>()).collect::<Vec<_>>()), DOMAIN_SIZE));

    });
}