nullifier.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. use std::io;
  2. use halo2_gadgets::primitives::{
  3. poseidon,
  4. poseidon::{ConstantLength, P128Pow5T3},
  5. };
  6. use pasta_curves::{group::ff::PrimeField, pallas};
  7. use crate::{
  8. crypto::keypair::SecretKey,
  9. util::serial::{Decodable, Encodable, ReadExt, WriteExt},
  10. Result,
  11. };
  12. #[derive(Clone, Copy, Debug, PartialEq)]
  13. pub struct Nullifier(pub(crate) pallas::Base);
  14. impl Nullifier {
  15. pub fn new(secret: SecretKey, serial: pallas::Base) -> Self {
  16. let nullifier = [secret.0, serial];
  17. let nullifier =
  18. poseidon::Hash::<_, P128Pow5T3, ConstantLength<2>, 3, 2>::init().hash(nullifier);
  19. Nullifier(nullifier)
  20. }
  21. pub fn from_bytes(bytes: [u8; 32]) -> Self {
  22. pallas::Base::from_repr(bytes).map(Nullifier).unwrap()
  23. }
  24. pub fn to_bytes(self) -> [u8; 32] {
  25. self.0.to_repr()
  26. }
  27. pub(crate) fn inner(&self) -> pallas::Base {
  28. self.0
  29. }
  30. }
  31. impl Encodable for Nullifier {
  32. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  33. s.write_slice(&self.to_bytes()[..])?;
  34. Ok(32)
  35. }
  36. }
  37. impl Decodable for Nullifier {
  38. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  39. let mut bytes = [0u8; 32];
  40. d.read_slice(&mut bytes)?;
  41. let result = Self::from_bytes(bytes);
  42. Ok(result)
  43. }
  44. }