From 678722eb7f579e864b5baf2ea337ca5943ea12c1 Mon Sep 17 00:00:00 2001
From: qh11 <qh11@illinois.edu>
Date: Sun, 13 Feb 2022 15:33:48 -0600
Subject: [PATCH] Update mod.rs

---
 src/blockchain/mod.rs | 49 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 41 insertions(+), 8 deletions(-)

diff --git a/src/blockchain/mod.rs b/src/blockchain/mod.rs
index 8ef1908..cde9847 100755
--- a/src/blockchain/mod.rs
+++ b/src/blockchain/mod.rs
@@ -1,29 +1,62 @@
-use crate::types::block::Block;
-use crate::types::hash::H256;
+use crate::types::block::{Block,generate_genesis_block};
+use crate::types::hash::{H256,Hashable};
+use std::collections::HashMap;
 
 pub struct Blockchain {
+    pub blocks: HashMap<H256, Block>,
+    pub blocks_lens: HashMap<H256, usize>,
+    pub latest: H256,
 }
 
 impl Blockchain {
     /// Create a new blockchain, only containing the genesis block
     pub fn new() -> Self {
-        Self {}
+        let genesis_block : Block = generate_genesis_block();
+        let mut blocks = HashMap::new();
+        let mut blocks_lens = HashMap::new();
+        let latest = genesis_block.hash();
+        blocks.insert(latest, genesis_block);
+        blocks_lens.insert(latest, 0);
+        Blockchain{
+            blocks: blocks,
+            latest: latest,
+            blocks_lens: blocks_lens,
+        }
     }
 
     /// Insert a block into blockchain
-    pub fn insert(&mut self, block: &Block) {
-        unimplemented!()
+    pub fn insert(&mut self, block: &Block) -> bool{
+        let parent = block.get_parent();
+        let block_hash = block.hash();
+        if self.blocks.contains_key(&parent) {
+            self.blocks.insert(block_hash, block.clone());
+            let clen = self.blocks_lens[&parent] + 1;
+            self.blocks_lens.insert(block_hash, clen);
+            if self.blocks_lens[&self.latest] < clen {
+                self.latest = block_hash;
+            }
+            true
+        } else {
+            false
+        }
     }
 
     /// Get the last block's hash of the longest chain
     pub fn tip(&self) -> H256 {
-        unimplemented!()
+        self.latest
     }
 
     /// Get all blocks' hashes of the longest chain, ordered from genesis to the tip
     pub fn all_blocks_in_longest_chain(&self) -> Vec<H256> {
         // unimplemented!()
-        vec![]
+        let gen_parent = H256::from([0;32]); // gen_block_parent
+        let mut result = Vec::new();
+        let mut curr = self.latest;
+        while curr != gen_parent {
+            result.push(curr);
+            curr = self.blocks[&curr].get_parent();
+        }
+        return result;
     }
 }
 
@@ -46,4 +79,4 @@ mod tests {
     }
 }
 
-// DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. AFTER TEST
\ No newline at end of file
+// DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. AFTER TEST
-- 
GitLab