parity-zcash/src/chain/block_header.rs

120 lines
2.9 KiB
Rust
Raw Normal View History

use std::fmt;
2016-09-18 09:12:45 -07:00
use ser::{
Deserializable, Reader, Error as ReaderError,
Serializable, Stream
};
use hash::{H256, h256_to_str};
2016-08-15 05:50:20 -07:00
2016-08-15 07:13:52 -07:00
#[derive(Debug, PartialEq)]
2016-08-15 05:50:20 -07:00
pub struct BlockHeader {
version: u32,
previous_header_hash: H256,
merkle_root_hash: H256,
2016-08-15 05:50:20 -07:00
time: u32,
nbits: u32,
nonce: u32,
}
impl fmt::Display for BlockHeader {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(writeln!(f, "version: {}", self.version));;
try!(writeln!(f, "previous header hash: {}", h256_to_str(&self.previous_header_hash)));
try!(writeln!(f, "merkle root hash: {}", h256_to_str(&self.merkle_root_hash)));
try!(writeln!(f, "time: {}", self.time));
try!(writeln!(f, "nbits: {}", self.nbits));
writeln!(f, "nonce: {}", self.nonce)
}
}
2016-08-15 05:50:20 -07:00
impl Serializable for BlockHeader {
fn serialize(&self, stream: &mut Stream) {
stream
.append(&self.version)
2016-09-19 02:58:53 -07:00
.append(&self.previous_header_hash)
.append(&self.merkle_root_hash)
2016-08-15 05:50:20 -07:00
.append(&self.time)
.append(&self.nbits)
.append(&self.nonce);
}
}
2016-08-15 07:13:52 -07:00
impl Deserializable for BlockHeader {
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
let version = try!(reader.read());
2016-09-19 02:58:53 -07:00
let previous_header_hash = try!(reader.read());
let merkle_root_hash = try!(reader.read());
2016-08-15 07:13:52 -07:00
let time = try!(reader.read());
let nbits = try!(reader.read());
let nonce = try!(reader.read());
let block_header = BlockHeader {
version: version,
previous_header_hash: previous_header_hash,
merkle_root_hash: merkle_root_hash,
time: time,
nbits: nbits,
nonce: nonce,
};
Ok(block_header)
}
}
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,
nbits: 5,
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,
];
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,
nbits: 5,
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
}