设为首页 - 加入收藏 定西香江堵经 (http://www.0932zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 平台 为什么 芯片
当前位置: 首页 > 香江堵经 > 传媒 > 正文

使用C#编写自己的区块链挖矿算法

发布时间:2019-08-09 20:08 所属栏目:[传媒] 来源:MyZony
导读:什么是加密货币挖掘? 一个加密货币的价值体现在它的稀缺性上,如果任何人都可以任意构造一个比特币,那么比特币就毫无价值,所以比特币的区块链会让参与者完成一项工作,根据这个工作的最终结果还分发比特币,这个过程就被叫做挖矿。这就类似于一个黄金矿

什么是加密货币挖掘?

一个加密货币的价值体现在它的稀缺性上,如果任何人都可以任意构造一个比特币,那么比特币就毫无价值,所以比特币的区块链会让参与者完成一项“工作”,根据这个工作的最终结果还分发比特币,这个过程就被叫做“挖矿”。这就类似于一个黄金矿工花一些时间来工作,然后获得一点黄金。

挖矿的原理

如果你百度/谷歌搜索 比特币挖矿的原理 的话,都会给你说是计算一个复杂的数学问题而已,但是这么说的话太笼统而且也太简单。采矿引擎如何工作这是一个重要的知识点,所以我们需要了解一些密码学知识和哈希算法相关的知识,才能知道挖矿的基本原理。

哈希/散列介绍

单向加密人类能够理解的输入,例如 Hello World ,并将其扔到某个加密函数(即所谓的复杂的数学问题),加密函数的算法越复杂,逆向工程就越困难。

例如一个 SHA - 256 的例子,这个网站(链接:http://tool.oschina.net/encrypt?type=2)可以很快的计算散列值,让我们来散列 “Hello World” 看看会得到什么结果:

使用C#编写自己的区块链挖矿算法

不管你试验几次都会得到一样的散列值,在编程中这种被称之为幂等性。

加密算法的一个基本特性就是,它们很难通过逆向工程来得到明文结果,但是十分容易验证他们的加密结果,例如这里的 “Hello World” 很难通过逆向工程得到他的原明文结果,比特币采用的是 Double SHA-256 也就是将明文通过 SHA-256 计算过一次之后,再拿 SHA-256 针对散列值再次进行计算,在这里我们只使用 SHA-256 来进行加密。

工作证明

比特币通过让参与者散列随机的字母与数字的组合,直到计算出来的散列包含前导 0。

例如我们计算 886 的散列值可以得到如下结果:

  1. 000f21ac06aceb9cdd0575e82d0d85fc39bed0a7a1d71970ba1641666a44f530?

它返回了 3 个 0 作为前缀的散列值,但是我们怎么知道 886 计算出来的散列结果产生了 3 个 0呢?

答案是我并不需要知道。我需要知道矿工给我的散列值前导有几个零就好了,并不需要复杂的算法来验证整个散列值的有效性。

比特币则稍微复杂一点,它每隔 10 分钟生成一个新的区块,新区块的散列值的难度它可以动态调整,就类似于 CLR 的 GC 一样,它可以根据目前挖矿的人数来进行难度动态调整,如果挖矿的人多的话,则调高难度,少则调低。

动手开发

1.项目配置

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

2.数据模型

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

  1. public?struct?Block??
  2. {??
  3. ????///???
  4. ????///?区块位置??
  5. ????///???
  6. ????public?int?Index?{?get;?set;?}??
  7. ????///???
  8. ????///?区块生成时间戳??
  9. ????///???
  10. ????public?string?TimeStamp?{?get;?set;?}??
  11. ????///???
  12. ????///?心率数值??
  13. ????///???
  14. ????public?int?BPM?{?get;?set;?}??
  15. ????///???
  16. ????///?区块?SHA-256?散列值??
  17. ????///???
  18. ????public?string?Hash?{?get;?set;?}??
  19. ????///???
  20. ????///?前一个区块?SHA-256?散列值??
  21. ????///???
  22. ????public?string?PrevHash?{?get;?set;?}??
  23. ????///???
  24. ????///?下一个区块生成难度??
  25. ????///???
  26. ????public?int?Difficulty?{?get;?set;?}??
  27. ????///???
  28. ????///?随机值??
  29. ????///???
  30. ????public?string?Nonce?{?get;?set;?}??
  31. }?

Difficulty 是一个整形,他定义了我们希望得到哈希前导 0 的数量,前导 0 越多,生成正确的散列值就越困难,我们现在从 1 开始。

Nonce 则是每次计算块散列值所需要的随机值。

3. 工作证明

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章