wallet.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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::Proof,
  7. zk::vm::{Witness, ZkCircuit},
  8. };
  9. use crate::{
  10. demo::{FuncCall, ZkContractInfo, ZkContractTable},
  11. example_contract::foo::validate::{CallData, Header},
  12. };
  13. pub struct Foo {
  14. pub a: u64,
  15. pub b: u64,
  16. }
  17. pub struct Builder {
  18. pub foo: Foo,
  19. }
  20. impl Builder {
  21. pub fn build(self, zk_bins: &ZkContractTable) -> FuncCall {
  22. debug!(target: "example_contract::foo::wallet::Builder", "build()");
  23. let mut proofs = vec![];
  24. let zk_info = zk_bins.lookup(&"example-foo".to_string()).unwrap();
  25. let zk_info = if let ZkContractInfo::Binary(info) = zk_info {
  26. info
  27. } else {
  28. panic!("Not binary info")
  29. };
  30. let zk_bin = zk_info.bincode.clone();
  31. let prover_witnesses = vec![
  32. Witness::Base(Value::known(pallas::Base::from(self.foo.a))),
  33. Witness::Base(Value::known(pallas::Base::from(self.foo.b))),
  34. ];
  35. let a = pallas::Base::from(self.foo.a);
  36. let b = pallas::Base::from(self.foo.b);
  37. let c = a + b;
  38. let public_inputs = vec![c];
  39. let circuit = ZkCircuit::new(prover_witnesses, zk_bin);
  40. debug!(target: "example_contract::foo::wallet::Builder", "input_proof Proof::create()");
  41. let proving_key = &zk_info.proving_key;
  42. let input_proof = Proof::create(proving_key, &[circuit], &public_inputs, &mut OsRng)
  43. .expect("Example::foo() proving error!)");
  44. proofs.push(input_proof);
  45. let call_data = CallData { public_value: c };
  46. FuncCall {
  47. contract_id: "Example".to_string(),
  48. func_id: "Example::foo()".to_string(),
  49. call_data: Box::new(call_data),
  50. proofs,
  51. }
  52. }
  53. }