use zkp_macros_decl::field_element; use zkp_primefield::FieldElement; use zkp_stark::{ generate, proof_serialize, prove, Constraints, Provable, RationalExpression, TraceTable, Verifiable, }; use zkp_u256::U256; #[derive(Clone, Debug)] struct Claim(FieldElement); #[derive(Clone, Debug)] struct Witness(FieldElement); impl Verifiable for Claim { fn constraints(&self) -> Constraints { use RationalExpression::*; Constraints::from_expressions((2, 1), self.0.as_montgomery().to_bytes_be().to_vec(), vec![ (Trace(0, 0) - Constant(self.0.clone())) / (X - 1), ]) .unwrap() } } impl Provable<&Witness> for Claim { fn trace(&self, witness: &Witness) -> TraceTable { let mut trace = TraceTable::new(2, 1); trace[(0, 0)] = witness.0.clone(); trace[(1, 0)] = witness.0.clone() + FieldElement::from(100); trace } } fn main() { let claim = Claim(field_element!("1325123410")); let witness = Witness(claim.0.clone()); let mut constraints = claim.constraints(); constraints.num_queries = 2; constraints.pow_bits = 10; let trace = claim.trace(&witness); println!("claim: 0x{}", claim.0.as_montgomery()); let mut proof_string = "".to_string(); proof_serialize( &constraints, &prove(&constraints, &trace).unwrap(), &mut proof_string, ) .unwrap(); println!("{}", proof_string); let system = claim.constraints(); let _ = generate( &system, "../stark-verifier-ethereum/contracts/constant", "Constant", ); }