新闻中心

    200 行代码使用 C# 实现区块链

    {$itemInfo['publish_time']|date='Y-m-d H:i:s',_ _ _ag真人游戏英格兰和德国是世界足坛最著名的死对头之一,在国家队层面的恩怨数不胜数。本赛季欧冠淘汰赛,来自英格兰和德国的六支球队,一定能续写英德传奇故事.ag视讯平台沙尔克04首先抽中曼城,热刺接着抽到多特蒙德,最后被称为“最强二档”的利物浦,抽到了拜仁慕尼黑.ag亚游集团曾经的德甲“班霸”拜仁本赛季状态大幅下滑,碰到最近状态火爆的利物浦,如果不能尽快补强,恐怕难以晋级!}##} 来源:ag真人游戏-ag视讯平台-ag亚游集团 浏览次数 4

      文章原文来自:Code your own blockchain in less than 200 lines of Go!,原始文章是通过 Go 语言来实现自己的区块链的,这里我们参照该文章来使用 C# + Asp.Net Core 实现自己的区块链。在这里我也参考了 这篇译文 。

      首先新建一个 Asp.Net Core 项目,然后选择 Empty Project(空项目) 类型,建立完成后无需进行任何配置。

      这里我们来创建一个具体的区块数据模型,使用的是 Struct 结构体。

      这里各个字段的含义已经在注释上方标明了,这里不在过多赘述。

      之后我们新建一个 BlockGenerator 静态类用于管理区块链,并且使用一个 List 保存区块链数据。

      我们使用散列算法(SHA256)来确定和维护链中块和块正确的顺序,确保每一个块的 PrevHash 值等于前一个块中的 Hash 值,这样就以正确的块顺序构建出链:

      

      使用散列是因为可以使用极少的控件生成每一个区块的唯一标识,而且可以维持整个区块链的完整性,通过每个区块存储的前一个链的散列值,我们就可以确保区块链当中每一个区块的正确性,任何针对区块的无效更改都会导致散列值的改变,也就破坏了区块链。

      那么我们就在 BlockGenerator 当中添加一个函数用于计算 Block 的 Hash 值:

      这里的 CalculateHash 函数接收一个 Block 实例,通过该实例当中的 Index、TimeStamp、BPM、PrevHash 的值来计算出当前块的 SHA256 Hash 值,之后我们就可以来编写一个生成块的函数:

      这个函数需要接收前一个块对象的值,用于新区块的 Index 递增以及 新的 SHA256 Hash 计算。

      这里掺入了一个 CalculateCurrentTimeUTC 函数,该函数主要是用于将 DateTime.Now 时间转换为 UTC 时间,如下:

      每一个区块都是不可信的,所以我们需要在生成新的区块的时候对其进行校验,校验规则如下:

      校验新区块与旧区块的 Index 是否正确递增

      校验新区块的 Hash 值是否正确

      校验新区块的 PrevHash 值是否与旧区块的 Hash 值匹配

      有了上述几种条件,我们可以编写一个校验函数如下:

      除开区块校验的问题之外,如果有两个节点被分别添加到各自的区块链上,我们应该始终以最长的那一条为主线,因为最长的那一条意味着他的区块数据始终是最新的。

      

      So,我们还需要一个更新最新区块的函数:

      现在整个区块链的基本操作已经完成,现在我们需要让他运转起来,我们来到 StartUp 当中,添加两个新的路由:

      我们先通过 PostMan 来构建一个创世块:

      

      然后我们尝试多添加几个之后,访问 BlockChain 来查看已经存在的区块链结构:

      

      通过以上代码我们完成了一个简陋的区块链,虽然十分简陋,但是已经具备了块生成,散列计算,块校验这些基本能力,你可以参考 GitHub 上面各种成熟的区块链实现来完成工作量证明、权益证明这样的共识算法,或者是智能合约、Dapp、侧链等等。