address.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. use crate::types::*;
  2. use group::GroupEncoding;
  3. use sha2::Digest;
  4. #[derive(Clone, Debug)]
  5. pub struct Address {
  6. pub raw: DrkPublicKey,
  7. pub pkh: String,
  8. }
  9. impl Address {
  10. pub fn new(raw: DrkPublicKey) -> Self {
  11. let pkh = Self::pkh_address(&raw);
  12. Address { raw, pkh }
  13. }
  14. fn get_hash(raw: &DrkPublicKey) -> Vec<u8> {
  15. // sha256
  16. let mut hasher = sha2::Sha256::new();
  17. hasher.update(raw.to_bytes());
  18. let hash = hasher.finalize();
  19. // ripemd160
  20. let mut hasher = ripemd160::Ripemd160::new();
  21. hasher.update(hash.to_vec());
  22. let hash = hasher.finalize();
  23. hash.to_vec()
  24. }
  25. pub fn pkh_address(raw: &DrkPublicKey) -> String {
  26. let mut hash = Self::get_hash(raw);
  27. // add version
  28. let mut payload = vec![0x00_u8];
  29. // add public key hash
  30. payload.append(&mut hash);
  31. // hash the payload + version
  32. let mut hasher = sha2::Sha256::new();
  33. hasher.update(payload.clone());
  34. let payload_hash = hasher.finalize().to_vec();
  35. payload.append(&mut payload_hash[0..4].to_vec());
  36. // base56 encoding
  37. let address: String = bs58::encode(payload).into_string();
  38. address
  39. }
  40. }
  41. impl std::fmt::Display for Address {
  42. fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
  43. write!(f, "{}", self.pkh)
  44. }
  45. }