proof-of-sql 0.128.2

High performance zero knowledge (ZK) prover for SQL.
Documentation
use super::{fold_columns, fold_vals};
use crate::{
    base::{database::Column, math::decimal::Precision},
    proof_primitive::inner_product::curve_25519_scalar::Curve25519Scalar,
};
use bumpalo::Bump;
use num_traits::Zero;

#[test]
fn we_can_fold_columns_with_scalars() {
    let expected = vec![
        Curve25519Scalar::from(77 + 1602 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("1"),
        Curve25519Scalar::from(77 + 2703 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("2"),
        Curve25519Scalar::from(77 + 3805 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("3"),
        Curve25519Scalar::from(77 + 4907 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("4"),
        Curve25519Scalar::from(77 + 5001 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("5"),
    ];

    let str_scalars: [Curve25519Scalar; 5] =
        ["1".into(), "2".into(), "3".into(), "4".into(), "5".into()];
    let scalars = [2.into(), 3.into(), 5.into(), 7.into(), 1.into()];
    let mut columns = vec![
        Column::BigInt(&[1, 2, 3, 4, 5]),
        Column::Int128(&[6, 7, 8, 9, 0]),
        Column::VarChar((&["1", "2", "3", "4", "5"], &str_scalars)),
        Column::Scalar(&scalars),
    ];

    let alloc = Bump::new();
    let result = alloc.alloc_slice_fill_copy(5, 77.into());
    fold_columns(result, 33.into(), 10.into(), &columns);

    assert_eq!(result, expected);

    columns.pop();
    columns.push(Column::Decimal75(Precision::new(75).unwrap(), -1, &scalars));

    let alloc = Bump::new();
    let result = alloc.alloc_slice_fill_copy(5, 77.into());
    fold_columns(result, 33.into(), 10.into(), &columns);

    assert_eq!(result, expected);
}

#[test]
fn we_can_fold_columns_with_that_get_padded() {
    let expected = vec![
        Curve25519Scalar::from(77 + 1602 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("1"),
        Curve25519Scalar::from(77 + 2703 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("2"),
        Curve25519Scalar::from(77 + 3800 * 33)
            + Curve25519Scalar::from(10 * 33) * Curve25519Scalar::from("3"),
        Curve25519Scalar::from(77 + 4900 * 33),
        Curve25519Scalar::from(77 + 5000 * 33),
        Curve25519Scalar::from(77),
        Curve25519Scalar::from(77),
        Curve25519Scalar::from(77),
        Curve25519Scalar::from(77),
        Curve25519Scalar::from(77),
        Curve25519Scalar::from(77),
    ];

    let str_scalars: [Curve25519Scalar; 3] = ["1".into(), "2".into(), "3".into()];
    let scalars = [2.into(), 3.into()];
    let mut columns = vec![
        Column::BigInt(&[1, 2, 3, 4, 5]),
        Column::Int128(&[6, 7, 8, 9]),
        Column::VarChar((&["1", "2", "3"], &str_scalars)),
        Column::Scalar(&scalars),
    ];
    let alloc = Bump::new();
    let result = alloc.alloc_slice_fill_copy(11, 77.into());
    fold_columns(result, 33.into(), 10.into(), &columns);

    assert_eq!(result, expected);

    columns.pop();
    columns.push(Column::Decimal75(Precision::new(75).unwrap(), -1, &scalars));

    let alloc = Bump::new();
    let result = alloc.alloc_slice_fill_copy(11, 77.into());
    fold_columns(result, 33.into(), 10.into(), &columns);

    assert_eq!(result, expected);
}

#[test]
fn we_can_fold_empty_columns() {
    let columns = vec![
        Column::BigInt::<Curve25519Scalar>(&[]),
        Column::Int128(&[]),
        Column::VarChar((&[], &[])),
        Column::Scalar(&[]),
        Column::Decimal75(Precision::new(75).unwrap(), -1, &[]),
    ];
    let alloc = Bump::new();
    let result = alloc.alloc_slice_fill_copy(0, 77.into());
    fold_columns(result, 33.into(), 10.into(), &columns);
    assert_eq!(result, vec![]);
}

#[test]
fn we_can_fold_vals() {
    assert_eq!(fold_vals(Curve25519Scalar::from(10), &[]), Zero::zero());
    assert_eq!(
        fold_vals(
            10.into(),
            &[
                Curve25519Scalar::from(1),
                2.into(),
                3.into(),
                4.into(),
                5.into()
            ]
        ),
        (12345).into()
    );
}