wallet.rs 3.2 KB

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