建议和反馈

请填写你的反馈内容

在.NET Core中构建基本区块链

2019-12-06 ·983次阅读 ·读完需要5分钟

区块链技术是比特币的基础,比特币是世界上最受欢迎的加密货币。随着比特币的流行,区块链也获得了很大的曝光。人们现在也开始在非加密货币类型的应用程序中使用区块链。看看中本聪(Satoshi Nakamoto)(区块链的创始人)比特币白皮书,您可能会对比特币的工作方式感到困惑。今天,我将从头开始构建一个区块链,以帮助所有人了解区块链的机制。

什么是区块链?

区块链是一个数据库。什么是数据库?数据库是有组织的数据集合。或者,可以说,是一种存储数据的数据结构。因此,区块链只是存储数据的数据结构。就像所暗示的名字一样,将有许多块。 

以下是基本区块链的架构图。

区块链

这个基本的区块链有一个由块组成的链表。每个块具有以下属性。

  • 指数

  • 时间戳记

  • 以前的哈希

  • 杂凑

  • 数据

第一个块是一个特殊块:创世块。创世块是唯一没有先前的块并且不包含数据的块。

实作

我们将为此数据结构添加两个类:Block和Blockchain。

  1. public class Block  

  2. {  

  3.     public int Index { get; set; }  

  4.     public DateTime TimeStamp { get; set; }  

  5.     public string PreviousHash { get; set; }  

  6.     public string Hash { get; set; }  

  7.     public string Data { get; set; }  

  8.   

  9.     public Block(DateTime timeStamp, string previousHash, string data)  

  10.     {  

  11.         Index = 0;  

  12.         TimeStamp = timeStamp;  

  13.         PreviousHash = previousHash;  

  14.         Data = data;  

  15.         Hash = CalculateHash();  

  16.     }  

  17.   

  18.     public string CalculateHash()  

  19.     {  

  20.         SHA256 sha256 = SHA256.Create();  

  21.   

  22.         byte[] inputBytes = Encoding.ASCII.GetBytes($"{TimeStamp}-{PreviousHash ?? ""}-{Data}");  

  23.         byte[] outputBytes = sha256.ComputeHash(inputBytes);  

  24.   

  25.         return Convert.ToBase64String(outputBytes);  

  26.     }  

  27. }  

区块链

  1. public class Blockchain  

  2. {  

  3.     public IList<Block> Chain { set;  get; }  

  4.   

  5.     public Blockchain()  

  6.     {  

  7.         InitializeChain();  

  8.         AddGenesisBlock();  

  9.     }  

  10.   

  11.   

  12.     public void InitializeChain()  

  13.     {  

  14.         Chain = new List<Block>();  

  15.     }  

  16.   

  17.     public Block CreateGenesisBlock()  

  18.     {  

  19.         return new Block(DateTime.Now, null"{}");  

  20.     }  

  21.   

  22.     public void AddGenesisBlock()  

  23.     {  

  24.         Chain.Add(CreateGenesisBlock());  

  25.     }  

  26.       

  27.     public Block GetLatestBlock()  

  28.     {  

  29.         return Chain[Chain.Count - 1];  

  30.     }  

  31.   

  32.     public void AddBlock(Block block)  

  33.     {  

  34.         Block latestBlock = GetLatestBlock();  

  35.         block.Index = latestBlock.Index + 1;  

  36.         block.PreviousHash = latestBlock.Hash;  

  37.         block.Hash = block.CalculateHash();  

  38.         Chain.Add(block);  

  39.     }  

  40. }  

在拥有这两个类之后,我们可以创建新区块链的实例。

区块链

并且,我们可以向其添加块。

区块链

下面是代码。

  1. Blockchain phillyCoin = new Blockchain();  

  2. phillyCoin.AddBlock(new Block(DateTime.Now, null"{sender:Henry,receiver:MaHesh,amount:10}"));  

  3. phillyCoin.AddBlock(new Block(DateTime.Now, null"{sender:MaHesh,receiver:Henry,amount:5}"));  

  4. phillyCoin.AddBlock(new Block(DateTime.Now, null"{sender:Mahesh,receiver:Henry,amount:5}"));  

  5.   

  6. Console.WriteLine(JsonConvert.SerializeObject(phillyCoin, Formatting.Indented));  

区块链信息将被序列化为JSON,并在控制台中输出。

验证方式

使用区块链的优势之一是数据安全性。数据安全性意味着密码方法和数据本身的非集中式存储都可以防止篡改旧数据和更改保护新数据的方法。但是,区块链只是一个数据结构,在其中可以轻松更改数据。

  1. phillyCoin.Chain[1].Data = "{sender:Henry,receiver:MaHesh,amount:1000}";  

因此,我们需要一种验证数据的方法。这就是为什么我在代码中添加了IsValid方法的原因。

  1. public bool IsValid()  

  2. {  

  3.     for (int i = 1; i < Chain.Count; i++)  

  4.     {  

  5.         Block currentBlock = Chain[i];  

  6.         Block previousBlock = Chain[i - 1];  

  7.   

  8.         if (currentBlock.Hash != currentBlock.CalculateHash())  

  9.         {  

  10.             return false;  

  11.         }  

  12.   

  13.         if (currentBlock.PreviousHash != previousBlock.Hash)  

  14.         {  

  15.             return false;  

  16.         }  

  17.     }  

  18.     return true;  

  19. }  

IsValid方法将检查两件事。

  • 每个块的哈希值以查看是否已更改块

  • 上一个块的哈希值,以查看该块是否已更改并重新计算

然后,我们在数据篡改之前和数据篡改之后调用IsValid,以查看是否存在任何数据问题。

  1. Console.WriteLine($ “链是否有效:{phillyCoin.IsValid()}” );  

  2.   

  3. Console.WriteLine($ “更新金额为1000” );  

  4. phillyCoin.Chain [1] .Data =  “ {发送者:亨利,接收者:MaHesh,金额:1000}” ;  

  5.   

  6. Console.WriteLine($ “链是否有效:{phillyCoin.IsValid()}” );  

攻击者重新计算被篡改块的哈希的情况如何?

  1. phillyCoin.Chain [1] .Hash = phillyCoin.Chain [1] .CalculateHash();  

验证结果仍然为假,因为验证不仅查看当前块,还查看指向前一个块的链接。

现在,当攻击者重新计算所有当前块和后续块的哈希时,情况又如何呢?

  1. Console.WriteLine($"Is Chain Valid: {phillyCoin.IsValid()}");  

  2. Console.WriteLine($"Update amount to 1000");  

  3. phillyCoin.Chain[1].Data = "{sender:Henry,receiver:MaHesh,amount:1000}";  

  4. Console.WriteLine($"Is Chain Valid: {phillyCoin.IsValid()}");  

重新计算所有块后,验证通过。但是,这仅在一个节点上传递,因为区块链是一种去中心化的系统。篡改一个节点可能很容易,但是篡改系统中的所有节点是不可能的。

区块链是一个区块链。它使用加密技术来确保数据完整性。您可以在Visual Studio 2017中打开并运行示例代码。


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

如何使用CGMiner挖比特币

虽然许多人发现简单地购买比特币更容易,但更多的人却发现,比特币挖矿是一件有趣且具有挑战性的事情。比特币挖矿既有趣又有利可图,你可能会认为,上手实际上更容易。在本文中我将解释如何使用GPU和CGMine......
区块链社区 · 2020-01-17
109阅读 · 0赞赏 · 0问答

session工作原理:如何使用、修改及删除等操作

session和Cookie之间存在某种关系,它们的作用有些相同,并且在一定程度上可以互换使用。session已集成到PHP中,是一种在用户浏览网站上的一系列页面或页面迭代时为用户存储和跟踪数据的一种......
社区菲菲 · 2020-01-16
289阅读 · 0赞赏 · 0问答

ubuntu安装golang的七个步骤

在Ubuntu上安装Go(Golang)可能很棘手。版本12.04和14.04的存储库已过时,并安装了较旧的Go版本。幸运的是,有一个名为Go Version Manager(gvm)的工具可以帮助安......
BTC · 2020-01-16
327阅读 · 0赞赏 · 0问答

Linux echo命令示例

Linux echo命令用于在屏幕上显示一行文本。这是通过将字符串回显到标准输出来完成的。Linux echo命令让我们看看Linux手册页如何描述echo命令。可以通过键入以下命令来访问手册页:回声......
波bobo · 2020-01-15
397阅读 · 0赞赏 · 0问答

GoProxy教程:作用、下载及安装

GoProxy是一种高性能的http代理,https代理,socks5代理,ss代理,websocket代理,tcp代理,udp代理,游戏盾,游戏代理。支持正向代理,反向代理,透明代理,Interne......
社区菲菲 · 2020-01-15
413阅读 · 0赞赏 · 0问答

如何使用Python和Flask轻松实现区块链

区块链的基本目的是基本上以难以伪造的格式存储时序交易数据。即使通过第三方引用余额,也几乎不可能伪造余额。该块包含如下数据:块:块号hash:块的哈希值prev_hash:上一个块的哈希值交易:交易数据......
区块链网 · 2020-01-15
432阅读 · 0赞赏 · 0问答

1551

LK币

18

粉丝

72

笔记

感谢"区块链网"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 9
  • 8
  • 3
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!