use std::io; use pasta_curves::{group::ff::PrimeField, pallas}; use crate::{ crypto::{keypair::SecretKey, util::poseidon_hash}, util::serial::{Decodable, Encodable, ReadExt, WriteExt}, Result, }; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Nullifier(pub pallas::Base); impl Nullifier { pub fn new(secret: SecretKey, serial: pallas::Base) -> Self { let nullifier = poseidon_hash::<2>([secret.0, serial]); Nullifier(nullifier) } pub fn from_bytes(bytes: [u8; 32]) -> Self { pallas::Base::from_repr(bytes).map(Nullifier).unwrap() } pub fn to_bytes(self) -> [u8; 32] { self.0.to_repr() } pub(crate) fn inner(&self) -> pallas::Base { self.0 } } impl Encodable for Nullifier { fn encode(&self, mut s: S) -> Result { s.write_slice(&self.to_bytes()[..])?; Ok(32) } } impl Decodable for Nullifier { fn decode(mut d: D) -> Result { let mut bytes = [0u8; 32]; d.read_slice(&mut bytes)?; let result = Self::from_bytes(bytes); Ok(result) } }