leadcoin.rs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use pasta_curves::pallas;
  2. use crate::crypto::{
  3. constants::MERKLE_DEPTH_ORCHARD,
  4. merkle_node::MerkleNode,
  5. util::{mod_r_p, pedersen_commitment_scalar},
  6. };
  7. use incrementalmerkletree::Hashable;
  8. use pasta_curves::{arithmetic::CurveAffine, group::Curve};
  9. //use halo2_proofs::arithmetic::CurveAffine;
  10. #[derive(Debug, Default, Clone, Copy)]
  11. pub struct LeadCoin {
  12. pub value: Option<pallas::Base>, //stake
  13. pub cm: Option<pallas::Point>,
  14. pub cm2: Option<pallas::Point>,
  15. pub idx: u32,
  16. pub sl: Option<pallas::Base>, //slot id
  17. pub tau: Option<pallas::Base>,
  18. pub nonce: Option<pallas::Base>,
  19. pub nonce_cm: Option<pallas::Point>,
  20. pub sn: Option<pallas::Point>, // coin's serial number
  21. //sk : Option<SecretKey>,
  22. pub pk: Option<pallas::Point>,
  23. pub pk_x: Option<pallas::Base>,
  24. pub pk_y: Option<pallas::Base>,
  25. pub root_cm: Option<pallas::Scalar>,
  26. pub root_sk: Option<pallas::Base>,
  27. pub path: Option<[MerkleNode; MERKLE_DEPTH_ORCHARD]>,
  28. pub path_sk: Option<[MerkleNode; MERKLE_DEPTH_ORCHARD]>,
  29. pub opening1: Option<pallas::Base>,
  30. pub opening2: Option<pallas::Base>,
  31. }
  32. impl LeadCoin {
  33. pub fn public_inputs(&self) -> Vec<pallas::Base> {
  34. let po_nonce = self.nonce_cm.unwrap().to_affine().coordinates().unwrap();
  35. let _po_tau = pedersen_commitment_scalar(mod_r_p(self.tau.unwrap()), self.root_cm.unwrap())
  36. .to_affine()
  37. .coordinates()
  38. .unwrap();
  39. let po_cm = self.cm.unwrap().to_affine().coordinates().unwrap();
  40. let po_cm2 = self.cm2.unwrap().to_affine().coordinates().unwrap();
  41. let po_pk = self.pk.unwrap().to_affine().coordinates().unwrap();
  42. let po_sn = self.sn.unwrap().to_affine().coordinates().unwrap();
  43. let po_cmp = pallas::Base::from(0);
  44. let _zero = pallas::Base::from(0);
  45. // ===============
  46. let cm_pos = self.idx;
  47. let cm_root = {
  48. let pos: u32 = cm_pos;
  49. let c_cm_coordinates = self.cm.unwrap().to_affine().coordinates().unwrap();
  50. let c_cm_base: pallas::Base = c_cm_coordinates.x() * c_cm_coordinates.y();
  51. let mut current = MerkleNode(c_cm_base);
  52. for (level, sibling) in self.path.unwrap().iter().enumerate() {
  53. let level = level as u8;
  54. current = if pos & (1 << level) == 0 {
  55. MerkleNode::combine(level.into(), &current, sibling)
  56. } else {
  57. MerkleNode::combine(level.into(), sibling, &current)
  58. };
  59. }
  60. current
  61. };
  62. let public_inputs: Vec<pallas::Base> = vec![
  63. *po_nonce.x(),
  64. *po_nonce.y(),
  65. *po_pk.x(),
  66. *po_pk.y(),
  67. *po_sn.x(),
  68. *po_sn.y(),
  69. *po_cm.x(),
  70. *po_cm.y(),
  71. *po_cm2.x(),
  72. *po_cm2.y(),
  73. cm_root.0,
  74. po_cmp,
  75. ];
  76. public_inputs
  77. }
  78. }