@hitchhacker
2018-06-15T21:09:50.000000Z
字数 2474
阅读 1812
要想清楚的了解 PoW 工作量证明算法和基于该算法的共识机制,无需查看多余的资料,只要追本溯源,仔细阅读比特币白皮书即可。
事实上,白皮书的2-5章节就是一个入门版的比特币系统框架的介绍了:
第四节 工作量证明
为了在点对点的基础上完成一个分布式时间戳服务器,我们需要使用一个类似于类似于Adam Back 提出的哈希现金(Hashcash)的工作量证明系统,而不是以前的新闻组及论坛的机制。「工作量证明」牵涉到对一个值的搜寻。这个值用SHA-256等算法进行hash操作后,得到的hash值从一定数量的0字节开始。搜寻这个值的平均工作量随着0字节的增加呈现指数级增长,但是校验这个值只需要执行一次hash操作。
为了时间戳服务器网络的运行,我们实施了这样一种工作量证明机制——找到一个被称为Nounce的随机数,找到后在区块中增加它。 Nounce能让区块的hash值以一连串所需数量的0字节开头。CPU不断运算,直到完成了一个「工作量证明」。那时,这个区块将不能被修改,除非重新完成这个工作量。当之后的区块链接到这个区块后,改变这个区块要做的工作还包括重做(redo)这个区块之后的所有区块。
这个工作量系统也解决了集体决策谁代表大多数的问题。如果大多数是基于一个IP一个投票权的话,这个系统能被分配了大量的IP地址的人破坏。工作量证明本质上来说是「一个CPU一个投票权」。大多数的决策被最长的链条所代表,也代表了最大的「工作量证明」的结果的投入。如果绝大多数CPU算力被诚实的节点所控制,那么最诚实的链会增长得最快,同时超过所有和它竞争的链。为了修改过去的区块,一个攻击者将不得不把块和之后所有的块里所有的工作量重做,然后追上并超过诚实节点的工作。我们将在之后证明,随着随后的区块被添加,一个较慢的攻击者赶上的成功概率将呈指数化递减。
为了补偿硬件运算速度的增长,及节点参与网络的程度的起伏,工作量证明的难度取决于一个移动的均数——每小时产生的平均区块数量。如果产生得太快,那么难度就会增加。
(1) Nounce的概念
区块中一个32位(4字节)的字段,有了这个字段,区块的hash值会包含一连串的0。这个字段和其它字段是独立的,也即不会影响到其它的字段。
(2)Nounce代表了算力,挖矿挖的就是Nounce
找到这个值需要消耗算力进行大量的随机碰撞,因此这个值可以用来衡量算力。而我们熟知的「挖矿」,挖的就是这个Nounce。
(3)控制「找到Nounce」的难度
为了确保固定10分钟生成一个区块,找到Nounce的难度会随着「每小时产生的平均区块数量」而增加。控制难度的方式是——控制区块生成的hash值的开头的0的数量。这就是第二个问题的回答了。
(4)Nounce提供了一种公平性
寻找Nounce的过程童叟无欺,先碰撞到就有,碰撞不到或者后碰撞到就无,所以是一种非常公平的选择区块打包者(Block Producer)的解决方案。正因为这种解决方案是公平的,所以大家愿意相信比特币系统,加入到这个系统中来。
说白了,「共识」就是这么一件事,让区块链网络上的所有节点都一致认同一本「账本」,过程中可能某些节点上会产生短暂的分叉,但是最终一定要回归一个账本。具体是怎么做到的?这就要看白皮书的第5节Network了。
第五节 网络
运行网络的步骤如下:
1)新的交易广播给全节点。
2)每一个节点将新交易收集到一个区块内。
3)每个节点为它的区块寻找到一个具有足够难度的工作量证明。
4)当节点找到了这个「工作量证明」的时候,它将这个区块广播给所有的节点。
5)仅当区块中所有的交易都是有效的且之前未存在过时,所有的节点接受该区块。
6)所有的节点表示接受该区块的方式是——在链上创造下一个区块,将已接受的区块的hash值作为前一个hash值(hashPrevBlock)。
节点总认为最长的链即是正确的那一个,同时将对它进行延长。假如两个节点同时广播下一个区块的不同版本,有一些节点将会比另一个更早的接收其中一个。在这种情况下,它们在第一个接收到的节点的基础上进行工作,但是保存另一个分支,以防另一个分支变得更长。当下一个「工作量证明」被找到,一个分支变得更长时,僵局会被打破——那些曾经在某分支上工作的节点会转而选择更长的那个。
「新交易的广播」没有必要到达所有的节点。只要交易信息能够抵达足够多的节点,那么它们将很快被整合进一个区块中。区块广播对于丢失的信息具有一定的容错度。如果一个节点没有接收到区块A,当它接收到下一个区块,然后发现自己漏掉了区块A时,也可以自己提出下载区块A的请求。
(1)假设一个网络中存在ABCD四个节点。
(2)发生了三笔交易,交易被广播给ABC三个节点。但是节点D现在不在线,所以没有接收到~
(3)ABC三个节点开始「挖矿」,也就是寻找Nounce啦。
(4)节点A率先找到了Nounce,将区块成功打包。
(5)节点A将打包好的区块广播给其它节点。
(6)其它节点确认没有「双重支付」等问题后接受该区块,接受的方式为链上这个区块后再在这个区块后链一个区块(后一个区块在图上标记为区块4)。
(7)D节点上线了。这时候C节点向D节点发送区块4的时候,D节点会发现少了一个区块,它便向其它节点请求:「给我那个漏掉的区块!」
(8)特殊情况!如果同时收到下一区块的两个版本(区块A与区块B),那么选择哪一个区块取决于下下个区块是基于「区块A」的还是基于「区块B」的延长。
比特币系统的共识可以分为「狭义的」和「广义的」。
狭义的指的是节点间保持共识,基于PoW算法和网络机制,确保所有节点认同唯一一本「账本」。
广义的共识不仅包括机器达成的共识,还包括因为这个系统具有透明性、不可篡改性和公平性,人们信赖这个系统,从而愿意加入到这个系统中来,促使这个系统的繁荣。