建议和反馈

请填写你的反馈内容

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

2019-12-06 ·1940次阅读 ·读完需要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 Chain { set;  get; }  

  4.   

  5.     public Blockchain()  

  6.     {  

  7.         InitializeChain();  

  8.         AddGenesisBlock();  

  9.     }  

  10.   

  11.   

  12.     public void InitializeChain()  

  13.     {  

  14.         Chain = new List();  

  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)
请先登录或注册

请先登陆或注册

相关推荐

如何解释“我篡改了区块链”这个问题

区块链数据“全局一致”、“难以篡改”这两个特性已经广为人知,是区块链营造“信任”的基石。为了达到这两个效果,区块链的共识、同步、校验等技术细节足可大书特书,而本文要从“我篡改了区块链数据”讲起。“我篡......
Moon · 2020-07-03
1810阅读 · 0赞赏 · 0问答

漏洞分析 | 一千种死法之 智能合约函数调用错误

6.18期间正愁”千手观音“还不够剁,如果一觉醒来,突然发现爸妈的账户可以随便用了,前男友的钱因为权限设置错误而面对你以及他所有前女友开放了。不是天上掉馅饼,而是老天可能漏了个洞。我的是我的,你的还是......
Rooney · 2020-06-27
1332阅读 · 0赞赏 · 0问答

波卡启动 NPoS,几个知识点了解一下?

Polkadot 今日启动 NPoS(验证人选举),其技术方案也再次引发关注。关于 Polkadot 的几大技术知识点,我们都总结在此了:· Polkadot 网络,中继链、平行链和转接桥· XCMP......
多来A梦 · 2020-06-19
1732阅读 · 0赞赏 · 0问答

区块链 Go并发编程之Channel生产者-消费者模型及单向Channel

生产者与消费者关系在channel中生产者消费者关系可以简单的理解为:生产者和消费者一定是一一配对的状态存在先看一个简单的案例,生产者与消费者关系为1:2package mainimport......
· 2020-06-17
2755阅读 · 0赞赏 · 0问答

区块链 Go并发编程 之 管道 Channel

GO 管道 channel什么是管道管道是Go语言在语言级别上提供的goroutine间的通讯方式,我们可以使用channel在多个goroutine之间传递消息。channel是进程内的通讯方式,是......
Diva · 2020-06-17
2572阅读 · 0赞赏 · 0问答

区块链 GO 并发编程 之 主线程与子线程

基础概念什么是进程?进程:一个正在运行的程序一般是一个进程,一个进程可以包含多个线程 每个进程都有自己的独立的地址空间(内存空间),简单的理解一个运行程序为一个进程什么是线程线程:一条有序的CPU命令......
wind · 2020-06-16
2290阅读 · 0赞赏 · 0问答

3324

LK币

18

粉丝

115

笔记

感谢"区块链网"

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

  • 0
  • 1
  • 9
  • 4
  • 0
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

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

联系方式:010-67707199

ICP备案号:京ICP备18032136号

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

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

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

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

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