【链块技术 04期】共识机制:POW

比特币系统是一个基于互联网的去中心化账本。

从去中心化账本系统的角度看,每个加入这个系统的节点都要保存一份完整的账本,但每个节点却不能同时记账,因为节点处于不同的环境,接收到不同的信息,如果同时记账的话,必然会导致账本的不一致。

因此,需要有共识机制来达成哪个节点有权记账。

比特币系统设计了以每个节点的计算能力(即“算力”)来竞争记账权的机制。

然而,在一个去中心化的系统中,谁有权判定竞争结果呢?

比特币系统是通过工作量证明(ProofofWork,POW)机制完成的。POW就是一份确认工作端做过一定量工作的证明。

POW的主要特征是计算的单向性:

工作端需要做一定难度的工作得出一个结果;

验证方却很容易通过结果来检查工作端是不是做了相应的工作。

比特币系统中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币系统出的难题(也就是要完成一定量的工作),难题的3个关键要素是:工作量证明函数、区块难度值。

比特币系统中使用的工作量证明函数是SHA-256。比特币系统的区块由区块头及该区块所包含的交易列表组成。比特币系统的难度值由区块哈希值的前导0个数决定,要求前导0的个数越多代表难度值越大。

比特币POW的过程,可以简单理解成就是将不同的nonce值作为输入,尝试进行SHA-256哈希运算,找出满足给定数量前导0的哈希值的过程。

比特币系统的难度值被设定在无论节点计算能力如何,新区块产生速率都保持在每10分钟一个

比特币的工作量证明,就是俗称“挖矿”所做的主要工作。

因为哈希函数是单向函数,根据随机数计算哈希值很容易,但是由哈希值倒推随机数在计算上是不可能的,因此可以认为,得到小于等于目标难度值的哈希结果,很大概率上是通过计算(即完成工作)获得的。

为什么前导0个数可以作为难度值?

打个比方,重复N次(N趋近于无穷大)掷一个六面的骰子,每掷一次就可以掷出一个6(包含6)以下的数字,但是如果要想掷出3以下的数字,取得每个结果时平均雪要掷2次才行;

也就是说,掷出“3以下(含3)”比掷出“6以下(含6)”要难一倍,需要多做一倍的“工作量”。

如果定义“6以下”这个规则的难度系数(困难度)为“1”,那么,“3以下”这个规则的难度系数为“2”,意味者要想符合规则要求,需要2倍的工作量;“1以下“的难度系数则为6,意味着该规则需要6倍的工作量。

比特币难度值如何更新?

比特币协议中,规定一个256位的整数,为难度“1”,如下:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

在当时的全网算力下大约需要10分钟左右的哈希计算工作量才可以满足这一规则(挖矿的哈希值小于等于这个数)。

如果想确保10分钟这个工作时间恒定,那么当算力提高n倍时,需要把难度值也调高n倍。

比特币系统每2016个区块更新一次难度值,其难度值更新的算法如下:

【new_target】=【prev_target】*【前2015个区块生成所用的时间】/1209600

其中,1209600为按标准每10分钟出一个块、出2016个块所需要的秒数。

POW的基本过程

比特币节点求解工作量证明问题的步骤大致归纳如下:

  • 1. 生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法生成Merkle根哈希;

  • 2. 把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入;

  • 3. 不停地变更区块头中的随机数,即nonce的数值,并对每次变更后的区块头做双重SHA-256运算,将结果值与当前网络的目标难度值做对比,如果小于目标值,则解题成功,工作量证明完成。

值得一提的是:比特币系统的默克尔树记录当前区块的交易;以太坊的默克尔树记录全量的交易,账本每次只记录变更的区块链的值,需要全网回溯得到某个账户中的币值。

基于POW的共识记账

下面,以比特币系统的记账过程为例,说明基于POW的共识记账步骤

  • 1. 客户端产生新的交易,向全网进行广播要求对交易进行记账;

  • 2. 每一个记账节点一旦收到这个请求,将收到的交易信息纳入一个区块中;

  • 3. 每个记账节点都通过POW过程,尝试在自己的区块中找到一个具有足够难度的工作量证明;

  • 4. 当某个节点找到了一个工作量证明,它就向全网进行广播;

  • 5. 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;

  • 6. 其他节点标识它们接受该区块,而表示接受的方法则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机哈希值视为先于新区块的随机哈希值。

比特币系统中限定区块大小为1MB,每一区块需要6次确认后,区块包含的交易才被确认。

通过上述的记账过程,客户端所要求记录的交易信息被写入了各个记账节点的区块链中,形成了一个分布式的高概率的一致账本。

关于分叉

比特币系统采用的基于POW共识机制,就是让矿工互相竞争求解一个数学题,谁先解出来了,他就把自己成功的消息广播出去,全体矿工就都过来把那一页目抄写一份,贴在自己账本的最后面,然后又开始新的记账过程。

在这个过程中,经常会出现这样一种情况:两个矿工同时解出了题目

由于每个矿工的区块数据都不一样,所以他们解题得出的结果也是不一样的,都是正确答案,只是区块不同。

于是,区块链在这个时刻,出现了两个都满足要求的不同区块。由于距离远近,不同的矿工看到这两个区块是有先后顺序的。

通常情况下,矿工们会把自己先看到的区块复制过来,然后接着在这个区块开始新的挖矿工作。

于是,出现了这样的情景,我们把这种现象叫做分叉

这时要怎么办呢?

在以POW为共识算法的区块链系统中,这个问题是这样被解决的:

从分叉的区块起,由于不同的矿工跟从了不同的区块,在分叉出来的两条不同链上,算力是有差别的,因此两条链的增长速度也是不一样的,在一段时间之后,总有一条链的长度要超过另一条。

当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条长链的基础上继续挖矿。

所有矿工都这样操作,这条链就成为了主链,分叉出来被抛弃掉的链就消失了。

注意,能够让区块链保证数据唯一性的前提是:所有矿工都遵从同样的机制。

还有一种情况,就是矿工不遵从同样的机制,那么也会出现分叉。这种分叉又有两种情况

  • 一是由于整个区块链系统软件的升级一部分矿工没有来得及升级,出现了遵从不同机制产生的分叉。当这部分矿工升级系统后,这个分叉就会消失,我们称这种分叉为软分叉

  • 二是由于矿工之间出现分歧,一部分矿工决定采用不同的机制,产生出来的分叉是不会消失的。我们一般把这种分叉称为硬分叉

比特币系统中,一个交易不能算作确认直到:

  • 1. 它存在于最长的分支中的区块链里;

  • 2. 至少有5个验证过的区块在其后面得到验证。这种情况,我们说这个交易有了“6个确认”。

基于POW的共识机制算法分析

  • 优点

    1. 算法简单,容易实现;

    2. 节点间无需交换额外的信息即可达成共识;

    3. 破坏系统需要投入极大的成本,允许全网50%节点出错。

  • 缺点

    1. 浪费能源,依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机制高、可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低;

    2. 区块的确认时间难以缩短;

    3. 新的区块链必须找到一种不同的散列算法,否则就会面临比特币网络的算力攻击;

    4. 容易产生分叉,需要等待多个确认;

    5. 永远没有最终性,需要检查点机制来弥补最终性。

基于POW的共识机制能否解决拜占庭问题?

2015年,JuanGaray对比特币的POW共识算法进行了正式的分析,得出的结论是:

比特币的POW共识算法是一种概率性的拜占庭协议

1. 一致性

在不诚实节点总算力小于50%、同时挖矿难度较高(大约10分钟出一个区块)的情况下,诚实的节点具有相同的区块的概率很高。

2. 正确性

大多数的区块必须由诚实节点提供。严格来说,当不诚实算力非常小的时候,才能使大多数区块由诚实节点提供。

3. 安全性

恶意节点需要获得全网50%以上的算力,高昂代价保证节点无作恶动机。另外,比特币通过巧妙的矿工奖励机制来提升网络的安全性。

矿工挖矿获得比特币奖励以及记账所得的交易费用使得矿工更希望维护网络的正常运行,而任何破坏网络的非诚信行为都会损害矿工自身的利益。

因此,即使有些比特币矿池具备强大的算力,它们没有作恶的动机,反而有动力维护比特币的正常运行,因为这和它们的切实利益相关。

基于POW的共识算法应用

比特币系统基于POW的共识算法,不适合私有链联盟链。

其原因首先是它是一个最终一致性共识算法,不是一个强一致性共识算法;其次,它的共识效率低,提供共识效率又会牺牲共识协议的安全性。

目前,基于POW的共识机制主要被比特币瑞泰币莱特币等公有链采用。


参考文献:

[1]邹均,张海宁等.区块链技术指南[M].北京:机械工业出版社,2017

本文作者:魏红心,链块学院执行院长,清华大学电子系博士

链块学院:专注于区块链技术研发与教育


--------------END--------------

本文完,获取更多资讯,敬请关注区块链工程师。

猜你喜欢

转载自blog.csdn.net/liankuaixy/article/details/79820524