2.4 奖励机制与工作量证明

在前面的章节里,我们简单了解了比特币的共识算法,以及为什么我们直觉上相信它是安全的。但我们回想在本章一开始谈到的,比特币的去中心化一部分是通过技术手段,另一部分是通过聪明的激励设计来实现的。截至目前,我们主要关注的还是技术手段。现在,我们来讨论比特币的这个激励设计。

之前我们试图大胆相信这样的假设,在我们随机选取节点时,至少有50%的可能会选中诚实节点,这或许是有问题的。如果对颠覆这个过程的参与者有金钱奖励,这个关于诚实的假设就格外成问题,这种情况下我们无法真的假设某个节点是诚实的。所以这个问题变成了:我们是否可以给予表现诚实的节点奖励?

我们再思考下一个确认以后的双重支付尝试(见图2.3)。我们是否可以惩罚那个创建包含双重支付区块的节点?好吧,其实不行。就像我们前面说的,因为我们无法判断哪笔交易是道义上合法的。即使我们知道,我们也很难惩罚它们,因为节点没有身份。那我们反过来思考,我们是否可以奖励那些创造的区块最终被放入长期共识区块的节点?然而,同样因为这些节点并没有透露它们真实世界中的身份,我们不可能给他们的家庭地址寄去现金。要是有某种可以代替的数字货币……你大概猜到该怎么做的。我们可以用比特币来奖励创造这些区块的节点。

让我们暂停一下。之前,我们讨论的都是用抽象的算法来实现分布式共识,并不是针对某个具体的应用。我们现在要跳出模型,使用事实,我们建立这个分布式共识过程的应用实际上就是一种货币。明确地说,我们要以这种货币为单位奖励那些表现诚实的节点。

区块奖励

这是怎么做到的?比特币里有两种不同的奖励机制。其中一个就是区块奖励。根据比特币的规则,创建区块的节点可以在这个区块中加入一笔特别的交易。这笔交易就是一个造币的交易,类似于财奴币里面的造币,节点可以指定这笔交易的接收地址。当然,节点通常都会选择一个属于自己的地址。你可以把这视为对节点在共识链上进行创建区块服务的报酬。

在写本书时,区块奖励金额定在25个比特币。但每生成210 000个区块,金额就会减半。根据区块生成的速度,我们可以看到,这个金额大概每4年减半一次。我们现在处在第二个4年。比特币存在的最初4年,区块奖励金额为50个比特币,现在是25个比特币。然后会不断减半。这将造成一些有意思的结果,我们不久会看到。

你可能会问为什么区块奖励能做到鼓励诚实行为。给予我们目前讨论的,从表面上看,这个节点无论提议一个正当有效的区块还是恶意伪造,都会受到奖励。但其实并非如此!想一想这个节点是如何收取奖励的?奖励只有当区块最终被纳入长期共识链才会实现。因为造币交易和其他每一笔交易一样,只有当它最终被纳入共识链,才会被其他节点接受。这就是比特币奖励制度的一个关键概念。这是一个十分微妙却十分强大的设计。这个设计激励节点想方设法让其他节点延展它们自己的区块。因此如果网络中大部分节点遵循去延展最长支链的规则,那这样的设计将激励所有节点去遵循这个规则。这就是比特币的第一个奖励机制。

我们前面提到每产生210 000个区块(大约4年),区块奖励将被减半。在图2.4中,曲线的斜率将持续减半。这是一个等比数列,你可能知道数列的总和是有上限的。最终一共是21 000 000个比特币。

注意,这是新比特币被允许创造出来的唯一途径,没有任何其他新增币的机制。所以这是为什么比特币最终的数量是2 100万(至少目前的规则规定是这样)。按照现在奖励发放的速度,到了2140年比特币区块奖励就发完了。这是否意味着这个系统到了2140年就无法继续运行,并且因为不再有奖励诚实行为的激励而变得不安全呢?不是这样的。因为区块奖励只是比特币两种奖励机制之一。

图2.4 比特币的总供应量

注:区块奖励每4年减半一次,限制了比特币的供应上限为2 100万个。这是一个简化的模型,实际中的曲线会有轻微的差异,但都有2 100万的上限限制。

交易费

比特币的第二个奖励机制称为交易费。任何交易的制造者都可以选择让交易输出值比输入值小。第一个创建区块把交易放进区块链的人可以取得这个差额,作为交易费。如果你是一个节点,正在创建一个包含200笔交易的区块,那么这200笔交易的交易费将会被付到你放在区块内的那个地址。这些交易费现在是完全自愿的,但是我们可以预见,随着区块奖励逐渐发完,交易费会变得越来越重要,几乎是必需的,因为用户需要通过交易费来保障合理的服务质量。从某种程度上来说,这已经开始发生。但目前还不清楚这个系统会如何演变——这取决于还并不完善的博弈论的研究与发展。这也是比特币一个很有趣的研究领域。

我们在描述共识机制时还有一些问题没有解答。第一个主要问题是我们要你相信这样的假设:我们能随机选取一个节点。第二个是因奖励那些节点参与而产生的新问题:如果大家都想来分一杯羹成为一个节点来获得这些奖励的话,整个系统会变得不稳定。第三个是第二个问题的复杂版,就是可能会有攻击者创建大量的女巫节点来尝试颠覆整个共识过程。

挖矿与工作量证明

事实证明,这些问题都是相互联系的,所有这些问题都有相同的解决办法——工作量证明(proof of work)。工作量证明的核心理念是,我们把随机选取节点改为根据节点占有某种资源的比例来选取节点,我们希望这种资源是没有人可以垄断的。比如说,如果这个资源是计算能力,那我们称之为工作量证明系统。或者这个资源可以是某种币的拥有量,我们称之为权益证明(proof of stake)。虽然比特币没有使用,但权益证明也是另一种合格的模式,并被其他加密货币所使用。我们将在第8章中更多地讨论权益证明和其他工作量证明的变种。

先回到工作量证明。我们试着更好地理解根据计算能力来选择节点到底是什么意思。换一个角度理解,我们是允许节点用它们的计算能力来互相竞争,导致的结果是计算能力的比例决定了节点被自动选中的概率。工作量证明还有一种理解方式,即我们把制造新身份的难度适度提高了。这就好像是对制造新身份,继而对女巫攻击收税一样。这听起来好像有点模糊,我们接下来看下比特币使用时工作量证明体系的细节,事情就变得清楚多了。

比特币是用哈希函数解谜来证明工作量的。任何一个提议并创建区块的节点想要制造下一块,这个节点必须要找到一个数,或者我们把它称为临时随机数(见第1章1.1节)。当你把这个临时随机数、前序块的哈希值还有要填进这个区块的交易列表连接起来,组成一整串字符,然后用哈希函数计算这一整串字符的输出值,这个输出值正好要落在一个相对于这个哈希函数所有可能的输出中很小的目标区间内。用公式来表示的话,就是临时随机数要满足下面的不等式:

H(nonce‖prev_hash‖tx‖tx‖…‖tx)<target

就像我们前面看到的,通常一个区块会包含这个节点提议的一系列交易。而且,这个区块还会包含一个指向前序区块的哈希指针(我们这里说的哈希指针是一个宽泛的概念。这个指针只是文本中的字符串,它并不需要告诉我们去哪里找到这个区块。我们可以通过在网上询问其他的节点找到区块。重要的是,这个哈希值既作为我们在网络上请求其他节点寻找区块的ID,又能够让获取这个区块后验证它)。除此之外,我们现在还要求区块包含一个临时随机数。这个想法是为了适度提高发现符合要求的临时随机数的难度,即把包含临时随机数在内的整个区块的哈希值组合到一起,输出结果要是一种特定的形式。如果哈希函数符合我们在第1章中所描述的谜题友好特性,那唯一解出哈希谜题的办法就是去试足够多的临时随机数,直到成功为止。具体来说,如果这个目标区域是所有可能的输出的1%,那你大概就要试100次才能成功。事实上,这个目标区域远比输出范围的1%小得多得多,我们后面就能看到。这段话很拗口,也难懂。打个比方,假如你是个炮兵,那些前序区块哈希值加上所有要打包的交易就是炮弹,哈希函数就是大炮,临时随机数就好比瞄准器,你所想击中的目标,比如一个指挥所,它肯定在你能打到的范围内,但非常小,而且其实根本不知道在哪里。击中目标的唯一办法是狂轰滥炸,这就是比特币工作量的概念,炸的越多,击中的概率越高。如果这个指挥所的目标区域是轰击区域1%大的话,你大概平均要发出100枚炮弹才可能击中目标。——译者注

用这种哈希函数解谜以及工作量证明的办法,我们可以完全舍弃采取那种随机选取节点的办法。这些节点在竞争哈希函数解谜的过程中一直都是互相独立的。有时一个节点鸿运当头,正好发现一个临时随机数可以满足要求。这个幸运的节点就可以提议创建下一个区块了。这就是比特币系统实现完全去中心化的方式,没有任何人能决定谁可以提交下一区块。

难于计算

哈希谜题有三个重要的特性。第一个特性是要有一定的难度。我们前面说适度的难度,其实你马上会看到难度实际上是随时间而改变的。在2014年年底,产生一个区块平均要做1020次哈希运算。换言之,目标区域仅仅是整个输出范围的1/1020。这是超大的计算量——举例来说,超过了商业化笔记本电脑可能的计算范畴。因此,只有一些节点还在不厌其烦地竞争造块。这个不停尝试解哈希谜题的过程,就是我们听说的比特币挖矿,参与挖矿的节点被称为矿工。尽管技术上每个人都可以成为矿工,但由于挖矿的高成本导致了挖矿生态系统要消耗大量能源。

可参数化成本

第二个特性是,我们希望成本是可以通过参数来变化的,而不是一个固定值。在比特币的点对点网络里,是这样来达到这一特性的:每产生2 016个区块之后,所有的节点都会自动重新计算目标区域相对于整个输出范围的比例大小,使得后续的区块产生的时间间隔约为10分钟。两个区块之间的平均间隔是10分钟,2 016个区块就需要两个星期。所以大约每两个星期,目标区域的大小会被重新计算一次。

我们想一下这意味着什么。如果你是个矿工,你花了一定的费用投资了一些硬件来做比特币挖矿。但是整个挖矿体系在不断增加,越来越多的矿工加入这个行业,或是他们部署了运算越来越快的硬件设备,那两个星期的时间段里,被找到的区块可能比预期的要多一点。然后,那些节点就会自动调整目标区域,你要找到一个块所要做的工作量就随之增加。所以如果你投了一笔固定资金在硬件上,你找到下一区块的速率实际上取决于其他矿工在做什么。有一个公式可以很好地描述这一点:任何一个矿工,比如爱丽丝,找到下一区块的概率,就相当于她控制的计算力占整个全球计算力的比例。这意味着,如果爱丽丝的挖矿设备的计算能力占全部计算能力的0.1%,那大概每产生1 000个区块,她就可以找到一个区块。

这样重新调整的目的是什么?我们为什么想要维持10分钟间隔不变?原因很简单。如果区块产生的间隔太小,就会造成很多低效率,我们还会失去许多优化上的好处,比如在一个区块内放入大量的交易。10分钟并没有神奇之处,如果把10分钟下调到5分钟大概也可以。关于其他加密货币的理想区块间隔应该是多少,已经有很多讨论。除去关于理想间隔的不同意见,大家都认为应该是个固定的值。它不允许被无限降低。这就是为什么我们有自动重新计算目标区域的特征。

这个成本函数和工作量证明的设定方式,让我们重新审视比特币的安全假设。现在我们终于可以丢弃之前让你盲目相信的假设。不必再去说那些连身份都没有的节点大多数是诚实的了,诚实具体代表什么也并不清楚,我们现在可以清楚地表述,只要以计算能力为权重的大多数矿工,遵循比特币协议,或者说是诚实的,那么比特币中的大量攻击就都没有可能发生。因为如果以计算能力为权重的大多数矿工是诚实的,提议下一个区块的竞争会自动保证在任意时间点,下一个区块至少有50%的概率是由一个诚实节点提议的。

矿工行为的两种行为模式

在分布式系统和计算安全研究领域,假设一定比例的节点是诚实的,来展示在其他节点表现随意的情况下,系统如何按照预期运行,是很常见的方法。这是我们采用的基础方法,除了以计算能力为权重计算大多数之外。最初的比特币白皮书也包含了这样的分析。

但博弈论领域给出了一种完全不同的,更复杂且实际的方法来决定系统如何运行。这个观点不区分节点诚实或恶意,而是假设每个节点都按自己的意愿行动。每个节点考虑其他节点的潜在可能策略之后,采用一种(随机的)策略最大化自己的回报。如果协议和激励机制设计得当,大多数节点在大多数时候会遵循这个规则。“诚实”的行为只是许多策略中的一种,我们在道德上并不依赖于此。

博弈论的观点认为,最大的问题是矿工默认的行为是否是一种“纳什均衡”(Nash equilibrium),即这是否代表了一种稳定的状态,在这种状态下没有节点可以通过表现不诚实而获得更高的回报。针对这个问题现在各界仍有争议,并且是一个活跃的研究领域。

解哈希谜题是概率性的,因为没有人可以预测到哪个临时随机数会解出谜题。唯一的方法是一个一个去试临时随机数,并希望能够成功。在数学上,这被称为伯努利试验(Bernoulli trial)。伯努利试验是一种有两种可能结果的试验,在连续试验下,每种结果发生的概率是固定的。在这里,两种结果是哈希值是否落在目标区域内,假设哈希函数像随机函数一样,那些结果的概率都是固定的。典型地,节点多次尝试临时随机数的伯努利试验是一个离散概率过程,它可以用一个叫作泊松过程(Poisson process)的连续概率过程近似表示,在泊松过程中,事件以固定的速率独立出现。最后的结果是,发现下一个区块所需要时间的概率密度函数,见图2.5。

图2.5 发现下一个区块所需时间的概率密度函数

这被称为指数分布。假设一个区块现在被发行,下一个区块有一定的小概率很快被发现,比如几秒钟或几分钟。也有一定的小概率花了较长时间才发现下一个区块,比如一小时。但总体来说,网络会自动调整难度使得区块间隔时间的长期均值维持在10分钟。注意图2.5表示的是整个网络内区块被创造出来的频率,而不是哪个矿工事实上发现了这个区块。

如果你是一名矿工,你大概想知道要多长时间才能找到下一区块?这个概率密度函数会是什么样?它的形状会相同,但x轴的坐标不一样。可以用一个漂亮的公式表示:

对于某个特定的矿工:

发现下一区块的平均时间=10分钟/占全部计算能力的比例

如果你有全网络0.1%的计算能力,这个公式告诉我们,你每10 000分钟能找到一个区块,大约一个星期。不仅是你发现区块的时间间隔非常长,时间间隔的波动也会非常大。因此产生的一些重要结论我们在第5章会讲到。

易于证实

现在回到工作量证明函数第三个重要的特性,就是证实一个节点正确地计算了工作量证明很容易。即使一个节点要尝试1020次来找到使区块哈希值落在目标范围内的临时随机数,并且临时随机数必须是作为区块的一部分被公布出来。这样任何其他节点很容易检查区块的内容,计算它的哈希值,证实它的输出在目标区域内。这是个相当重要的特征,因为这样使得我们摆脱了中心化管理。我们不需要一个中央权威机构来证明矿工正确地完成了工作。任何节点或者矿工,都可以迅速地证实其他矿工找到的区块符合工作量证明的规定。