proof.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use crate::base::Base;
  2. use crate::proving_key::ProvingKey;
  3. use crate::verifying_key::VerifyingKey;
  4. use crate::zk_circuit::ZkCircuit;
  5. use darkfi::zk::{proof, vm};
  6. use darkfi_sdk::crypto::pallas;
  7. use pyo3::prelude::*;
  8. use rand::rngs::OsRng;
  9. use std::ops::Deref;
  10. #[pyclass]
  11. pub struct Proof(pub(crate) proof::Proof);
  12. #[pymethods]
  13. impl Proof {
  14. #[staticmethod]
  15. fn create(
  16. pk: &PyCell<ProvingKey>,
  17. circuits: Vec<&PyCell<ZkCircuit>>,
  18. instances: Vec<&PyCell<Base>>,
  19. ) -> Self {
  20. let pk = pk.borrow().deref().0.clone();
  21. let circuits: Vec<vm::ZkCircuit> =
  22. circuits.iter().map(|c| c.borrow().deref().0.clone()).collect();
  23. let instances: Vec<pallas::Base> = instances.iter().map(|i| i.borrow().deref().0).collect();
  24. let proof =
  25. proof::Proof::create(&pk, circuits.as_slice(), instances.as_slice(), &mut OsRng);
  26. let proof = proof.unwrap();
  27. Self(proof)
  28. }
  29. fn verify(&self, vk: &PyCell<VerifyingKey>, instances: Vec<&PyCell<Base>>) {
  30. let vk = vk.borrow().deref().0.clone();
  31. let proof = self.0.clone();
  32. let instances: Vec<pallas::Base> = instances.iter().map(|i| i.borrow().deref().0).collect();
  33. proof.verify(&vk, instances.as_slice()).unwrap();
  34. }
  35. }
  36. pub fn create_module(py: pyo3::Python<'_>) -> pyo3::PyResult<&PyModule> {
  37. let submod = PyModule::new(py, "proof")?;
  38. submod.add_class::<Proof>()?;
  39. Ok(submod)
  40. }