wallet.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use log::debug;
  2. use rand::rngs::OsRng;
  3. use halo2_proofs::circuit::Value;
  4. use pasta_curves::pallas;
  5. use darkfi::{
  6. crypto::{
  7. keypair::{PublicKey, SecretKey},
  8. Proof,
  9. },
  10. zk::vm::{Witness, ZkCircuit},
  11. };
  12. use crate::{
  13. contract::example_contract::{foo::validate::CallData, CONTRACT_ID},
  14. util::{FuncCall, ZkContractInfo, ZkContractTable},
  15. };
  16. pub struct Foo {
  17. pub a: u64,
  18. pub b: u64,
  19. }
  20. pub struct Builder {
  21. pub foo: Foo,
  22. pub signature_secret: SecretKey,
  23. }
  24. impl Builder {
  25. pub fn build(self, zk_bins: &ZkContractTable) -> FuncCall {
  26. debug!(target: "example_contract::foo::wallet::Builder", "build()");
  27. let mut proofs = vec![];
  28. let zk_info = zk_bins.lookup(&"example-foo".to_string()).unwrap();
  29. let zk_info = if let ZkContractInfo::Binary(info) = zk_info {
  30. info
  31. } else {
  32. panic!("Not binary info")
  33. };
  34. let zk_bin = zk_info.bincode.clone();
  35. let prover_witnesses = vec![
  36. Witness::Base(Value::known(pallas::Base::from(self.foo.a))),
  37. Witness::Base(Value::known(pallas::Base::from(self.foo.b))),
  38. ];
  39. let a = pallas::Base::from(self.foo.a);
  40. let b = pallas::Base::from(self.foo.b);
  41. let c = a + b;
  42. let public_inputs = vec![c];
  43. let circuit = ZkCircuit::new(prover_witnesses, zk_bin);
  44. debug!(target: "example_contract::foo::wallet::Builder", "input_proof Proof::create()");
  45. let proving_key = &zk_info.proving_key;
  46. let input_proof = Proof::create(proving_key, &[circuit], &public_inputs, &mut OsRng)
  47. .expect("Example::foo() proving error!)");
  48. proofs.push(input_proof);
  49. let signature_public = PublicKey::from_secret(self.signature_secret);
  50. let call_data = CallData { public_value: c, signature_public };
  51. FuncCall {
  52. contract_id: *CONTRACT_ID,
  53. func_id: *super::FUNC_ID,
  54. call_data: Box::new(call_data),
  55. proofs,
  56. }
  57. }
  58. }