挖矿网

标题: 理解Bitcoin的挖矿难度调整算法 [打印本页]

作者: 老鸟矿工    时间: 2019-1-28 00:07
标题: 理解Bitcoin的挖矿难度调整算法
「在Bitcoin的设计中,PoW共识算法是极其精彩的一部分,矿工需按照全网络当前挖矿难度,耗费一定量的算力构造出合法的区块头部,才有可能让全网络接受这个区块并将其添加到账本中,进而获得区块奖励。挖矿难度是一个可变参数,为了出块均速控制在10分钟/个,每隔2016个区块,全网络中的节点会按照统一的算法重新计算并设定全网一致的新难度值。理解难度调整算法之前,需先熟悉区块与账本的生成过程、以及区块头部的数据结构,已经熟悉这些知识的读者可直接跳到第三部分。」
区块与账本生成流程
1)交易广播:用户签名发送交易到任意一个或多个网络节点,若交易是正确的,通过节点验证后,节点会继续向其他节点广播,最终传递到了大部分进行挖矿的节点中;
2)区块生产:矿工节点收到交易后,将交易打包成区块,并计算交易对应的Merkle Tree的树根哈希值,通过挖矿运算构造区块头部,直到区块头部的哈希值满足挖矿难度要求;
3)区块广播:任意矿工节点成功挖出区块之后,立即将区块广播到全网,和交易广播类似,全网络的其他节点会验证区块的合法性;
4)账本接纳:若同一时段只有一个合法区块被生产出来,而没有与之竞争的其他合法区块,该区块将会被纳入账本,若存在竞争区块,则取决于全网络的多数算力意志会选择继承并扩展哪一个区块路径分支,累计难度最大且最长的链最终会胜出,没有被纳入账本的合法区块则成为孤块,被淘汰出局。
「多数算力意志选择的路径」:可以将区块链的矿工集体看成是一支行军打仗的部队,这个部队在边打仗、边推进的过程中,经常会有人掉队或者走入歧路,那么如何区分歧路和主路呢?当然是拥有主要军力的主流部队选择的前进路线才是主路径。

(图1,难度累计最大且最长的链为主链,来自《Bitcoin Developer Reference》)
区块与头部数据结构
区块头部数据仅占80字节的存储空间,由于引入了交易Merkle Tree Root,区块头部可代表整个区块、可被独立传输与处理。在图2与图3的简单示意中,没有完整给出所有字段。真正的区块头部数据结构包含6个字段:
版本(Version):4字节,Bitcoin协议的版本,矿工可以设置4字节中的空闲比特位进行算力投票;
前一区块头部的哈希(Previous Block Hash):32字节,前一区块头部数据的哈希值(双重SHA256),通过该字段将各个区块依次链接起来形成区块链账本;
交易梅克尔树根哈希(Merkle Root):32字节,由本区块内的交易构成的Merkle Tree Root哈希值(双重SHA256);
区块生成时间(Time ):4字节,采用UNIX纪元时间,必须大于前面11个区块的中位数时间值,但不能超过当前时间2小时;
挖矿难度阀值(nBits,或记为Bits):4字节,对挖矿难度的目标阀值的简化编码,当前区块的哈希值(双重SHA256)必须小于或等于这个阀值;
随机数(Nonce):4字节,通过多次调整这个值对当前区块头部数据进行双重SHA256哈希运算,以满足挖矿难度阀值的要求。
(, 下载次数: 34)