酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(4):比特币的挖矿是怎么样的一个过程?

blockchain-tutorial
在《如何理解区块链中的密码学技术及其应用?》中,简单介绍过哈希函数与它的主要性质。

其中的两个性质是:
1. hiding:隐蔽性。这个性质也称为“原像不可逆”,即是无法通过哈希函数的输出值反推输入值。
2. puzzle friendly:难题好友性。此性质指没有办法快捷地找出合适的输入值来产生满足条件的输出值。

要找到合适的输入值,用来产生满足条件的输出值,唯一的办法就是用暴力求解的方式,尝试不同的输入值,计算出哈希值来和目标值进行比较。

这种通过哈希运算得出符合特定要求的哈希值的过程,可以作为比特币系统中共识算法中的工作量证明(proof of work),也就是我们所说的“挖矿”。

比特币挖矿的过程,就是找到一个随机数,这个随机数和区块里面的其他值一起取哈希,得到的哈希值小于或者等于该区块的目标哈希值。找到这个随机数的矿工,取得该区块的记账权。抢到记账权的矿工负责将账本信息同步给整个网络。作为回报,比特币系统将该区块新生成的比特币和这个区块里全部交易的手续费奖励给该矿工。

用公式表示是:
H(x)

挖矿就是要找到符合要求的输入值,计算出的哈希值小于或者等于区块的target值。这个目标值越大,取值范围就越宽,计算的难度就越小;反之,目标值越小,取值范围就越小,计算难度就越大。就像射箭一样,靶子越大,越容易射中;靶子越小,越难射得中。

目标值是动态调整的,比特币系统中每经过2016个区块就会根据过去的这2016个区块产生所实际需要的实际时间跟所期待的时间(20160分钟)进行比较,从而动态调整接下来的2016个新区块的目标值。具体的细节会在后面的文章进行介绍。

这里接着说输入值。输入值是由区块头里的几个字段组成,这些字段分别是:
区块版本号、前一个区块的区块头哈希值、Merkle根哈希、时间戳、难度目标、Nonce(随机数)。

其中,区块版本号表示当前比特币软件的版本号,在较长时间内一般都不会变的。前一个区块的区块头哈希值,用来将本区块和前一个区块链起来,这个值是不能变的。时间戳,就是这个区块的产生时间,由于比特币系统对时间的精度要求不是很高,这个值可以做小小的调整,但范围有限。难度目标值,每2016个区块调整一次。

能够进行较大调整的值是Merkle根哈希和随机数Nonce。Merkle是一种对称的二叉树数据结构,其叶节点是这个区块要打包的交易数据。其中第一个交易是比较特殊的交易,coinbase交易,即是新产生的比特币作为给予矿工的奖励交易。coinbase交易的备注字段,其内容可以随便写,通过对这个值取不同值,用来计算出不同的哈希值。

Nonce这个随机数是挖矿过程中重点想找的值,是获得挖矿奖励的核心要素。比特币挖矿的过程就是不断地取随机数,对上面包括随机数在内的六个字段进行一系列的转换、连接,然后进行哈希运算,最后找出一个随机数,这个随机数跟其他字段一起计算出来的值,小于或者等于目标值。找到这个随机数的矿工,将数据打包发布到比特币网络、经过其他节点的确认之后,获得挖矿奖励。这就是比特币“挖矿”的过程。

未经允许不得转载:酸饼 » 区块链入门100问(4):比特币的挖矿是怎么样的一个过程?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼