diff --git a/src/types/address.rs b/src/types/address.rs index df3a94e49a7d4303adf09e298e57b1844892ba4f..c0dd032b9dde3ffa57fb4b8884574781665f9f1d 100644 --- a/src/types/address.rs +++ b/src/types/address.rs @@ -1,11 +1,5 @@ -extern crate data_encoding; -extern crate ring; use serde::{Serialize, Deserialize}; - -use ring::digest::{Context, SHA256}; - -use data_encoding::HEXLOWER; - +use ring::digest; // 20-byte address #[derive(Eq, PartialEq, Serialize, Deserialize, Clone, Hash, Default, Copy)] @@ -55,13 +49,17 @@ impl std::fmt::Debug for Address { impl Address { pub fn from_public_key_bytes(bytes: &[u8]) -> Address { - let mut context = Context::new(&SHA256); - context.update(&bytes[..]); - let result = context.finish(); - let mut a:[u8; 20] = [0u8;20]; - a.copy_from_slice(&(result.as_ref()[12..32])); - Address(a) - //unimplemented!() + let digest_result = digest::digest(&digest::SHA256, bytes); + let public_key_hash = digest_result.as_ref(); + // let result = &public_key_hash[public_key_hash.len()-20..]; + let mut result = [0u8;20]; + let mut i = 0; + let prefix = public_key_hash.len() - 20; + while i<20{ + result[i] = public_key_hash[prefix + i]; + i+=1; + } + Address::from(result) } } // DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. BEFORE TEST @@ -75,8 +73,6 @@ mod test { let test_key = hex!("0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d"); let addr = Address::from_public_key_bytes(&test_key); let correct_addr: Address = hex!("1851a0eae0060a132cf0f64a0ffaea248de6cba0").into(); - println!("addr:{}",addr); - println!("correct_addr:{}",correct_addr); assert_eq!(addr, correct_addr); // "b69566be6e1720872f73651d1851a0eae0060a132cf0f64a0ffaea248de6cba0" is the hash of // "0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d0a0b0c0d0e0f0e0d"