| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- use bls12_381::Scalar;
- use drk::{BlsStringConversion, Decodable, Encodable, ZkContract, ZkProof};
- use std::fs::File;
- use std::time::Instant;
- type Result<T> = std::result::Result<T, failure::Error>;
- fn main() -> Result<()> {
- {
- // Load the contract from file
- let start = Instant::now();
- let file = File::open("jubjub.zcd")?;
- let mut contract = ZkContract::decode(file)?;
- println!(
- "Loaded contract '{}': [{:?}]",
- contract.name,
- start.elapsed()
- );
- println!("Stats:");
- println!(" Constants: {}", contract.vm.constants.len());
- println!(" Alloc: {}", contract.vm.alloc.len());
- println!(" Operations: {}", contract.vm.ops.len());
- println!(
- " Constraint Instructions: {}",
- contract.vm.constraints.len()
- );
- // Do the trusted setup
- contract.setup("jubjub.zts")?;
- }
- // Load the contract from file
- let start = Instant::now();
- let file = File::open("jubjub.zcd")?;
- let mut contract = ZkContract::decode(file)?;
- println!(
- "Loaded contract '{}': [{:?}]",
- contract.name,
- start.elapsed()
- );
- contract.load_setup("jubjub.zts")?;
- {
- // Put in our input parameters
- contract.set_param(
- "a_u",
- Scalar::from_string("15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e"),
- )?;
- contract.set_param(
- "a_v",
- Scalar::from_string("015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891"),
- )?;
- contract.set_param(
- "b_u",
- Scalar::from_string("15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e"),
- )?;
- contract.set_param(
- "b_v",
- Scalar::from_string("015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891"),
- )?;
- // Generate the ZK proof
- let proof = contract.prove()?;
- // Test and show our output values
- assert_eq!(proof.public.len(), 2);
- // 0x66ced46f14e5616d12b993f60a6e66558d6b6afe4c321ed212e0b9cfbd81061a
- assert_eq!(
- *proof.public.get("result_u").unwrap(),
- Scalar::from_string("66ced46f14e5616d12b993f60a6e66558d6b6afe4c321ed212e0b9cfbd81061a")
- );
- // 0x4731570fdd57cf280eadc8946fa00df81112502e44e497e794ab9a221f1bcca
- assert_eq!(
- *proof.public.get("result_v").unwrap(),
- Scalar::from_string("04731570fdd57cf280eadc8946fa00df81112502e44e497e794ab9a221f1bcca")
- );
- println!("u = {:?}", proof.public.get("result_u").unwrap());
- println!("v = {:?}", proof.public.get("result_v").unwrap());
- let mut file = File::create("jubjub.prf")?;
- proof.encode(&mut file)?;
- }
- // Verify the proof
- let file = File::open("jubjub.prf")?;
- let proof = ZkProof::decode(file)?;
- assert!(contract.verify(&proof));
- Ok(())
- }
|