vm.rs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. use std::time::Instant;
  2. #[allow(unused_imports)]
  3. use halo2::{
  4. arithmetic::{CurveAffine, Field},
  5. dev::MockProver,
  6. };
  7. use halo2_gadgets::primitives::{
  8. poseidon,
  9. poseidon::{ConstantLength, P128Pow5T3},
  10. };
  11. use incrementalmerkletree::{bridgetree::BridgeTree, Frontier, Tree};
  12. use log::info;
  13. use pasta_curves::{group::Curve, pallas};
  14. use rand::rngs::OsRng;
  15. use simplelog::{ColorChoice, LevelFilter, TermLogger, TerminalMode};
  16. use darkfi::{
  17. crypto::{
  18. keypair::{PublicKey, SecretKey},
  19. merkle_node::MerkleNode,
  20. mint_proof::MintRevealedValues,
  21. proof::{ProvingKey, VerifyingKey},
  22. spend_proof::SpendRevealedValues,
  23. Proof,
  24. },
  25. zk::vm::{Witness, ZkCircuit},
  26. zkas::decoder::ZkBinary,
  27. Result,
  28. };
  29. fn mint_proof() -> Result<()> {
  30. let bincode = include_bytes!("../proof/mint.zk.bin");
  31. let zkbin = ZkBinary::decode(bincode)?;
  32. // ======
  33. // Prover
  34. // ======
  35. let value = 42;
  36. let token_id = pallas::Base::from(22);
  37. let value_blind = pallas::Scalar::random(&mut OsRng);
  38. let token_blind = pallas::Scalar::random(&mut OsRng);
  39. let serial = pallas::Base::random(&mut OsRng);
  40. let coin_blind = pallas::Base::random(&mut OsRng);
  41. let public_key = PublicKey::random(&mut OsRng);
  42. let pk_coords = public_key.0.to_affine().coordinates().unwrap();
  43. let witnesses_prover = vec![
  44. Witness::Base(Some(*pk_coords.x())),
  45. Witness::Base(Some(*pk_coords.y())),
  46. Witness::Base(Some(pallas::Base::from(value))),
  47. Witness::Base(Some(token_id)),
  48. Witness::Base(Some(serial)),
  49. Witness::Base(Some(coin_blind)),
  50. Witness::Scalar(Some(value_blind)),
  51. Witness::Scalar(Some(token_blind)),
  52. ];
  53. let public_inputs = MintRevealedValues::compute(
  54. value,
  55. token_id,
  56. value_blind,
  57. token_blind,
  58. serial,
  59. coin_blind,
  60. public_key,
  61. )
  62. .make_outputs()
  63. .to_vec();
  64. let circuit = ZkCircuit::new(witnesses_prover, zkbin.clone());
  65. // let prover = MockProver::run(11, &circuit, vec![public_inputs.clone()]).unwrap();
  66. // assert_eq!(prover.verify(), Ok(()));
  67. let start = Instant::now();
  68. let proving_key = ProvingKey::build(11, circuit.clone());
  69. info!("Prover setup: [{:?}]", Instant::now() - start);
  70. let start = Instant::now();
  71. let proof = Proof::create(&proving_key, &[circuit], &public_inputs.clone())?;
  72. info!("Prover prove: [{:?}]", Instant::now() - start);
  73. // =======
  74. // Verifier
  75. // =======
  76. let witnesses_verifier = vec![
  77. Witness::Base(None),
  78. Witness::Base(None),
  79. Witness::Base(None),
  80. Witness::Base(None),
  81. Witness::Base(None),
  82. Witness::Base(None),
  83. Witness::Scalar(None),
  84. Witness::Scalar(None),
  85. ];
  86. let start = Instant::now();
  87. let circuit = ZkCircuit::new(witnesses_verifier, zkbin);
  88. let verifying_key = VerifyingKey::build(11, circuit);
  89. info!("Verifier setup: [{:?}]", Instant::now() - start);
  90. let start = Instant::now();
  91. proof.verify(&verifying_key, &public_inputs)?;
  92. info!("Verifier verify: [{:?}]", Instant::now() - start);
  93. Ok(())
  94. }
  95. fn fill_tree(coin2: pallas::Base) -> BridgeTree<MerkleNode, 32> {
  96. let mut tree = BridgeTree::<MerkleNode, 32>::new(100);
  97. let coin0 = pallas::Base::random(&mut OsRng);
  98. let coin1 = pallas::Base::random(&mut OsRng);
  99. let coin3 = pallas::Base::random(&mut OsRng);
  100. tree.append(&MerkleNode(coin0));
  101. tree.witness();
  102. tree.append(&MerkleNode(coin1));
  103. tree.append(&MerkleNode(coin2));
  104. tree.witness();
  105. tree.append(&MerkleNode(coin3));
  106. tree.witness();
  107. tree
  108. }
  109. fn burn_proof() -> Result<()> {
  110. let bincode = include_bytes!("../proof/burn.zk.bin");
  111. let zkbin = ZkBinary::decode(bincode)?;
  112. // ======
  113. // Prover
  114. // ======
  115. let value = 42;
  116. let token_id = pallas::Base::from(22);
  117. let value_blind = pallas::Scalar::random(&mut OsRng);
  118. let token_blind = pallas::Scalar::random(&mut OsRng);
  119. let serial = pallas::Base::random(&mut OsRng);
  120. let coin_blind = pallas::Base::random(&mut OsRng);
  121. let secret = SecretKey::random(&mut OsRng);
  122. let sig_secret = SecretKey::random(&mut OsRng);
  123. let coin = {
  124. let coords = PublicKey::from_secret(secret).0.to_affine().coordinates().unwrap();
  125. let messages =
  126. [*coords.x(), *coords.y(), pallas::Base::from(value), token_id, serial, coin_blind];
  127. poseidon::Hash::init(P128Pow5T3, ConstantLength::<6>).hash(messages)
  128. };
  129. let tree = fill_tree(coin);
  130. let (leaf_position, merkle_path) = tree.authentication_path(&MerkleNode(coin)).unwrap();
  131. // Why are these types not matched in halo2 gadgets?
  132. let leaf_pos: u64 = leaf_position.into();
  133. let leaf_pos = leaf_pos as u32;
  134. let witnesses_prover = vec![
  135. Witness::Base(Some(secret.0)),
  136. Witness::Base(Some(serial)),
  137. Witness::Base(Some(pallas::Base::from(value))),
  138. Witness::Base(Some(token_id)),
  139. Witness::Base(Some(coin_blind)),
  140. Witness::Scalar(Some(value_blind)),
  141. Witness::Scalar(Some(token_blind)),
  142. Witness::Uint32(Some(leaf_pos)),
  143. Witness::MerklePath(Some(merkle_path.clone().try_into().unwrap())),
  144. Witness::Base(Some(sig_secret.0)),
  145. ];
  146. let public_inputs = SpendRevealedValues::compute(
  147. value,
  148. token_id,
  149. value_blind,
  150. token_blind,
  151. serial,
  152. coin_blind,
  153. secret,
  154. leaf_position,
  155. merkle_path,
  156. sig_secret,
  157. )
  158. .make_outputs()
  159. .to_vec();
  160. let circuit = ZkCircuit::new(witnesses_prover, zkbin.clone());
  161. // let prover = MockProver::run(11, &circuit, vec![public_inputs.clone()])?;
  162. // assert_eq!(prover.verify(), Ok(()));
  163. let start = Instant::now();
  164. let proving_key = ProvingKey::build(11, circuit.clone());
  165. info!("Prover setup: [{:?}]", Instant::now() - start);
  166. let start = Instant::now();
  167. let proof = Proof::create(&proving_key, &[circuit], &public_inputs)?;
  168. info!("Prover prove: [{:?}]", Instant::now() - start);
  169. // ========
  170. // Verifier
  171. // ========
  172. let witnesses_verifier = vec![
  173. Witness::Base(None),
  174. Witness::Base(None),
  175. Witness::Base(None),
  176. Witness::Base(None),
  177. Witness::Base(None),
  178. Witness::Scalar(None),
  179. Witness::Scalar(None),
  180. Witness::Uint32(None),
  181. Witness::MerklePath(None),
  182. Witness::Base(None),
  183. ];
  184. let start = Instant::now();
  185. let circuit = ZkCircuit::new(witnesses_verifier, zkbin);
  186. let verifying_key = VerifyingKey::build(11, circuit);
  187. info!("Verifier setup: [{:?}]", Instant::now() - start);
  188. let start = Instant::now();
  189. proof.verify(&verifying_key, &public_inputs)?;
  190. info!("Verifier verify: [{:?}]", Instant::now() - start);
  191. Ok(())
  192. }
  193. fn main() -> Result<()> {
  194. TermLogger::init(
  195. LevelFilter::Debug,
  196. //LevelFilter::Info,
  197. simplelog::Config::default(),
  198. TerminalMode::Mixed,
  199. ColorChoice::Auto,
  200. )?;
  201. info!("Executing Mint proof");
  202. mint_proof()?;
  203. info!("Executing Burn proof");
  204. burn_proof()?;
  205. Ok(())
  206. }