第一节 比特币—PoW
一、拜占庭将军问题与工作量证明机制
拜占庭将军问题是Lesile Lamport于1982年提出的一个共识问题,也是一个典型的分布式节点传输所碰到的问题。就像前文所提到的那样,区块链网络事实上就是一个由点对点传输所连接起来的共享账本,其结构类似于分布式数据库,但是比一般的分布式数据库更为分散。网络上的每一个参与者的计算机都会有一份总账的备份,并且所有的备份都是在实时、持续地更新、对账,以及同步着的。每一个参与者都能在这本总账里记上一笔,每一笔记录都包含着一定时间内的信息,并且每一条这样的记录都实时地被广播到整个网络上。所以在每一台计算机上的每一份拷贝几乎都是同时更新的,并且所有的总账拷贝都保持着同步。但这里的问题是,谁在总账里有更新记录的权力,如果每个节点都更新对自己有利的信息,哪一个才是大家该去相信的?这个问题就和拜占庭将军问题如出一辙。
下面讲一个故事。想象一下,在古代有一个墙高壁厚的城邦,拜占庭城城邦,高墙之内是它的邻居们想象不到的巨额财富。它被其他十个城邦所环绕,这十个城邦也很富饶,但和拜占庭城城邦相比就微不足道了。它的十个邻居都觊觎拜占庭城的财富,并希望侵略并占领它。
但是,拜占庭城的防御是如此强大,没有一个相邻的城邦能够成功入侵。任何单个城邦的入侵行动都会失败,而入侵者的军队也会被歼灭,使得其自身容易遭到其他九个城邦的入侵和劫掠。这十个城邦之间也互相觊觎对方的财富并持续互相对抗着。而且,拜占庭城的防御如此之强,强到需要十个邻邦的一半以上同时进攻才能攻破它。
也就是说,如果六个或者更多的相邻城邦的军队一起进攻,他们就会成功攻破城墙并获得拜占庭城的财富。然而,如果其中有一个或者更多背叛了其他人,答应一起入侵但在其他人进攻的时候又不干了,也就导致只有五支或者更少的军队在同时进攻,那么所有的进攻军队都会被歼灭,并随后被其他没进攻的,或是开始宣称进攻却最终背叛了他们的那(几)个邻居所掠劫。这是一个由不互相信任的各方构成的网络,但他们又必须一起努力以完成共同的使命。
而且,邻居之间通报和协调进军时间的唯一途径是通过骑马在他们之间传递信息。他们不能聚在一个地方开个会,因为所有的王都不互相信任他们的安全在自己的城堡或者军队范围之外能够得到保障。然而,他们可以在任意时间以任意频率派出任意数量的信使到任意的对方。每条信息都包含类似如下的内容:“我将在第四天的6点钟进攻,你愿意加入吗?”
如果收信人同意了,他们就会在原信上附上一份签了名、盖了图章的回应,然后把这份盖章验证了的信息的拷贝再次发送给另外九个邻居,要求他们也这样做。最后的目标是,通过在原始信息链上盖上他们所有十个人的图章,让他们在时间上达成共识。最后的结果是,会有一个盖有十个同意在同一时间进攻图章的完整信息链,当然可能还会有一些因为没有盖全图章而被抛弃了的不完整的信息链。但是,问题在于如果每个城邦向其他九个城邦派出一名信使,或者说就是十个城邦都派出了九名信使,也就是在任何一个时间有总计90次的传输,并且每个城市分别收到九条信息,可能每条信息都写着不同的进攻时间。除此以外,部分城邦会答应超过一个的攻击时间,故意背叛发起人,所以这些叛徒会选择向其他城邦广播超过一条的信息链,于是这个系统会迅速变质成不可信的信息和攻击时间相互矛盾的纠结体。
上面的故事就如同区块链共享账本的更新情况一样,每个节点都能选择同意别的节点发起的信息请求并验证后进行传递,当然,他们也可以选择不同意或者自己再重新发起一个信息给其他节点请求同意。整个网络需要达到的最终目的就是共同同意某一个信息并将它更新到共享账本上,但从拜占庭将军问题上来看,这似乎极度困难。于是区块链通过一种共识机制来解决这个问题,在比特币的区块链中所使用的共识机制是工作量证明(PoW)。
工作量证明实际上就是为信息的传递加入了成本要素,从而降低信息传递的速率,并加入一个随机元素以保证在一个时间段内只有一个城邦或者节点可以有权进行信息广播。这个随机元素就是让节点去计算一个随机哈希算法,它唯一做的事情就是获得一些输入数据然后进行计算并得到一串64位的随机数字和字母的字符串,就像这个:f9584991005d460279e50ee218370303f849feae2b4e1230c59d5d079dc8f6f6用于计算这一字符串的输入数据包含了当前时间点整个区块链的数据或者说整个共享账本,并且尽管单个一般的哈希值用现在的计算机可以几乎即时地计算出来,但只有一个前13个字符是0的哈希值结果可以被比特币区块链系统接受成为工作量证明。这样一个13个0的哈希值是极其罕见的,并且在当前需要花费整个比特币区块链网络大约10分钟的时间才能找到一个。在一台区块链网络节点上的计算机能随机地找到一个有效哈希值之前,上十亿个的无效值会被计算出来,这就是减慢信息传递速率并使得整个系统可用的“工作量证明”。下面是三串无效值的例子:
5e07dc69c30403753c43545588b6a775f0a7e69f10a92ff8180199def6fb7415
f9584991005d460279e50ee218370303f849feae2b4e1230c59d5d079dc8f6f6
7dfe2460fc542d70c98acd39d586671d467a01833ad589f050d728cc0bdcccd8在找到一个有效值之前,成百万上亿个更多的类似上面这样的字符串会被计算出来:0000000000000000028ca6ba75ab59da9f0c0ca78c79c84557c03251f0889972那台发现像上面这一行一样的有效哈希值的机器(或者说在前面故事中的城邦),把所有的它所接收到的信息放到一起,并附上自己的信息,以及自己的签名、图章,并向网络中的其他机器广播出去。只要其他网络中的机器接收到并验证通过了这个13个0的哈希值和附着在上面的信息(哈希算法的反向验证有效值的速度远远快于计算出它),一个新的区块就产生了,它们就会停止自己当下的计算,使用新的区块内的信息更新它们的共享账本或者说区块链拷贝,然后把新更新的账本作为下一个哈希算法的输入,再次开始计算哈希值。哈希计算竞赛从一个新的开始点重新开始。如此这般,网络持续同步着,所有网络上的计算机都使用着同一版本的总账。
与此同时,每一次成功找到有效哈希值以及区块链更新的间隔大概是10分钟(这是故意的,算法难度每两周调整一次以保证网络一直需要花费10分钟来找到一个有效的哈希值)。在那10分钟以内,网络上的参与者发送信息并完成交易,并且因为网络上的每一台机器都使用同一个共享账本,所有的这些交易和信息都会进入遍布全网的每一份账本拷贝。当区块链更新并在全网同步之后,所有在之前10分钟内进入区块链的交易也被更新并同步了。因此分散的交易记录是在所有的参与者之间进行对账和同步的。
最后,在个人向网络输入一笔交易的时候,他们使用内嵌在比特币客户端的标准公钥加密工具来通过他们的私钥以及接收者的公钥为这笔交易签名。与之相对应的就是拜占庭将军问题中城邦将军们用来签名和验证消息时所使用的“图章”。因此,哈希计算速率的限制,加上非对称加密,使得一个不可信网络变成了一个可信的网络,使得所有参与者都可以在某些事情上达成一致(比如说攻击时间、一系列的交易、域名记录、政治投票系统,以及任何其他的需要分布式协议的地方)。
反观区块链的解决方案,实际上是将拜占庭将军问题中十个邻邦之间因无法达成共识而产生的不完整的信息链转化成为哈希算法中算得的无效值,通过将无效过程内化到每个节点的自身计算上来减去节点之间无效信息传输的压力。同时工作量证明的哈希算法还通过将每一个新生区块中的信息作为下一次哈希计算的输入值的方式,实现了历史信息的串联,形成了可追溯的链条。就像拜占庭城外十个邻邦中的将军都努力地通过总结拜占庭城的发展历史来研究进攻的战术,其中关于拜占庭城的最新消息也不断地在邻邦之间被传递,但只有最优秀的那一位将军才能够总结出最高效的战术,并将所有他收集到的拜占庭城的信息结合他的战术及攻城计划发布给其他邻邦。其他九个邻邦能轻易地将接收到的战术与拜占庭城的历史资料相对比,从而验证出战术的真实性、有效性并达成共识。当然,那位贡献卓绝的将军应得到更多的战利品,而在比特币的区块链中,那就是计算出新的有效哈希值时所获得的比特币。
二、比特币工作量证明原理
比特币最大的成功之处,在于它解决了一个无国界数字化货币长期以来存在的问题:在没有政府或者中央银行的情况下,如何实现货币交易的追踪,并且防止欺诈行为的出现。
针对这两个问题,中本聪在自己的论文中提供了两套解决方案。一是在网络上建立共享的公共账目,从而对比特币交易进行验证。一旦有比特币在系统中被交易,所有运行比特币交易的人都会第一时间知道这笔交易。二是构建挖矿模式,通俗来讲,挖矿就是利用硬件设备计算SHA256算法的数学难题,确认网络交易,保证整个网络系统的安全,比特币系统会根据矿工贡献算力的大小给予一定的比特币奖励。挖矿的用户需要运行一种高度专业化的比特币软件,通过解决系统中的数学问题来获得比特币,而系统中的数学问题每小时都会被重置。
中本聪在创建比特币时,还需要解决三个核心问题。第一,交易确认。利用互联网P2P协议,防止货币的重复支付,即防止造假币。第二,比特币的发行问题。第三,保护比特币系统不受恶意攻击。通过他的论文我们可以发现,中本聪设计的比特币,通过挖矿、记账、算力保护,从而“一石三鸟”地解决了上述三个核心问题。
首先,中本聪为比特币定制了一套专门的挖矿算法——SHA256加密算法,正是基于这种十六进制的加密算法,比特币的数量问题得到解决。
先让我们先来了解一下SHA256加密算法:安全散列算法SHA,英译为Secure Hash Algorithm,是由美国国家安全局设计的。美国国家标准与技术研究院发布的一系列密码散列函数,包括SHA1、SHA224、SHA256、SHA384和 SHA512等变体,是一类主要适用于数字签名标准里面定义的数字签名算法,而SHA256加密算法是最适用于比特币的一系列算法。
中本聪在他最原始的比特币论文中写道:“工作量证明过程包括扫描SHA256的哈希数由多少个0开头,每增加一个0,平均工作量都会有指数级的增加,就是24,增加了多少个零就是多少个24乘在一起的倍数的工作量增加,这些将在解一个哈希数,也就是挖一个比特币区块过程中得到证明。”
比特币系统就是靠对于挖矿的哈希值前面加零来控制挖币的总量,不管全网算力如何增加,都能通过在哈希值前面加零来保证平均每十分钟每个区块目前都只能挖出12.5个币,这样建立制度,就自然解决了第二个问题,即比特币发行的问题。
那么比特币是怎样利用密码学挖矿系统来防止重复支付呢?靠挖矿的计算机算力来同时“记账”和盖时间戳,每十分钟挖出一个区块,必须记录这十分钟全网的比特币交易和给每一个交易盖上时间戳,每一笔交易必须通过全网产生区块的节点六次确认,才能算合法交易,这样一个庞大的记账和盖时间戳系统,保证了重复支付的不可行。所以,整个比特币系统的挖矿,既保证了比特币的正常发行,也保证了它的记账,从而避免了重复支付的可能。
第三个问题,即保护比特币系统不受恶意攻击的问题。所谓挖矿的矿工,也就是记账员,其实矿工对于比特币世界还有一个重要的功能就是保护,按照中本聪最初的比特币系统协议,必须持有全网51%算力的人,才有可能攻击比特币系统,并造成重复支付,也就是造假币。据比特币资深挖矿人士透露,当前算力成本每年维持1THash/s约需要2500元人民币,即现在比特币全网算力的年成本约540亿元人民币,这是保护比特币系统的基础力量,也是它现有价值的支撑。
三、全网共识下区块链的延长
PoW共识机制之下,比特币的区块链延长依赖于算力的持续输出,约每10分钟全球比特币网络都会根据新发现的区块达成一次共识。
由于区块链使用的是点对点网络传输机制,因此一个新的区块链的发现将由近及远地被广播到全球其他区块链节点。但比特币中仅对新区块的区块头格式有所限定,并不限制具体答案,因此会出现全球不同地方的节点几乎同时算得了新区块中的有效区块头数值。
由于传播的先后关系,全球的比特币区块链节点被分裂成了两个阵营。这个时候的状况就是区块链的分叉,相当于全网络在这一时间段形成了两个不同的认识。各个节点在各自的认识基础上会马上进入计算下一个有效区块的流程当中,从而抢夺下一个区块的奖励。这时,若原本在某个区域的节点算出了有效区块,会向全网广播。
PoW工作量证明机制的原理就在于算法中要求了所有参与者通过贡献算力来竞争记账权,而最终的共识来自对最长链的认可。因此,即使出现了分叉也并不会持续存在,从而确保了共识机制的长期稳定。






本书评论