address.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. use group::GroupEncoding;
  2. use sha2::Digest;
  3. use crate::types::*;
  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. let mut payload = vec![];
  28. // add version
  29. payload.push(0x00 as u8);
  30. // add public key hash
  31. payload.append(&mut hash);
  32. // hash the payload + version
  33. let mut hasher = sha2::Sha256::new();
  34. hasher.update(payload.clone());
  35. let payload_hash = hasher.finalize().to_vec();
  36. payload.append(&mut payload_hash[0..4].to_vec());
  37. // base56 encoding
  38. let address: String = bs58::encode(payload).into_string();
  39. address
  40. }
  41. }
  42. impl std::fmt::Display for Address {
  43. fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
  44. write!(f, "{}", self.pkh)
  45. }
  46. }