From afc206f480c142f9b0182de15289c3c72fc1de2e Mon Sep 17 00:00:00 2001
From: qh11 <qh11@illinois.edu>
Date: Sun, 13 Feb 2022 15:32:57 -0600
Subject: [PATCH] Update block.rs

---
 src/types/block.rs | 74 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 69 insertions(+), 5 deletions(-)

diff --git a/src/types/block.rs b/src/types/block.rs
index a85b0b6..51dd9b3 100755
--- a/src/types/block.rs
+++ b/src/types/block.rs
@@ -1,27 +1,91 @@
 use serde::{Serialize, Deserialize};
 use crate::types::hash::{H256, Hashable};
+use crate::types::transaction::SignedTransaction;
+use std::time::{SystemTime, UNIX_EPOCH};
 
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct Block {
+    pub header : Header,
+    pub content : Vec<SignedTransaction>,
+}
+
+
+#[derive(Serialize, Deserialize, Debug, Clone)]
+pub struct Header {
+	pub parent : H256,
+	pub nonce : u32,
+	pub difficulty : H256,
+	pub timestamp : u128,
+	pub merkle_root : H256,
 }
 
 impl Hashable for Block {
     fn hash(&self) -> H256 {
-        unimplemented!()
+        return self.header.hash();
+    }
+}
+
+impl Hashable for Header {
+    fn hash(&self) -> H256 {
+        let bytes = bincode::serialize(&self).unwrap();
+        return ring::digest::digest(&ring::digest::SHA256, &bytes).into();
     }
 }
 
 impl Block {
     pub fn get_parent(&self) -> H256 {
-        unimplemented!()
+        self.header.parent
     }
 
     pub fn get_difficulty(&self) -> H256 {
-        unimplemented!()
+        self.header.difficulty
+    }
+}
+
+
+pub fn generate_genesis_block() -> Block {
+    // let mut rng = rand::r;
+    let emptyRoot = H256::from([0;32]);
+    return get_random_block(&emptyRoot);
+}
+
+pub fn get_random_block(parent: &H256) -> Block {
+    // let mut rng = rand::r;
+    let content: Vec<SignedTransaction> = Vec::new();
+    let bytes = bincode::serialize(&content).unwrap();
+    let merkle_root = ring::digest::digest(&ring::digest::SHA256, &bytes).into();
+    let difficulty = H256::from([255u8; 32]);
+    let header = Header{
+        parent: *parent,
+        nonce: rand::random::<u32>(),
+        timestamp: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis(),
+        merkle_root: merkle_root,
+        difficulty: difficulty,
+    };
+    Block{
+        header: header,
+        content: content,
     }
 }
 
 #[cfg(any(test, test_utilities))]
 pub fn generate_random_block(parent: &H256) -> Block {
-    unimplemented!()
-}
\ No newline at end of file
+    // let mut rng = rand::r;
+    let content: Vec<SignedTransaction> = Vec::new();
+    let bytes = bincode::serialize(&content).unwrap();
+    let merkle_root = ring::digest::digest(&ring::digest::SHA256, &bytes).into();
+    let difficulty = crate::types::hash::generate_random_hash();
+    let header = Header{
+        parent: *parent,
+        nonce: rand::random::<u32>(),
+        timestamp: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis(),
+        merkle_root: merkle_root,
+        difficulty: difficulty,
+    };
+    Block{
+        header: header,
+        content: content,
+    }
+}
+
+
-- 
GitLab