mod common;
use common::{zero_statement, default_params};
use nebu::Goldilocks;
use nox::{reduce, Order, Tag, VecTrace, NullCalls};
use zheng::{commit, verify, HashAux};
const ORDER_SIZE: usize = 1024;
#[test]
fn hash_poseidon2_single_atom_roundtrip() {
let mut order = Order::<ORDER_SIZE>::new();
let s = order.atom(Goldilocks::new(42), Tag::Field).unwrap();
let tag1 = order.atom(Goldilocks::new(1), Tag::Field).unwrap();
let tag15 = order.atom(Goldilocks::new(15), Tag::Field).unwrap();
let quote_f = order.cell(tag1, s).unwrap(); let hash_f = order.cell(tag15, quote_f).unwrap();
let mut trace = VecTrace::default();
reduce(&mut order, s, hash_f, 100, &NullCalls, &mut trace);
assert_eq!(trace.0.len(), 26, "hash trace must be 26 rows");
let in_digest = *order.digest(s).unwrap();
let rate = [
in_digest[0], in_digest[1], in_digest[2], in_digest[3],
Goldilocks::ZERO, Goldilocks::ZERO, Goldilocks::ZERO, Goldilocks::ZERO,
];
let hash_aux = HashAux { rate };
let stmt = zero_statement();
let proof = commit(&trace, &[hash_aux], &[], &[], &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("hash proof must verify");
}
#[test]
fn hash_two_independent_inputs_both_verify() {
let run_hash = |input_val: u64| {
let mut order = Order::<ORDER_SIZE>::new();
let s = order.atom(Goldilocks::new(input_val), Tag::Field).unwrap();
let tag1 = order.atom(Goldilocks::new(1), Tag::Field).unwrap();
let tag15 = order.atom(Goldilocks::new(15), Tag::Field).unwrap();
let quote_f = order.cell(tag1, s).unwrap();
let hash_f = order.cell(tag15, quote_f).unwrap();
let mut trace = VecTrace::default();
reduce(&mut order, s, hash_f, 100, &NullCalls, &mut trace);
let in_digest = *order.digest(s).unwrap();
let rate = [
in_digest[0], in_digest[1], in_digest[2], in_digest[3],
Goldilocks::ZERO, Goldilocks::ZERO, Goldilocks::ZERO, Goldilocks::ZERO,
];
(trace, HashAux { rate })
};
let (trace_a, aux_a) = run_hash(100);
let (trace_b, aux_b) = run_hash(999);
let stmt = zero_statement();
let params = default_params();
let proof_a = commit(&trace_a, &[aux_a], &[], &[], &stmt, ¶ms).unwrap();
verify(&proof_a, &stmt, ¶ms).expect("hash(100) proof must verify");
let proof_b = commit(&trace_b, &[aux_b], &[], &[], &stmt, ¶ms).unwrap();
verify(&proof_b, &stmt, ¶ms).expect("hash(999) proof must verify");
}