wallet.rs 3.1 KB

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