共识机制在以前一般被称为证明方式(Proof),因为比特币采用工作量证明(即Proof-Of-Work,简写为POW)。
POW系统构建区块的过程一般称为“挖矿”(mine)
随着大家对分布式账本一致性问题的不断探索,很多方法被提出来,尤其近期有很多区块链项目回归了对传统BFT算法的改进,在思路上已经跳出了“证明”的语义,因此进一步高度概括为共识机制。
我记得第一次碰到工作量证明这一概念时感到很费解,对这种表述方式很头疼,掌握了POW机理后才真正明白,通俗讲就是“通过工作以获得指定成果,用成果来证明曾经付出的努力”。
其实我们日常工作生活中经常使用工作量证明,比如学生考试成绩,毕业证以及驾照等,这种证明方式的一个显著特征是往往需要很大的工作量才能拿到指定成果,但这个成果很容易验证。
因为我们一般很难去实时监督一个人是否真的付出了这些工作量,所以只能使用工作量的结果来证明。
再回到比特币的设计思路,中本聪已经使用非对称密码解决了数字货币的所有权问题,用区块时间戳解决了交易的存在性问题,用分布式账本解决了剔除第三方结构后交易的验证问题,剩下需要解决的问题是双重支付,这要求所有节点账本统一,而真正的平等又必须赋予人人都有记账的权利,记账是一件简单的事情,每个人都可以做,显然最终会存在众多大同小异的账本,但我们只需要其中的一个账本就够了。
中本聪想到给记账加入成本,总账本由各个分页按照时间先后排序,给每个账本分页设立一个评判标准,以区分账本分页是否合格,这给记账增加了难度,同时给每个账本分页加入一个随机元素,用以调节记账难度以保证一定时间段内只有一个人生成合格的账本分页。增加的成本就是工作量,合格的账本分页就是工作量证明。
对于比特币而言,所谓的账本分页就是一个区块,区块通过巧妙设计形成区块链,合格的区块可以表述为:
F(Nonce) < Target
其中Nonce是随机元素,Target是合格区块的量化,每个记账节点的Target一致。
此外POW的成功运行还需要配合如下两条约定,Best chain原则:将最长的链条视为正确的链条。
激励原则:找到合格的区块有奖励收益。
第1条约定为硬性规则
无条件遵守,大家要么不玩,要玩就遵守这条原则,毕竟共同的目标是找到一致性账本,而最长的链条代表最大的工作量,如果没有这条约定,每个人都只会构造自己的区块链,无法统一。
第2条为工作量激励
既然记账有成本,那唯有收益才能驱动大家都去记账,参与记账构造区块变成投资行为,其成本和收益风险在第1条约束下形成博弈,驱动所有节点按约定规则老老实实够造区块,最终达到纳什均衡。
具体实现方式,比特币采用哈希(Hash)算法,关于哈希算法的原理和特点在前一篇文章(挖矿演进)已经详细讨论。逻辑上比特币是对整个区块进行哈希运算,但真正实现并非将整个区块数据作为哈希函数的参数,区块大体可分为区块链头和交易列表两部分,交易列表通过构造成Merkle树最终浓缩成Merkleroot内置于区块头,区块头只有6个字段,共80字节,如此设计首先带来的好处是方便哈希运算,每次运算只需要80字节的参数输入,而不是整个区块的数据,但交易列表的任何变化又能体现在哈希运行结果上。
比特币采用SHA256哈希运算,且每次都是连续进行两次SHA256运算才能作为最终结果,前一次运算的结果作为后一次运算的输入,即Double SHA256,一般简称SHA256D,扩展上面的公式,比特币合格区块判断依据如下:
SHA256D(nVersion,hashPreBlock,hashMerkleRoot,nTimes,nBits,Nonce)<MAXTARGET/Diff
其中式子左边的6个参数(区块头)在前一篇文章已经解释,MAXTARGET为最大目标值,常量;Diff代表难度,全网难度一致。MAXTARGET/Diff即通常所说的当前目标值。
POW的核心要义为
算力越大,挖到块的概率越大,维护区块链安全的权重越大。
相对其他共识机制而言,POW逻辑简单,容易实现,容错达50%,其安全有严格的数学论证。
比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。
要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。
当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。