parity-zcash/chain/src/block_header.rs

100 lines
2.3 KiB
Rust
Raw Normal View History

2017-07-21 17:53:02 -07:00
use std::fmt;
2016-11-29 02:48:14 -08:00
use hex::FromHex;
2017-07-21 17:53:02 -07:00
use ser::{deserialize, serialize};
use crypto::dhash256;
use compact::Compact;
2016-09-19 05:37:53 -07:00
use hash::H256;
2016-08-15 05:50:20 -07:00
2017-07-21 17:53:02 -07:00
#[derive(PartialEq, Clone, Serializable, Deserializable)]
2016-08-15 05:50:20 -07:00
pub struct BlockHeader {
pub version: u32,
pub previous_header_hash: H256,
pub merkle_root_hash: H256,
pub time: u32,
pub bits: Compact,
pub nonce: u32,
2016-08-15 05:50:20 -07:00
}
impl BlockHeader {
pub fn hash(&self) -> H256 {
dhash256(&serialize(self))
}
}
2016-09-19 05:37:53 -07:00
impl fmt::Debug for BlockHeader {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2016-09-19 05:37:53 -07:00
f.debug_struct("BlockHeader")
.field("version", &self.version)
.field("previous_header_hash", &self.previous_header_hash.reversed())
.field("merkle_root_hash", &self.merkle_root_hash.reversed())
.field("time", &self.time)
.field("bits", &self.bits)
2016-09-19 05:37:53 -07:00
.field("nonce", &self.nonce)
.finish()
}
}
2016-11-29 02:48:14 -08:00
impl From<&'static str> for BlockHeader {
fn from(s: &'static str) -> Self {
deserialize(&s.from_hex().unwrap() as &[u8]).unwrap()
}
}
2016-08-15 05:50:20 -07:00
#[cfg(test)]
mod tests {
2016-09-18 09:12:45 -07:00
use ser::{Reader, Error as ReaderError, Stream};
2016-08-15 05:50:20 -07:00
use super::BlockHeader;
#[test]
fn test_block_header_stream() {
let block_header = BlockHeader {
version: 1,
2016-09-19 02:58:53 -07:00
previous_header_hash: [2; 32].into(),
merkle_root_hash: [3; 32].into(),
2016-08-15 05:50:20 -07:00
time: 4,
bits: 5.into(),
2016-08-15 05:50:20 -07:00
nonce: 6,
};
let mut stream = Stream::default();
stream.append(&block_header);
let expected = vec![
1, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 0, 0, 0,
5, 0, 0, 0,
6, 0, 0, 0,
2016-09-19 09:06:43 -07:00
].into();
2016-08-15 05:50:20 -07:00
assert_eq!(stream.out(), expected);
}
2016-08-15 07:13:52 -07:00
#[test]
fn test_block_header_reader() {
let buffer = vec![
1, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 0, 0, 0,
5, 0, 0, 0,
6, 0, 0, 0,
];
let mut reader = Reader::new(&buffer);
let expected = BlockHeader {
version: 1,
2016-09-19 02:58:53 -07:00
previous_header_hash: [2; 32].into(),
merkle_root_hash: [3; 32].into(),
2016-08-15 07:13:52 -07:00
time: 4,
bits: 5.into(),
2016-08-15 07:13:52 -07:00
nonce: 6,
};
assert_eq!(expected, reader.read().unwrap());
assert_eq!(ReaderError::UnexpectedEnd, reader.read::<BlockHeader>().unwrap_err());
}
2016-08-15 05:50:20 -07:00
}