1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
use crate::{U64, U128, U256, U512}; pub trait BigEndianHash { type Uint; fn from_uint(val: &Self::Uint) -> Self; fn into_uint(&self) -> Self::Uint; } construct_fixed_hash!{ pub struct H32(4); } impl_fixed_hash_rlp!(H32, 4); #[cfg(feature = "serialize")] impl_fixed_hash_serde!(H32, 4); construct_fixed_hash!{ pub struct H64(8); } impl_fixed_hash_rlp!(H64, 8); #[cfg(feature = "serialize")] impl_fixed_hash_serde!(H64, 8); construct_fixed_hash!{ pub struct H128(16); } impl_fixed_hash_rlp!(H128, 16); #[cfg(feature = "serialize")] impl_fixed_hash_serde!(H128, 16); pub use primitive_types::H160; pub use primitive_types::H256; construct_fixed_hash!{ pub struct H264(33); } impl_fixed_hash_rlp!(H264, 33); #[cfg(feature = "serialize")] impl_fixed_hash_serde!(H264, 33); pub use primitive_types::H512; construct_fixed_hash!{ pub struct H520(65); } impl_fixed_hash_rlp!(H520, 65); #[cfg(feature = "serialize")] impl_fixed_hash_serde!(H520, 65); macro_rules! impl_uint_conversions { ($hash: ident, $uint: ident) => { impl BigEndianHash for $hash { type Uint = $uint; fn from_uint(value: &$uint) -> Self { let mut ret = $hash::zero(); value.to_big_endian(ret.as_bytes_mut()); ret } fn into_uint(&self) -> $uint { $uint::from(self.as_ref() as &[u8]) } } } } impl_uint_conversions!(H64, U64); impl_uint_conversions!(H128, U128); impl_uint_conversions!(H256, U256); impl_uint_conversions!(H512, U512); #[cfg(test)] mod tests { use super::{H160, H256}; use serde_json as ser; #[test] fn test_serialize_h160() { let tests = vec![ (H160::from_low_u64_be(0), "0x0000000000000000000000000000000000000000"), (H160::from_low_u64_be(2), "0x0000000000000000000000000000000000000002"), (H160::from_low_u64_be(15), "0x000000000000000000000000000000000000000f"), (H160::from_low_u64_be(16), "0x0000000000000000000000000000000000000010"), (H160::from_low_u64_be(1_000), "0x00000000000000000000000000000000000003e8"), (H160::from_low_u64_be(100_000), "0x00000000000000000000000000000000000186a0"), (H160::from_low_u64_be(u64::max_value()), "0x000000000000000000000000ffffffffffffffff"), ]; for (number, expected) in tests { assert_eq!(format!("{:?}", expected), ser::to_string_pretty(&number).unwrap()); assert_eq!(number, ser::from_str(&format!("{:?}", expected)).unwrap()); } } #[test] fn test_serialize_h256() { let tests = vec![ (H256::from_low_u64_be(0), "0x0000000000000000000000000000000000000000000000000000000000000000"), (H256::from_low_u64_be(2), "0x0000000000000000000000000000000000000000000000000000000000000002"), (H256::from_low_u64_be(15), "0x000000000000000000000000000000000000000000000000000000000000000f"), (H256::from_low_u64_be(16), "0x0000000000000000000000000000000000000000000000000000000000000010"), (H256::from_low_u64_be(1_000), "0x00000000000000000000000000000000000000000000000000000000000003e8"), (H256::from_low_u64_be(100_000), "0x00000000000000000000000000000000000000000000000000000000000186a0"), (H256::from_low_u64_be(u64::max_value()), "0x000000000000000000000000000000000000000000000000ffffffffffffffff"), ]; for (number, expected) in tests { assert_eq!(format!("{:?}", expected), ser::to_string_pretty(&number).unwrap()); assert_eq!(number, ser::from_str(&format!("{:?}", expected)).unwrap()); } } #[test] fn test_serialize_invalid() { assert!(ser::from_str::<H256>("\"0x000000000000000000000000000000000000000000000000000000000000000\"").unwrap_err().is_data()); assert!(ser::from_str::<H256>("\"0x000000000000000000000000000000000000000000000000000000000000000g\"").unwrap_err().is_data()); assert!(ser::from_str::<H256>("\"0x00000000000000000000000000000000000000000000000000000000000000000\"").unwrap_err().is_data()); assert!(ser::from_str::<H256>("\"\"").unwrap_err().is_data()); assert!(ser::from_str::<H256>("\"0\"").unwrap_err().is_data()); assert!(ser::from_str::<H256>("\"10\"").unwrap_err().is_data()); } }