use pasta_curves::pallas; use crate::crypto::{ constants::MERKLE_DEPTH_ORCHARD, merkle_node::MerkleNode, util::{mod_r_p, pedersen_commitment_scalar}, }; use incrementalmerkletree::Hashable; use pasta_curves::{arithmetic::CurveAffine, group::Curve}; //use halo2_proofs::arithmetic::CurveAffine; #[derive(Debug, Default, Clone, Copy)] pub struct LeadCoin { pub value: Option, //stake pub cm: Option, pub cm2: Option, pub idx: u32, pub sl: Option, //slot id pub tau: Option, pub nonce: Option, pub nonce_cm: Option, pub sn: Option, // coin's serial number //sk : Option, pub pk: Option, pub pk_x: Option, pub pk_y: Option, pub root_cm: Option, pub root_sk: Option, pub path: Option<[MerkleNode; MERKLE_DEPTH_ORCHARD]>, pub path_sk: Option<[MerkleNode; MERKLE_DEPTH_ORCHARD]>, pub c1_blind: Option, pub c2_blind: Option, // election seeds pub y_mu: Option, pub rho_mu: Option, } impl LeadCoin { pub fn public_inputs(&self) -> Vec { let po_nonce = self.nonce_cm.unwrap().to_affine().coordinates().unwrap(); let _po_tau = pedersen_commitment_scalar(mod_r_p(self.tau.unwrap()), self.root_cm.unwrap()) .to_affine() .coordinates() .unwrap(); let po_cm = self.cm.unwrap().to_affine().coordinates().unwrap(); let po_cm2 = self.cm2.unwrap().to_affine().coordinates().unwrap(); let po_pk = self.pk.unwrap().to_affine().coordinates().unwrap(); let po_sn = self.sn.unwrap().to_affine().coordinates().unwrap(); let po_cmp = pallas::Base::from(0); let _zero = pallas::Base::from(0); // =============== let cm_pos = self.idx; let cm_root = { let pos: u32 = cm_pos; let c_cm_coordinates = self.cm.unwrap().to_affine().coordinates().unwrap(); let c_cm_base: pallas::Base = c_cm_coordinates.x() * c_cm_coordinates.y(); let mut current = MerkleNode(c_cm_base); for (level, sibling) in self.path.unwrap().iter().enumerate() { let level = level as u8; current = if pos & (1 << level) == 0 { MerkleNode::combine(level.into(), ¤t, sibling) } else { MerkleNode::combine(level.into(), sibling, ¤t) }; } current }; let public_inputs: Vec = vec![ *po_nonce.x(), *po_nonce.y(), *po_pk.x(), *po_pk.y(), *po_sn.x(), *po_sn.y(), *po_cm.x(), *po_cm.y(), //*po_cm2.x(), //*po_cm2.y(), //cm_root.0, //po_cmp, ]; public_inputs } }