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
use ensicoin_serializer::types::Sha256Result; use ensicoin_serializer::{Deserialize, Serialize}; use sha2::Digest; use crate::message::{Message, MessageType}; use crate::resource::Transaction; #[derive(Serialize, Deserialize, Clone)] pub struct BlockHeader { pub version: u32, pub flags: Vec<String>, pub prev_block: Sha256Result, pub merkle_root: Sha256Result, pub timestamp: u64, pub height: u32, pub target: Sha256Result, pub nonce: u64, } #[derive(Serialize, Deserialize, Clone)] pub struct Block { pub header: BlockHeader, pub txs: Vec<Transaction>, } impl BlockHeader { pub fn double_hash(&self) -> Sha256Result { let bytes = self.serialize(); let mut hasher = sha2::Sha256::default(); hasher.input(bytes); let first = hasher.result(); hasher = sha2::Sha256::default(); hasher.input(first); hasher.result() } } impl Block { pub fn double_hash(&self) -> Sha256Result { self.header.double_hash() } } impl Message for Block { fn message_string() -> [u8; 12] { [98, 108, 111, 99, 107, 0, 0, 0, 0, 0, 0, 0] } fn message_type() -> MessageType { MessageType::Block } }