use super::*;
#[test]
fn e2e_hash_accumulator_roundtrip() {
let mut order = Reduction::<1024>::new();
let s = order.atom(Goldilocks::new(42)).unwrap();
let tag1 = order.atom(Goldilocks::new(1)).unwrap();
let tag15 = order.atom(Goldilocks::new(15)).unwrap();
let quote_f = order.pair(tag1, s).unwrap();
let hash_f = order.pair(tag15, quote_f).unwrap();
let mut trace = VecTrace::default();
nox::reduce(&mut order, s, hash_f, 100, &NullCalls, &mut trace);
assert_eq!(trace.0.len(), 26);
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 params = ProofParams::default();
let trace_proof = commit(&trace, &[hash_aux], &[], &[], &stmt, ¶ms).unwrap();
assert!(verify(&trace_proof, &stmt, ¶ms).is_ok());
}
#[test]
fn e2e_axis_accumulator_and_statement_binding_roundtrip() {
let mut order = Reduction::<1024>::new();
let s = order.atom(Goldilocks::new(7)).unwrap();
let tag0 = order.atom(Goldilocks::new(0)).unwrap();
let addr1 = order.atom(Goldilocks::new(1)).unwrap();
let axis_f = order.pair(tag0, addr1).unwrap();
let mut trace = VecTrace::default();
nox::reduce(&mut order, s, axis_f, 100, &NullCalls, &mut trace);
nox::reduce(&mut order, s, axis_f, 99, &NullCalls, &mut trace);
assert_eq!(trace.0.len(), 2);
let input_hash = super::row_hash(&trace.0[0]);
let output_hash = super::row_hash(&trace.0[trace.0.len() - 1]);
let stmt = Statement {
program_hash: [0u8; 32],
input_hash,
output_hash,
focus_bound: 10,
bbg_root: [0u8; 32],
};
let params = ProofParams::default();
let trace_proof = commit(&trace, &[], &[], &[], &stmt, ¶ms).unwrap();
assert!(verify(&trace_proof, &stmt, ¶ms).is_ok());
}
#[test]
fn e2e_statement_binding_rejects_wrong_input_hash() {
let mut order = Reduction::<1024>::new();
let s = order.atom(Goldilocks::new(7)).unwrap();
let tag0 = order.atom(Goldilocks::new(0)).unwrap();
let addr = order.atom(Goldilocks::new(1)).unwrap();
let axis_f = order.pair(tag0, addr).unwrap();
let mut trace = VecTrace::default();
nox::reduce(&mut order, s, axis_f, 100, &NullCalls, &mut trace);
nox::reduce(&mut order, s, axis_f, 99, &NullCalls, &mut trace);
let mut wrong_hash = [0u8; 32];
wrong_hash[0] = 0xff;
let stmt = Statement {
program_hash: [0u8; 32],
input_hash: wrong_hash,
output_hash: [0u8; 32],
focus_bound: 0,
bbg_root: [0u8; 32],
};
let params = ProofParams::default();
let err = commit(&trace, &[], &[], &[], &stmt, ¶ms);
assert!(matches!(err, Err(CommitError::StatementMismatch)));
}
#[test]
fn e2e_statement_binding_rejects_focus_exceeded() {
let trace = malformed_trace(); let stmt = Statement {
program_hash: [0u8; 32],
input_hash: [0u8; 32],
output_hash: [0u8; 32],
focus_bound: 1, bbg_root: [0u8; 32],
};
let params = ProofParams::default();
let err = commit(&trace, &[], &[], &[], &stmt, ¶ms);
assert!(matches!(err, Err(CommitError::FocusExhausted)));
}
#[test]
fn e2e_compose_roundtrip() {
let g = Goldilocks::new;
let mut ar = Reduction::<1024>::new();
let obj = ar.atom(g(5)).unwrap();
let t1 = ar.atom(g(1)).unwrap();
let five = ar.atom(g(5)).unwrap();
let nine = ar.atom(g(9)).unwrap();
let qx = ar.pair(t1, five).unwrap();
let q9 = ar.pair(t1, nine).unwrap();
let qq9 = ar.pair(t1, q9).unwrap();
let body = ar.pair(qx, qq9).unwrap();
let t2 = ar.atom(g(2)).unwrap();
let formula = ar.pair(t2, body).unwrap();
let mut trace = VecTrace::default();
nox::reduce(&mut ar, obj, formula, 1000, &NullCalls, &mut trace);
nox::reduce(&mut ar, obj, formula, 1000, &NullCalls, &mut trace);
assert!(
trace.0.iter().any(|r| r.r()[0] == 2),
"trace has a compose row"
);
let stmt = zero_statement();
let params = ProofParams::default();
let tp = commit(&trace, &[], &[], &[], &stmt, ¶ms).unwrap();
assert!(verify(&tp, &stmt, ¶ms).is_ok());
}
#[test]
fn e2e_cons_roundtrip() {
let g = Goldilocks::new;
let mut ar = Reduction::<1024>::new();
let obj = ar.atom(g(5)).unwrap();
let t1 = ar.atom(g(1)).unwrap();
let seven = ar.atom(g(7)).unwrap();
let nine = ar.atom(g(9)).unwrap();
let qa = ar.pair(t1, seven).unwrap();
let qb = ar.pair(t1, nine).unwrap();
let body = ar.pair(qa, qb).unwrap();
let t3 = ar.atom(g(3)).unwrap();
let formula = ar.pair(t3, body).unwrap();
let mut trace = VecTrace::default();
nox::reduce(&mut ar, obj, formula, 1000, &NullCalls, &mut trace);
nox::reduce(&mut ar, obj, formula, 1000, &NullCalls, &mut trace);
assert!(
trace.0.iter().any(|r| r.r()[0] == 3),
"trace has a cons row"
);
let stmt = zero_statement();
let params = ProofParams::default();
let tp = commit(&trace, &[], &[], &[], &stmt, ¶ms).unwrap();
assert!(verify(&tp, &stmt, ¶ms).is_ok());
}