<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      區塊鏈模型原理入門學習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 }

       

        代碼運行:

        到這里,區塊鏈的基礎構建完成了。

        因為當前模型的數據結構構建真的不復雜,所以省略了代碼構建的分析過程。

      【學習是人類進步的階梯】

      posted @ 2025-02-22 06:22  MOEGARN游戲工作室  閱讀(176)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲色大成网站www永久男同| 在线免费播放av日韩| 亚洲国产长腿丝袜av天堂 | 国产精品无码素人福利不卡| 国产成人AV一区二区三区在线| 老太脱裤子让老头玩xxxxx| 国产午夜福利视频在线观看| 大宁县| 无套内谢少妇毛片aaaa片免费| 一区二区三区在线色视频| 国产婷婷色一区二区三区| 长腿校花无力呻吟娇喘| 亚洲精品一区二区美女| 暖暖视频日本在线观看| 亚洲综合网中文字幕在线| 岛国中文字幕一区二区| 中文字幕无码乱码人妻系列蜜桃| 亚洲国产片一区二区三区| 成人无码潮喷在线观看| 天堂…中文在线最新版在线| 欧美xxxx精品另类| 国产首页一区二区不卡| 桦川县| 精品无码老熟妇magnet| 欧美午夜小视频| 国产尤物精品自在拍视频首页| 亚洲乱妇老熟女爽到高潮的片| 91区国产福利在线观看午夜| 亚洲第一香蕉视频啪啪爽| 成人午夜无人区一区二区| 激情五月日韩中文字幕| 嗯灬啊灬把腿张开灬动态图| 国产在线观看免费观看| 精品无人乱码一区二区三区的优势 | 免费现黄频在线观看国产| 蜜桃麻豆www久久囤产精品| 少妇高潮潮喷到猛进猛出小说 | 国产激情艳情在线看视频| 日韩大尺度一区二区三区| 婷婷99视频精品全部在线观看| 欧美日韩国产亚洲沙发|