自从开始学习区块链相关知识之后,脑袋中对于挖矿的机制开始有越来越多的问号。而网路上大部分的文章都只有讲到一些大面向,并没有谈到一些细节的部份,于是就稍微整理下关于挖矿的整体流程。
这篇文章将会着重在挖矿的流程与细节部分,因此只会稍微带过一些基础的知识。这篇文章也不是在教学如何开始挖矿,而是挖矿的原理部分。
什么是挖矿?
先从最基本说起,比特币区块链是一个纪录在比特币上所有交易的帐本,你可以想像每一个区块就是帐本上的一页,每一个区块(页)上都写着很多笔的交易。
在中心化的世界中,会有一个被大家信任中央机关负责管理这本帐本,例如:中央银行,并将新的交易持续纪录在帐本上。而在比特币的世界中,我们拿掉了这个中央机关,改成让所有节点都各自拥有这本帐本。
挖矿就是要决定出负责更新下一个区块的节点,在挖矿比赛中胜出的矿工可以更新下一个区块并获得奖励,其他所有节点会验证这个区块并更新自己的帐本,形成了去中心化的世界。
挖矿的过程是一个猜数字比赛,你可以想像成一个丢骰子比赛,谁先丢出小于3点的点数(1或2)就赢了,但这个骰子如果只有六面那就太简单了,在挖矿的世界里这个骰子是个好几亿(天文数字)面的骰子。
在挖矿的过程中矿工会耗费大量的能源去猜这个数字,为了让这些辛勤的矿工继续的卖命工作,中本聪设置了一个奖励机制,奖励胜利的矿工新挖出来的比特币(目前是12.5个比特币)加上这个区块中所有交易的交易手续费。所以大家普遍认知挖矿是为了要获利,但其实挖矿的理念是为了维持比特币的去中心化。
在对挖矿有初步了解后,接下来进入到挖矿流程细节的部分
挖矿流程
在所有的流程中,都是持续听取网路上发生的新事情,不断的将新交易加入到交易池中,并确认是否有人挖到新的区块
- 在上一轮挖矿结束后,将最新的区块更新到自己的帐本上,并把已确认的交易从交易池中删除。
- 创建候选区块(candidate block),并从交易池中选择喜欢的交易(通常是有较高手续费的交易)并把他们打包到候选区块中
- 创建Coinbase transaction,也就是奖励的部分,包含了基本的新比特币奖励以及交易手续费。奖励将是区块中呈现的第一笔交易,因为其中新的比特币不是从谁谁谁那里交易过来的,而是无中生有的。
- 创建区块头(Block Header),包括版本号、上一个区块的hash、Nonce…等等
- 开始挖矿,猜测Nonce来更新区块的哈希(hash)值
- (假设你是第一个猜到的矿工)成功挖出区块,并广播给你邻近的节点让他们验证,若区块是合法的,这些节点会再把区块广播下去并更新他们自己的帐本
- 下一轮挖矿竞赛开始
再更深入一点…
我们针对第四个步骤进行更深入的探讨,也就是猜测哈希值部分
比特币区块链使用的是SHA256算法,也就是说我们把区块头的东西都丢进去后会产生一个64位元的16进位数字:
SHA256( Block Number, Timestamp, Nonce, Data, Prev. Block's Hash)➝
0f8ef3377b30fc47f96b48247f463a726a802f62f3faa03d56403751d2f66c67
这个输出是无法预测的,接下来我们只要不断的变更Nonce值,让输入值(Input)不同,就会获得不同的哈希值(Output)
那哪个哈希值才是正确答案?
在比特币中为了要让平均产出区块的时间落在10分钟左右,设置了一个难度目标值(Difficulty Target),猜测出的数字必须要小于这个目标值才算正确,大于目标值的结果全部都算是错误。
上图将所有的哈希值从小到大向上排列,从最底层(最小的哈希值)到目标值(Target)都是正确的哈希值。一个符合某目标的哈希值例子:
000000000000000000000000f8ef337347f96b42743260f62f3a3d56751d2c67
简单来说,这个目标值可以看成是领头”0"的数量。一个16进位的64位元数字有1⁶⁶⁴种不同的结果,假设目标值是前面18位元都要是0,那低于目标值的数就只剩下1⁶⁴⁶个。而随机猜中低于目标值的数(正确答案)的机率就是:
1⁶⁴⁶/1⁶⁶⁴= 0.00000000000000000002%
因此我们可以藉由减少或增加领头0的数量,来增加或减少难度。
假设我们将目标值设成只要最前面的一个数字是0就好,那我们的难度就直接降低到1⁶⁶³/1⁶⁶⁴=1/16=6.25%
问题来了…
在挖矿过程中,我们藉由猜测Nonce来找到符合目标的哈希值,但在区块头中,Nonce的大小是32bits,也就是²³²,约40亿种可能,这就产生了两个问题:
- 有可能找不到适合的Nonce使得哈希值低于目标值。
- 平均一台挖矿的机器一秒钟可以计算1亿个哈希值,也就是只要40秒就可以试完所有的Nonce
但比特币平均十分钟才挖出一个区块?
?????????????
所以挖矿机制中除了Nonce其实还有两个隐藏的关键解决了这个问题:
- 输入值中的时间戳记会随着时间而改变
因为时间戳记每一秒都在更新,每过一秒你的输入和输出就会变得完全不同,尝试过的Nonce就会因此产生出不同的结果。因此若你的矿机运算的超级快,在一秒之内就把所有的Nonce全部试完了,你可以等下一秒再全部试一次。
那如果你不想等下一秒呢?因此还有第二个关键:
2. 更换被打包的交易组合
同样的道理,若交易组合被更换了,造成输入值的改变,而得到的哈希值也会截然不同,因此我们就可以不休息,不断挖矿。
以上是一整个挖矿流程的细节,有一些部分可能太复杂因此在很多文章中都是点到为止,希望有让大家理解~
本文链接地址:https://www.wwsww.cn/btbkuangye/5759.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。