address.rs 1.4 KB

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