当前位置:首页 » 区块链精品文章 » 正文

5.2 PoW机制

1644 人参与  2018年09月30日 14:46  分类 : 区块链精品文章  评论

比特币系统的重要概念是一个基于互联网的去中心化账本,即区块链,每个区块相当于账本页,区块中记录的信息主体,即为 相应的交易内容。账本内容的唯一性要求记账行为是中心化的行为,然而,中心化所引发的单点失败,可能导致整个系统面临危机甚至崩溃。去中心记账可以克服中 心化账本的弱点,但同时也会带来记账行为的一致性问题。

从去中心化账本系统的角度看,每个加入这个系统的节点都要保存一份完整的账本,但每个节点却不能同时记账,因为节点处 于不同的环境,接收到不同的信息,如果同时记账的话,必然会导致账本的不一致,造成混乱。因此,需要有共识来达成哪个节点有权记账。比特币区块链通过竞争 记账的方式解决去中心化的记账系统的一致性问题。

比特币系统设计了以每个节点的计算能力即“算力”来竞争记账权的机制。在比特币系统中,大约每10分钟进行一轮算力竞赛,竞赛的胜利者,就获得一次记账的权力,并向其他节点同步新增账本信息。

然而,在一个去中心化的系统中,谁有权判定竞争的结果呢?比特币系统是通过一个称为“工作量证明”(Proof of Work,PoW)的机制完成的。

简单地说,PoW就是一份确认工作端做过一定量工作的证明。PoW系统的主要特征是计算的不对称性。工作端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查工作端是不是做了相应的工作。

举个例子,给定字符串“blockchain”,我们给出的工作量要求是,可以在这个字符串后面连接一个称为 nonce的整数值串,对连接后的字符串进行SHA256哈希运算,如果得到的哈希结果(以十六进制的形式表示)是以若干个0开头的,则验证通过。为了达 到这个工作量证明的目标,我们需要不停地递增nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,需要经过2688次计算才能找到前 3位均为0的哈希值,而要找到前6位均为0的哈希值,则需进行620969次计算。

blockchain1 →
4bfb943cba9fb9926df93f33c17d64b378d56714e8a29c6ba8bdc9690cea8e27  
blockchain2 →
01181212a283e760929f6b1628d903127c65e6fb5a9ad7fe94b790e699269221 ……blockchain515 →
0074448bea8027bebd6333d3aa12fd11641e051911c5bab661a9b849b83958a7……blockchain2688 →
0009b257eb8cf9eba179ab2be74d446fa1c59f0adfa8814260f52ae0016dd50f……blockchain48851: 00000b3d96b4db1a976d3a69829aabef8bafa35ab5871e084211a16d3a4f385c……blockchain6200969: 000000db7fa334aef754b51792cff6c880cd286c5f490d5cf73f658d9576d424


通过上面这个计算特定SHA256运算结果的示例,我们对PoW机制有了一个初步的理解。对于特定字符串后接随机 nonce值所构成的串,要找到这样的nonce值,满足前n位均为0的SHA256值,需要多次进行哈希值的计算。一般来说,n值越大,需要完成的哈希 计算量也越大。由于哈希值的伪随机特性,要寻找4个前导0的哈希值,预期大概要进行216 次尝试,这个数学期望的计算次数,就是所要求的“工作量”。

比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的PoW问题。这道题关键的3个要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题所需要的计算量。

1.工作量证明函数

比特币系统中使用的工作量证明函数是SHA256。

SHA是安全哈希算法(Secure Hash Algorithm)的缩写,是一个密码哈希函数家族。这一组函数是由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布的,主要 适用于数字签名标准。SHA256就是这个函数家族中的一个,是输出值为256位的哈希算法。到目前为止,还没有出现对SHA256算法的有效攻击。具体 见第4章的讲解。

2.区块

比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区 块的哈希值、32字节的Merkle根哈希值、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成。区块包含的交易列表则附加在区块头 后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。

区块的大致结构如图5-2所示。

image.png

图5-2 区块的结构

拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。因此,为了使区块头能体现区块所包含的所有交 易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle树算法生成Merkle根哈希值,并以此作为交易列表的哈希值存到区块头中。其 中Merkle树的算法图解如图5-3所示。

image.png

图5-3 带4个交易记录的Merkle树根哈希值的计算

图5-3展示了一个具有4个交易记录的Merkle树的根哈希值的计算过程。首先以这4个交易作为叶子结点构造一棵完全二叉树,然后通过哈希值的计算,将这棵二叉树转化为Merkle树。

首先对4个交易记录:Txa~Txc,分别计算各自的哈希值HA ~HC ,然后计算两个中间节点的哈希值HAB =Hash(HA +HB )和HCD =Hash(HC +HD ),最后计算出根节点的哈希值HABCD =Hash(HAB +HCD )。

而构造出来的区块链呈现如图5-4所示。

image.png

图5-4 区块链的简化结构

由图5-4所示的简化的区块链结构,我们可以发现,所有在给定时间范围需要记录的交易信息被构造成一个Merkle 树,区块中包含了指向这个Merkle树的哈希指针,关联了与该区块相关的交易数据,同时,区块中也包含了指向前一区块的哈希指针,使得记录了不同交易的 单个区块被关联起来,形成区块链。

3.难度值

难度值是比特币系统中的节点 在生成区块时的重要参考指标,它决定了节点大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网 算力条件下,新区块的产生都基本保持这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论节点计算能力如何,新区块产生速率都 保持在每10分钟一个。

难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是 由最新2016个区块的花费时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际 时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

这个公式可以总结为如下形式:

新难度值=旧难度值×(过去2016个区块花费时长/20160分钟)

工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:

目标值=最大目标值/难度值

其中最大目标值为一个恒定值:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

4.PoW的过程

比特币PoW的过程,可以简单理解成就是将不同的nonce值作为输入,尝试进行SHA256哈希运算,找出满足给定数量前导0的哈希值的过程。而要求的前导0的个数越多,代表难度越大。比特币节点求解工作量证明问题的步骤大致归纳如下:

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

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

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

比特币的工作量证明,就是俗称“挖矿”所做的主要工作。理解工作量证明机制,将为我们进一步理解比特币区块链的共识机制奠定基础。

5.基于PoW的共识记账

我们以比特币网络的共识记账为例,来说明基于PoW的共识记账过程。

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

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

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

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

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

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

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

6.关于比特币PoW能否解决拜占庭将军的问题

关于比特币PoW共识机制能否解决拜占庭将军问题一直在业界有争议。2015年,Juan Garay对比特币的PoW共识算法进行了正式的分析,得出的结论是比特币的PoW共识算法是一种概率性的拜占庭协议(Probabilistic BA)。Garay对比特币共识协议的两个重要属性分析如下。

1)一致性(Agreement)

在不诚实节点总算力小于50%的情况下,同时每轮同步区块生成的几率很少的情况下,诚实的节点具有相同的区块的概率很高。用数学的严格语言说应该是:当任意两个诚实节点的本地链条截取K个节点,两条剩下的链条的头区块不相同的概率随着K的增加呈指数型递减。

2)正确性(Validity)

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

因此可以看到,当不诚实的算力小于网络总算力的50%时,同时挖矿难度比较高,在大约10分钟出一个区块情况下,比特 币网络达到一致性的概念会随确认区块的数目增多而呈指数型增加。但当不诚实算力具一定规模,甚至不用接近50%的时候,比特币的共识算法并不能保证正确 性,也就是,不能保证大多数的区块由诚实节点来提供。

因此,我们可以看到,比特币的共识算法不适合于私有链和联盟链。其原因首先是它是一个最终一致性共识算法,不是一个强一致性共识算法。第二个原因是其共识效率低。提供共识效率又会牺牲共识协议的安全性。

另一方面,比特币通过巧妙的矿工奖励机制来提升网络的安全性。矿工挖矿获得比特币奖励以及记账所得的交易费用使得矿工 更希望维护网络的正常运行,而任何破坏网络的非诚信行为都会损害矿工自身的利益。因此,即使有些比特币矿池具备强大的算力,它们都没有作恶的动机,反而有 动力维护比特币的正常运行,因为这和它们的切实利益相关。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1019

区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>

网站分类

标签列表

最近发表

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

本站资源大部分来自互联网,版权归原作者所有!