wallet.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. use darkfi::{
  2. crypto::{
  3. keypair::{PublicKey, SecretKey},
  4. util::poseidon_hash,
  5. Proof,
  6. },
  7. zk::vm::{Witness, ZkCircuit},
  8. };
  9. use halo2_proofs::circuit::Value;
  10. use pasta_curves::{arithmetic::CurveAffine, group::Curve, pallas};
  11. use rand::rngs::OsRng;
  12. use crate::{
  13. contract::dao_contract::{mint::validate::CallData, state::DaoBulla, CONTRACT_ID},
  14. util::{FuncCall, ZkContractInfo, ZkContractTable},
  15. };
  16. #[derive(Clone)]
  17. pub struct DaoParams {
  18. pub proposer_limit: u64,
  19. pub quorum: u64,
  20. pub approval_ratio_quot: u64,
  21. pub approval_ratio_base: u64,
  22. pub gov_token_id: pallas::Base,
  23. pub public_key: PublicKey,
  24. pub bulla_blind: pallas::Base,
  25. }
  26. pub struct Builder {
  27. pub dao_proposer_limit: u64,
  28. pub dao_quorum: u64,
  29. pub dao_approval_ratio_quot: u64,
  30. pub dao_approval_ratio_base: u64,
  31. pub gov_token_id: pallas::Base,
  32. pub dao_pubkey: PublicKey,
  33. pub dao_bulla_blind: pallas::Base,
  34. pub _signature_secret: SecretKey,
  35. }
  36. impl Builder {
  37. /// Consumes self, and produces the function call
  38. pub fn build(self, zk_bins: &ZkContractTable) -> FuncCall {
  39. // Dao bulla
  40. let dao_proposer_limit = pallas::Base::from(self.dao_proposer_limit);
  41. let dao_quorum = pallas::Base::from(self.dao_quorum);
  42. let dao_approval_ratio_quot = pallas::Base::from(self.dao_approval_ratio_quot);
  43. let dao_approval_ratio_base = pallas::Base::from(self.dao_approval_ratio_base);
  44. let dao_pubkey_coords = self.dao_pubkey.0.to_affine().coordinates().unwrap();
  45. let dao_bulla = poseidon_hash::<8>([
  46. dao_proposer_limit,
  47. dao_quorum,
  48. dao_approval_ratio_quot,
  49. dao_approval_ratio_base,
  50. self.gov_token_id,
  51. *dao_pubkey_coords.x(),
  52. *dao_pubkey_coords.y(),
  53. self.dao_bulla_blind,
  54. ]);
  55. let dao_bulla = DaoBulla(dao_bulla);
  56. // Now create the mint proof
  57. let zk_info = zk_bins.lookup(&"dao-mint".to_string()).unwrap();
  58. let zk_info = if let ZkContractInfo::Binary(info) = zk_info {
  59. info
  60. } else {
  61. panic!("Not binary info")
  62. };
  63. let zk_bin = zk_info.bincode.clone();
  64. let prover_witnesses = vec![
  65. Witness::Base(Value::known(dao_proposer_limit)),
  66. Witness::Base(Value::known(dao_quorum)),
  67. Witness::Base(Value::known(dao_approval_ratio_quot)),
  68. Witness::Base(Value::known(dao_approval_ratio_base)),
  69. Witness::Base(Value::known(self.gov_token_id)),
  70. Witness::Base(Value::known(*dao_pubkey_coords.x())),
  71. Witness::Base(Value::known(*dao_pubkey_coords.y())),
  72. Witness::Base(Value::known(self.dao_bulla_blind)),
  73. ];
  74. let public_inputs = vec![dao_bulla.0];
  75. let circuit = ZkCircuit::new(prover_witnesses, zk_bin);
  76. let proving_key = &zk_info.proving_key;
  77. let mint_proof = Proof::create(proving_key, &[circuit], &public_inputs, &mut OsRng)
  78. .expect("DAO::mint() proving error!");
  79. let call_data = CallData { dao_bulla };
  80. FuncCall {
  81. contract_id: *CONTRACT_ID,
  82. func_id: *super::FUNC_ID,
  83. call_data: Box::new(call_data),
  84. proofs: vec![mint_proof],
  85. }
  86. }
  87. }