比特币中的工作量证明(挖矿)

比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明的迷题。
这道题关键的三个要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题的所需要的计算量。
1.工作量证明函数
和我们上节例子中用到的哈希函数一样,比特币系统中使用的工作量证明函正是SHA256。
SHA是安全散列算法(Secure Hash Algorithm)的缩写,是一个密码散列函数家族。这一组函数是由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST) 发布的,主要适用于数字签名标准。SHA256就是这个函数家族中的一个,是输出值为256位的哈希算法。到目前为止,还没有出现对SHA256算法的有效攻击。
2.区块
比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。区块包含的交易列表则附加在区块头后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。
拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。因此,为了使区块头能体现区块所包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash,并以此作为交易列表的摘要存到区块头中。
3.难度值
难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
这个公式可以总结为如下形式:
新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )
工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:
目标值 = 最大目标值 / 难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。
 与第3节所举的例子相类比,我们也可以简单理解成,比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。

4.工作量证明的过程

我们可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:
生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash
把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据(Block Header)作为工作量证明的输入
不停的变更区块头中的随机数即nonce的数值,并对每次变更后的的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
5结语
比特币的工作量证明,就是我们俗称“挖矿”所做的主要工作。理解工作量证明机制,将为我们进一步理解比特币区块链的共识机制奠定基础。
比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。
要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。
当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。
当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。

什么是比特币挖矿

① 区块和区块链
一段时间内的交易打成的一个包称为区块,比特币全网平均每10分钟产生一个区块,每一个区块都链接到上一个区块,依次相连形成区块链。
② 以区块为单位同步交易数据
区块从1开始编号,因此节点A连接节点B后,只要检查双方的区块编号高度,就能方便地同步交易数据。例如节点A自己的区块高度是100,发现节点B的区块高度是110,则只要向B请求同步101~110这10个区块即可。
③ 打包区块的奖励
为保证有节点打包比特币交易,比特币规则规定:打包交易的节点将获得比特币作为酬劳。
A、打包奖励的一部分来自交易创建者支付的交易手续费(每KB交易大小100~1000聪手续费)。
B、另一部分来自初始2100万个比特币的分发,最开始奖励是每个区块50比特币,之后每经过21万个区块(约4年时间)奖励将减半一次,直到2140年左右区块奖励不足1聪为止,此时区块奖励总和为2100万比特币,这就是比特币2100万总量的来源(准确地说是 20999999.97690000个)。
2140年后打包奖励将只来自于交易创建者支付的交易手续费。
④ 对区块打包权的竞争
节点打包交易只需要消耗很低成本的网络和计算资源,打包奖励的存在(目前每个区块的打包奖励25比特币约为4万元),使得有大量节点想打包交易。为保证区块链的唯一性,比特币规则规定:节点使用类似“扔硬币”的方法争夺交易打包权。节点不断地扔硬币,谁首先扔出符合规则的结果,谁就能获得这个区块的交易打包权,以及这个区块的打包奖励。
⑤ 竞争交易打包权的方式
“扔硬币”在实现上是计算机做一次哈希(SHA-256)运算,并检查运算结果从第一位开始是否有足够多连续的0(可以简单理解为一次扔256个硬币,然后看从第一个硬币开始是否有足够多的连续硬币正面)。“扔硬币”获胜的唯一诀窍是提高每秒扔硬币的次数,一个每秒能扔100亿次硬币(做100亿次哈希计算)的节点,抢到打包权的概率是每秒扔1亿次硬币节点的100倍。
⑥ 获胜节点打包交易并广播
一旦有某个节点扔出符合系统规则的硬币结果(例如区块379543的哈希值 000000000000000008bdeb575056584429ea4be876ea7ca4ce70262d3edb8c8b),他就会立即将这段时间搜集到的交易打包成一个区块,附上“扔硬币”的结果、区块序号379543、上一区块关系等附加信息广播出去,其它节点一旦收到区块379543并验证无误,就会停止“扔硬币”抢这一区块,转而在这一区块的基础上开始“扔硬币”抢下一区块379544。
⑦ “挖矿”和“矿工”的由来
节点大量进行哈希计算需要计算机设备,并消耗大量电力,这个过程在本质上和金矿挖矿很相似(通过挖矿设备,消耗能源换取黄金)。比特币总量恒定,产量越来越少的产生方式也和黄金很相似。
因此人们形象地将比特币抢打包权的过程称为挖矿(mine),将抢打包权的比特币节点称为矿工(miner)。

猜你喜欢

转载自blog.csdn.net/weixin_41926234/article/details/80623091