proof-of-sql 0.129.0

High performance zero knowledge (ZK) prover for SQL.
Documentation
use super::{FinalRoundBuilder, ProvableQueryResult};
use crate::{
    base::{
        commitment::{Commitment, CommittableColumn},
        database::{Column, ColumnField, ColumnType},
    },
    proof_primitive::inner_product::curve_25519_scalar::Curve25519Scalar,
};
use alloc::{collections::VecDeque, sync::Arc};
#[cfg(feature = "arrow")]
use arrow::{
    array::Int64Array,
    datatypes::{Field, Schema},
    record_batch::RecordBatch,
};
use curve25519_dalek::RistrettoPoint;

#[test]
fn we_can_compute_commitments_for_intermediate_mles_using_a_zero_offset() {
    let mle1 = [1, 2];
    let mle2 = [10i64, 20];
    let mut builder = FinalRoundBuilder::<Curve25519Scalar>::new(1, VecDeque::new());
    builder.produce_anchored_mle(&mle1);
    builder.produce_intermediate_mle(&mle2[..]);
    let offset_generators = 0_usize;
    let commitments: Vec<RistrettoPoint> = builder.commit_intermediate_mles(offset_generators, &());
    assert_eq!(
        commitments,
        [RistrettoPoint::compute_commitments(
            &[CommittableColumn::from(&mle2[..])],
            offset_generators,
            &()
        )[0]]
    );
}

#[test]
fn we_can_compute_commitments_for_intermediate_mles_using_a_non_zero_offset() {
    let mle1 = [1, 2];
    let mle2 = [10i64, 20];
    let mut builder = FinalRoundBuilder::<Curve25519Scalar>::new(1, VecDeque::new());
    builder.produce_anchored_mle(&mle1);
    builder.produce_intermediate_mle(&mle2[..]);
    let offset_generators = 123_usize;
    let commitments: Vec<RistrettoPoint> = builder.commit_intermediate_mles(offset_generators, &());
    assert_eq!(
        commitments,
        [RistrettoPoint::compute_commitments(
            &[CommittableColumn::from(&mle2[..])],
            offset_generators,
            &()
        )[0]]
    );
}

#[test]
fn we_can_evaluate_pcs_proof_mles() {
    let mle1 = [1, 2];
    let mle2 = [10i64, 20];
    let mut builder = FinalRoundBuilder::new(1, VecDeque::new());
    builder.produce_anchored_mle(&mle1);
    builder.produce_intermediate_mle(&mle2[..]);
    let evaluation_vec = [
        Curve25519Scalar::from(100u64),
        Curve25519Scalar::from(10u64),
    ];
    let evals = builder.evaluate_pcs_proof_mles(&evaluation_vec);
    let expected_evals = [
        Curve25519Scalar::from(120u64),
        Curve25519Scalar::from(1200u64),
    ];
    assert_eq!(evals, expected_evals);
}

#[cfg(feature = "arrow")]
#[test]
fn we_can_form_the_provable_query_result() {
    let col1: Column<Curve25519Scalar> = Column::BigInt(&[11_i64, 12]);
    let col2: Column<Curve25519Scalar> = Column::BigInt(&[-3_i64, -4]);
    let res = ProvableQueryResult::new(2, &[col1, col2]);

    let column_fields = vec![
        ColumnField::new("a".into(), ColumnType::BigInt),
        ColumnField::new("b".into(), ColumnType::BigInt),
    ];
    let res = RecordBatch::try_from(
        res.to_owned_table::<Curve25519Scalar>(&column_fields)
            .unwrap(),
    )
    .unwrap();
    let column_fields: Vec<Field> = column_fields
        .iter()
        .map(core::convert::Into::into)
        .collect();
    let schema = Arc::new(Schema::new(column_fields));

    let expected_res = RecordBatch::try_new(
        schema,
        vec![
            Arc::new(Int64Array::from(vec![11, 12])),
            Arc::new(Int64Array::from(vec![-3, -4])),
        ],
    )
    .unwrap();
    assert_eq!(res, expected_res);
}

#[test]
fn we_can_consume_post_result_challenges_in_proof_builder() {
    let mut builder = FinalRoundBuilder::new(
        0,
        [
            Curve25519Scalar::from(123),
            Curve25519Scalar::from(456),
            Curve25519Scalar::from(789),
        ]
        .into(),
    );
    assert_eq!(
        Curve25519Scalar::from(123),
        builder.consume_post_result_challenge()
    );
    assert_eq!(
        Curve25519Scalar::from(456),
        builder.consume_post_result_challenge()
    );
    assert_eq!(
        Curve25519Scalar::from(789),
        builder.consume_post_result_challenge()
    );
}