加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

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

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

什么是加密货币挖掘?

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

挖矿的原理

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

哈希/散列介绍

单向加密人类能够理解的输入,例如 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.     /// <summary>  
  4.     /// 区块位置  
  5.     /// </summary>  
  6.     public int Index { get; set; }  
  7.     /// <summary>  
  8.     /// 区块生成时间戳  
  9.     /// </summary>  
  10.     public string TimeStamp { get; set; }  
  11.     /// <summary>  
  12.     /// 心率数值  
  13.     /// </summary>  
  14.     public int BPM { get; set; }  
  15.     /// <summary>  
  16.     /// 区块 SHA-256 散列值  
  17.     /// </summary>  
  18.     public string Hash { get; set; }  
  19.     /// <summary>  
  20.     /// 前一个区块 SHA-256 散列值  
  21.     /// </summary>  
  22.     public string PrevHash { get; set; }  
  23.     /// <summary>  
  24.     /// 下一个区块生成难度  
  25.     /// </summary>  
  26.     public int Difficulty { get; set; }  
  27.     /// <summary>  
  28.     /// 随机值  
  29.     /// </summary>  
  30.     public string Nonce { get; set; }  

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

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

3. 工作证明

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读