首先什么是共识机制?共识机制就是在一个群体中的个体通过某种方式达成一致性的一种机制,比如在一个团队、或者一个公司里的个体意见不一致时,就需要有一个领导,由领导来做决定,保证团队达成共识。
团队里的共识机制延伸到普通的分布式系统里面,就是系统需要有一个master,系统的所有决定都由master来达成共识,在分布式系统里面master的选举其实就是基于某种共识机制达成共识。
到了区块链中,由于区块链是一种去中心化的分布式系统,所以区块链中是没有类似于团队里的领导,以及分布式系统中的master的角色,这样就需要有某种共识机制,以便保证系统一致性。
实际上当节点之间的通信网络不可靠的情况下,系统是无法达成共识的,具体原因请参考“两军问题"。即使在网络通信可靠的情况下,一个可扩展的分布式系统的共识问题也是无解的。这个结论被称为”FLP不可能性原理“,又称为分布式领域的”测不准原理“,原理请参考”拜占庭将军问题“。一般的把故障(不响应)即信道不可靠的情况称为”非拜占庭错误“,恶意响应(即系统被攻击)称为”拜占庭错误“。
以上只是学术上的理论值,现实系统中我们付出一定的代价总是能做到一定程度的共识。详情可参考CAP理论。
比特币区块链采用了一种工作量证明(Proof of Work)的共识机制来解决区块链中的一致性问题,工作量证明通过猜测一个数值,来解决规定的hash问题,保证一段时间内,系统中只能出现少数合法提案,这也是为什么比特比挖矿每隔10分钟成功一次的原因。理解工作量证明的一个好的例子是这样的:”给定的基本字符串“hello,world!",我们给出的工作量要求是,可以在这个字符串后面添加一个叫做nonce的整数值,使得变更后的字符串的SHA256哈希运算的结果有4位的前导0,即以”0000“开头,则此结果符合要求,验证通过。为了通过验证,我们需要不停的递增nonce的值,对新字符串进行SHA256哈希运算,这里的规则需要4251次计算才能得到符合要求的结果,当然在真实的区块链中的工作量证明的算法要复杂的多,得到符合要求的结果所需的工作量也要大的多。
比特比中的工作量证明机制步骤如下:
1.生成Coinbase交易 ,并与其他所有将要打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash.
2.把Merkle Root hash以及其他相关字段组成区块头,讲区块头的80字节 数据作为工作量证明的输入。
3.不停的变更区块头中的随机数即nonce的数值,并对每次变更后的的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。比特币区块头信息 如下:
区块头大小80字节,有4字节的版本号,32字节的上一个区块的散列值,32字节的merkle Root hash、4字节的时间 戳,4字节当前难度值,4字节随机数组成,区块中的第一比交易为coinbase交易。merkle Root hash是一种父节点为两个孩子 节点的哈希值得二叉树,这种数据结构的特点是,对底层数据的变动都会传递到根节点,更多资料请自行查询。
其他的共识机制还有股权证明机制(Proof of stake,POS),授权拜占庭容错机制(delegated BFT),拜占庭容错算法(PBFT),以及zookeeper中使用的Paxos算法。
如果你对区块链感兴趣,可以加我的个人微信交流。