leadcoin.rs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 c1_blind: Option<pallas::Scalar>,
  30. pub c2_blind: Option<pallas::Scalar>,
  31. // election seeds
  32. pub y_mu: Option<pallas::Base>,
  33. pub rho_mu: Option<pallas::Base>,
  34. }
  35. impl LeadCoin {
  36. pub fn public_inputs(&self) -> Vec<pallas::Base> {
  37. let po_nonce = self.nonce_cm.unwrap().to_affine().coordinates().unwrap();
  38. let _po_tau = pedersen_commitment_scalar(mod_r_p(self.tau.unwrap()), self.root_cm.unwrap())
  39. .to_affine()
  40. .coordinates()
  41. .unwrap();
  42. let po_cm = self.cm.unwrap().to_affine().coordinates().unwrap();
  43. let po_cm2 = self.cm2.unwrap().to_affine().coordinates().unwrap();
  44. let po_pk = self.pk.unwrap().to_affine().coordinates().unwrap();
  45. let po_sn = self.sn.unwrap().to_affine().coordinates().unwrap();
  46. let po_cmp = pallas::Base::from(0);
  47. let _zero = pallas::Base::from(0);
  48. // ===============
  49. let cm_pos = self.idx;
  50. let cm_root = {
  51. let pos: u32 = cm_pos;
  52. let c_cm_coordinates = self.cm.unwrap().to_affine().coordinates().unwrap();
  53. let c_cm_base: pallas::Base = c_cm_coordinates.x() * c_cm_coordinates.y();
  54. let mut current = MerkleNode(c_cm_base);
  55. for (level, sibling) in self.path.unwrap().iter().enumerate() {
  56. let level = level as u8;
  57. current = if pos & (1 << level) == 0 {
  58. MerkleNode::combine(level.into(), &current, sibling)
  59. } else {
  60. MerkleNode::combine(level.into(), sibling, &current)
  61. };
  62. }
  63. current
  64. };
  65. let public_inputs: Vec<pallas::Base> = vec![
  66. *po_nonce.x(),
  67. *po_nonce.y(),
  68. *po_pk.x(),
  69. *po_pk.y(),
  70. *po_sn.x(),
  71. *po_sn.y(),
  72. *po_cm.x(),
  73. *po_cm.y(),
  74. //*po_cm2.x(),
  75. //*po_cm2.y(),
  76. //cm_root.0,
  77. //po_cmp,
  78. ];
  79. public_inputs
  80. }
  81. }