區塊鏈模型原理入門學習1——簡易模型
最近抽空學習一下區塊鏈的設計原理,正在搭建一個非常簡易的模型,上生產的模型肯定復雜的多,不過學習還是由簡入難,逐步深入才行,一口吃不成胖子。
我使用的是C#編寫的。
區塊鏈的特點:
1.分布式記賬,去中心化。
2.挖礦是按照平臺規則通過大量計算對于平臺算式反向求解的過程。

當前,個人對于區塊鏈的認識:區塊鏈是一條鏈Chain,這條鏈上有若干個數據塊Block,每個Block里面都封裝了三個部分:上一個塊的哈希值PreHash、數據Data、當前塊的哈希值ThisHash。
計算哈希值使用Hash256計算,其特點:
1.不同長度的數據經過計算可得定長的字符串。
2.相同數據可以獲得相同的Hash值,修改一個一個字符,Hash將大不相同,毫無規律可言,保證暫時的安全性(嚴謹地說)
測試代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Security.Cryptography; 4 using System.Text; 5 6 namespace TestPrj 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 Chain chain = new Chain(); 13 14 Block block1 = new Block("轉賬10元"); 15 chain.AddNewBlock(block1); 16 Block block2 = new Block("轉賬30元"); 17 chain.AddNewBlock(block2); 18 19 20 //查看當前數據鏈總共數據快數 21 chain.ViewBlockCount(); 22 23 //查看所有數據鏈 24 chain.ViewAllBlocks(); 25 26 //驗證數據鏈 27 Console.WriteLine(chain.Validate()); 28 29 //模擬篡改數據 30 chain.Blocks[1].Prehash = ""; 31 32 //驗證數據鏈 33 Console.WriteLine(chain.Validate()); 34 } 35 } 36 } 37 38 //數據塊 39 public class Block 40 { 41 //數據 42 private string data; 43 //前一個Block的hash 44 private string prehash; 45 //當前Block的hash 46 private string curhash; 47 public Block(string data) 48 { 49 this.prehash = ""; 50 this.data = data; 51 this.curhash = ""; 52 } 53 54 //注意:這里為了模擬篡改數據專門封裝的字段 55 public string Data { get => data; set => data = value; } 56 public string Prehash { get => prehash; set => prehash = value; } 57 public string Curhash { get => curhash; set => curhash = value; } 58 59 //計算當前Block的Hash 60 public string ComputeHash(string prehash) 61 { 62 this.prehash = prehash; 63 return SHA256(this.data + this.prehash); 64 } 65 66 //Hash256計算 67 public string SHA256(string str) 68 { 69 //如果str有中文,不同Encoding的sha是不同的!! 70 byte[] SHA256Data = Encoding.UTF8.GetBytes(str); 71 72 SHA256Managed Sha256 = new SHA256Managed(); 73 byte[] by = Sha256.ComputeHash(SHA256Data); 74 75 return BitConverter.ToString(by).Replace("-", "").ToLower(); 76 } 77 78 //顯示Block數據 79 public void ViewInfo() 80 { 81 Console.WriteLine("===="); 82 Console.WriteLine("[prehash]->" + this.prehash); 83 Console.WriteLine("[data]->" + this.data); 84 Console.WriteLine("[hash]->" + this.curhash); 85 } 86 } 87 88 public class Chain 89 { 90 private List<Block> blocks; 91 92 public List<Block> Blocks { get => blocks; set => blocks = value; } 93 94 public Chain() 95 { 96 this.blocks = new List<Block>(); 97 Block genesisBloc = new Block("源數據塊"); 98 genesisBloc.Curhash = genesisBloc.ComputeHash("genesis"); 99 AddNewBlock(genesisBloc); 100 } 101 102 public void ViewBlockCount() 103 { 104 Console.WriteLine("當前數據塊總數->" + this.blocks.Count); 105 } 106 107 //添加Block 108 public void AddNewBlock(Block newblock) 109 { 110 //空鏈的情況 111 if (this.blocks.Count == 0) 112 { 113 this.blocks.Add(newblock); 114 newblock.Curhash = newblock.ComputeHash(newblock.Prehash); 115 return; 116 } 117 /*鏈接新Block*/ 118 //新的Block的prehash是上一個block的curhash 119 newblock.Prehash = this.blocks[this.blocks.Count - 1].Curhash; 120 newblock.Curhash = newblock.ComputeHash(newblock.Prehash); 121 /*添加新Block*/ 122 this.blocks.Add(newblock); 123 } 124 125 //查看所有Block 126 public void ViewAllBlocks() 127 { 128 foreach (var item in this.blocks) 129 { 130 item.ViewInfo(); 131 } 132 } 133 134 //驗證Chain 135 public bool Validate() 136 { 137 //無任何數據塊的情況 138 if (this.blocks.Count == 0) 139 { 140 Console.WriteLine("[數據鏈異常]->數據鏈為空!"); 141 return false; 142 } 143 //只有源數據塊的情況 144 else if (this.blocks.Count == 1) 145 { 146 Console.WriteLine("驗證完畢!"); 147 return true; 148 } 149 150 //遍歷校驗標志 151 bool checkBlockSign = true; 152 153 //遍歷檢查數據塊,因為不檢查源數據塊,下標從1開始 154 for (int checkBlockIndex = 1; checkBlockIndex < this.blocks.Count; checkBlockIndex++) 155 { 156 //檢驗curhash 157 var checkBlock = this.blocks[checkBlockIndex]; 158 if (checkBlock.Curhash != checkBlock.ComputeHash(checkBlock.Prehash)) 159 { 160 Console.WriteLine("[數據被篡改]->" + checkBlockIndex); 161 checkBlockSign = false; 162 break; 163 } 164 /* //驗證prehash 165 if (checkBlock.Prehash != this.blocks[checkBlockIndex - 1].Curhash) 166 { 167 Console.WriteLine("[數據鏈斷裂]->" + checkBlockIndex); 168 checkBlockSign = false; 169 break; 170 }*/ 171 } 172 Console.WriteLine("驗證完畢!"); 173 return checkBlockSign; 174 } 175 }
代碼運行:

到這里,區塊鏈的基礎構建完成了。
因為當前模型的數據結構構建真的不復雜,所以省略了代碼構建的分析過程。
【學習是人類進步的階梯】
【敬畏能量 敬畏自然】

浙公網安備 33010602011771號