zkvm.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #[macro_use]
  2. extern crate clap;
  3. use bls12_381::Scalar;
  4. use drk::{BlsStringConversion, Decodable, Encodable, ZKContract, ZKProof};
  5. use simplelog::*;
  6. use std::fs;
  7. use std::fs::File;
  8. use std::time::Instant;
  9. //use log::*;
  10. type Result<T> = std::result::Result<T, failure::Error>;
  11. // do the setup for mint.zcd, save the params in mint.setup
  12. fn trusted_setup(contract_data: String, setup_file: String) -> Result<()> {
  13. let start = Instant::now();
  14. let file = File::open(contract_data)?;
  15. let mut contract = ZKContract::decode(file)?;
  16. println!(
  17. "loaded contract '{}': [{:?}]",
  18. contract.name,
  19. start.elapsed()
  20. );
  21. println!("Stats:");
  22. println!(" Constants: {}", contract.vm.constants.len());
  23. println!(" Alloc: {}", contract.vm.alloc.len());
  24. println!(" Operations: {}", contract.vm.ops.len());
  25. println!(
  26. " Constraint Instructions: {}",
  27. contract.vm.constraints.len()
  28. );
  29. contract.setup(&setup_file)?;
  30. Ok(())
  31. }
  32. // make the proof
  33. fn create_proof(
  34. contract_data: String,
  35. setup_file: String,
  36. params: String,
  37. zk_proof: String,
  38. ) -> Result<()> {
  39. let start = Instant::now();
  40. let file = File::open(contract_data)?;
  41. let mut contract = ZKContract::decode(file)?;
  42. contract.load_setup(&setup_file)?;
  43. println!(
  44. "Loaded contract '{}': [{:?}]",
  45. contract.name,
  46. start.elapsed()
  47. );
  48. let param_content = fs::read_to_string(params).expect("something went wrong reading the file");
  49. let lines: Vec<&str> = param_content.lines().collect();
  50. for line in lines {
  51. let name = line.split_whitespace().next().unwrap_or("");
  52. let value = line.trim_start_matches(name).trim_start();
  53. contract.set_param(name, Scalar::from_string(value))?;
  54. println!("Set parameter: {}", name);
  55. println!(" Value: {}", value);
  56. }
  57. let proof = contract.prove()?;
  58. let mut file = File::create(zk_proof)?;
  59. proof.encode(&mut file)?;
  60. Ok(())
  61. }
  62. //verify the proof
  63. fn verify_proof(contract_data: String, setup_file: String, zk_proof: String) -> Result<()> {
  64. let contract_file = File::open(contract_data)?;
  65. let mut contract = ZKContract::decode(contract_file)?;
  66. contract.load_setup(&setup_file)?;
  67. let proof_file = File::open(zk_proof)?;
  68. let proof = ZKProof::decode(proof_file)?;
  69. if contract.verify(&proof) {
  70. println!("Zero-knowledge proof verified correctly.")
  71. } else {
  72. eprintln!("Verification failed.")
  73. }
  74. Ok(())
  75. }
  76. // show public values in proof
  77. fn show_public(zk_proof: String) -> Result<()> {
  78. let file = File::open(zk_proof)?;
  79. let proof = ZKProof::decode(file)?;
  80. //assert_eq!(proof.public.len(), 2);
  81. println!("Public values: {:?}", proof.public);
  82. Ok(())
  83. }
  84. fn main() -> Result<()> {
  85. let matches = clap_app!(zkvm =>
  86. (version: "0.1.0")
  87. (author: "Rose O'Leary <rrose@tuta.io>")
  88. (about: "Zero Knowledge Virtual Machine Command Line Interface")
  89. (@subcommand init =>
  90. (about: "Trusted setup phase")
  91. (@arg CONTRACT_DATA: +required "Input zero-knowledge contract data (.zcd)")
  92. (@arg SETUP_FILE: +required "Output setup parameters")
  93. )
  94. (@subcommand prove =>
  95. (about: "Create zero-knowledge proof")
  96. (@arg CONTRACT_DATA: +required "Input zero-knowledge contract data (.zcd)")
  97. (@arg SETUP_FILE: +required "Input setup parameters")
  98. (@arg PARAMS: +required "Input parameters json file")
  99. (@arg ZK_PROOF: +required "Output zero-knowledge proof")
  100. )
  101. (@subcommand verify =>
  102. (about: "Verify zero-knowledge proof")
  103. (@arg CONTRACT_DATA: +required "Input zero-knowledge contract data (.zcd)")
  104. (@arg SETUP_FILE: +required "Input setup parameters")
  105. (@arg ZK_PROOF: +required "Input zero-knowledge proof")
  106. )
  107. (@subcommand show =>
  108. (about: "Show public values in proof")
  109. (@arg ZK_PROOF: +required "Input zero-knowledge proof")
  110. )
  111. )
  112. .get_matches();
  113. CombinedLogger::init(vec![TermLogger::new(
  114. LevelFilter::Debug,
  115. Config::default(),
  116. TerminalMode::Mixed,
  117. )
  118. .unwrap()])
  119. .unwrap();
  120. match matches.subcommand() {
  121. Some(("init", matches)) => {
  122. let contract_data: String = matches.value_of("CONTRACT_DATA").unwrap().parse()?;
  123. let setup_file: String = matches.value_of("SETUP_FILE").unwrap().parse()?;
  124. trusted_setup(contract_data, setup_file)?;
  125. }
  126. Some(("prove", matches)) => {
  127. let contract_data: String = matches.value_of("CONTRACT_DATA").unwrap().parse()?;
  128. let setup_file: String = matches.value_of("SETUP_FILE").unwrap().parse()?;
  129. let params: String = matches.value_of("PARAMS").unwrap().parse()?;
  130. let zk_proof: String = matches.value_of("ZK_PROOF").unwrap().parse()?;
  131. create_proof(contract_data, setup_file, params, zk_proof)?;
  132. }
  133. Some(("verify", matches)) => {
  134. let contract_data: String = matches.value_of("CONTRACT_DATA").unwrap().parse()?;
  135. let setup_file: String = matches.value_of("SETUP_FILE").unwrap().parse()?;
  136. let zk_proof: String = matches.value_of("ZK_PROOF").unwrap().parse()?;
  137. verify_proof(contract_data, setup_file, zk_proof)?;
  138. }
  139. Some(("show", matches)) => {
  140. let zk_proof: String = matches.value_of("ZK_PROOF").unwrap().parse()?;
  141. show_public(zk_proof)?;
  142. }
  143. _ => {
  144. eprintln!("error: Invalid subcommand invoked");
  145. std::process::exit(-1);
  146. }
  147. }
  148. Ok(())
  149. }