原文链接:【链块技术 04期】共识机制:POW
比特币系统是一个基于互联网的去中心化账本。
从去中心化账本系统的角度看,每个加入这个系统的节点都要保存一份完整的账本,但每个节点却不能同时记账,因为节点处于不同的环境,接收到不同的信息,如果同时记账的话,必然会导致账本的不一致。
因此,需要有共识机制来达成哪个节点有权记账。
比特币系统设计了以每个节点的计算能力(即“算力”)来竞争记账权的机制。
然而,在一个去中心化的系统中,谁有权判定竞争结果呢?
比特币系统是通过工作量证明(ProofofWork,POW)机制完成的。POW就是一份确认工作端做过一定量工作的证明。
POW的主要特征是计算的单向性:
工作端需要做一定难度的工作得出一个结果;
验证方却很容易通过结果来检查工作端是不是做了相应的工作。
比特币系统中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币系统出的难题(也就是要完成一定量的工作),难题的3个关键要素是:工作量证明函数、区块和难度值。
比特币系统中使用的工作量证明函数是SHA-256。比特币系统的区块由区块头及该区块所包含的交易列表组成。比特币系统的难度值由区块哈希值的前导0个数决定,要求前导0的个数越多代表难度值越大。
比特币POW的过程,可以简单理解成就是将不同的nonce值作为输入,尝试进行SHA-256哈希运算,找出满足给定数量前导0的哈希值的过程。
比特币系统的难度值被设定在无论节点计算能力如何,新区块产生速率都保持在每10分钟一个。
比特币的工作量证明,就是俗称“挖矿”所做的主要工作。
因为哈希函数是单向函数,根据随机数计算哈希值很容易,但是由哈希值倒推随机数在计算上是不可能的,因此可以认为,得到小于等于目标难度值的哈希结果,很大概率上是通过计算(即完成工作)获得的。
为什么前导0个数可以作为难度值?
打个比方,重复N次(N趋近于无穷大)掷一个六面的骰子,每掷一次就可以掷出一个6(包含6)以下的数字,但是如果要想掷出3以下的数字,取得每个结果时平均雪要掷2次