一.前言
在了解pow共识机制前,我们先了解下比特币区块的结构,下图是比特币区块的结构图:
从图上可知,比特币的结构分为区块头和区块体,其中区块头细分为:
父区块头哈希值:前一区块的哈希值,使用SHA256(SHA256(父区块头))计算。占32字节
版本:区块版本号,表示本区块遵守的验证规则 。占4字节
时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节
难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节
随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节
Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节
如此,细心的同学会发现,区块头总共占了80字节。
区块体除了筹币交易记录(由一棵Merkle二叉树组成)外,还有一个交易计数。
比特币的任何一个节点,想生成一个新的区块,必须使用自己节点拥有的算力解算出pow问题。因此,我们先了解下pow工作量证明的三要素。
二.pow工作量证明三要素
在前言中介绍完比特币区块后,接下来我们了解下pow机制需要满足哪些要素?
1.工作量证明函数
在比特币中使用的是SHA256算法函数,是密码哈希函数家族中输出值为256位的哈希算法。
2.区块
区块头在前言中已经做详细介绍,这里我们就介绍下区块体的 Merkle树算法:
如上图所示,首先对4个交易记录L1--L4,分别计算hash(L1)--hash(L4),然后计算hash0=hash0-0+hash0-1和hash1=hash1-0+hash1-1,最后计算出根节点的hash值top hash。
3.难度值
关于难度值,我们直接看公式:
新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
目标值=最大目标值/难度值
新难度值解析:撇开旧难度值,按比特币理想情况每10分钟出块的速度,过去2016个块的总花费接近20160分钟,这样,这个值永远趋近于1。
目标值解析:最大目标值为一个固定数(具体可查阅资料了解,这里不做详述),若过去2016个区块花费时长少于20160分,那么这个系数会小,目标值将会被调大些,反之,目标值会被调小,因此,比特币的难度和出块速度将成反比例适当调整出块速度。
介绍完pow工作量证明的三要素后,我们就可以讲解下工作量证明的流程
三.pow工作量证明流程
从流程图中看出,pow工作量证明的流程主要经历三步:
1.生成Merkle根哈希
生成Merkle根哈希在第二章节中的第2要素中已经有讲解,即节点自己生成一笔筹币交易,并且与其他所有即将打包的交易通过Merkle树算法生成Merkle根哈希,所以为什么说区块是工作量证明的三要素之一。
2.组装区块头
区块头将被作为计算出工作量证明输出的一个输入参数,因此第一步计算出来的Merkle根哈希和区块头的其他组成部分组装成区块头,这也就是为什么我们在前言中大费周章的去提前讲解比特币的区块头。
3.计算出工作量证明的输出
下面我们直接通过公式和一些伪代码去理解工作量证明的输出:
i. 工作量证明的输出=SHA256(SHA256(区块头))
ii. if(工作量证明的输出<目标值),证明工作量完成
iii.if(工作量证明的输出>=目标值),变更随机数,递归i的逻辑,继续与目标值比对。
注:目标值的计算见第二章节的要素3的难度值。
上面的流程图及解析即pow工作量证明的整个过程。
四.pow共识记账
第三章中讲解的是单节点工作量证明流程,有了这个计算流程,我们就得将其使用起来,在比特币平台中,中本聪就是运用的pow工作量证明来使全网节点达到51%及以上的共识记账,以下将介绍pow工作量证明共识是如何记账的?
首先,客户端产生新的交易,向全网广播
第二,每个节点收到请求,将交易纳入区块中
第三,每个节点通过第三章中描述的pow工作量证明
第四,当某个节点找到了证明,向全网广播
第五,当且仅当该区块的交易是有效的且在之前中未存在的,其他节点才认同该区块的有效性
第六,接受该区块且在该区块的末尾制造新的区块
大概时序图如下: