Echo | 解析工作量证明:本质上是一个去中心化时钟
编者注:本文的译文已发布在网站上,可以在此处找到。
本文将解释“工作量证明”在比特币区块链上的关键作用。我们只会关注工作量证明机制最关键的特征之一,并证明其他特征(例如安全性)只是附带的,虽然有用,但不是最本质的特征。
本文的解释基于说明工作量证明在区块链上使用时的一些有趣属性。它们往往不那么直观,有时甚至违背我们的直觉。例如,通过工作量证明,一群人可以一起解决问题,而无需彼此沟通。
了解了这些有趣的属性后,你可能会得出这样的结论:工作量证明主要是一种实现“分布式、去中心化计时系统”(即时钟)的机制。
请注意,本文不是讨论工作量证明的原理,而是讨论区块链如何利用工作量证明。如果你不知道什么是工作量证明,可以从这篇文章开始。
去中心化账本中的时间顺序问题
在查看解决方案之前,让我们先仔细看看问题。许多介绍工作量证明的文章很难阅读,因为它们试图跳过问题并直接给出答案。
任何账本显然都需要有秩序。正如一个人不应该能够花未到账的钱一样,一个人也不应该能够使用已经转移给别人的钱。区块链上的交易必须明确交易顺序,不依赖第三方机构。
即使区块链不保存账本,而只保存某种日志(因为每个节点都有相同的区块链副本),它仍然需要对发生的事情进行排序。如果排序不同,结果显然会不同;如果顺序不同,就会成为另一个区块链。
但如果交易是由世界各地的匿名用户生成的,并且没有中央组织负责对它们进行排序,我们如何对交易进行排序?例如,交易(或区块)包含时间戳,但在什么条件下这些时间戳可以被信任?
时间只不过是一个人造的概念。包括原子钟在内,所有时间报告源实际上都是“可信第三方”。但最重要的是,这些第三方在大多数情况下并不完全正确。因为网络延迟或者相对论的影响都会造成他们结果的差异。坐在飞机上的人和在地面上行走的人之间会出现“时间膨胀”的现象。这个误差会逐渐累积并最终扭曲排序。因此,在去中心化且地理上分散的系统中,依靠时间戳来确定时间顺序是不可能的。
我们这里所说的实际上并不是传统意义上的“时间”概念,也不是“年、月、日”。我们需要的是一种机制,使我们能够验证一个事件是否在另一个事件之前发生。
首先,为了使用“之前”和“之后”等描述,我们必须首先建立“时间点”的概念。乍一看,在时间线上建立一个特定点似乎是不可能的,因为目前还没有技术可以精确测量一个点(时间单位,约等于5.×10^-44秒)。但正如您稍后会发现的那样,这就是比特币的工作原理——它可以通过创建自己的时间概念来识别时间线上的特定点。
这个问题在1978年发表的《Time, and the of in a》一文中有详细解释。但事实上,除了“正确同步物理时钟”之外,这篇文章并没有提出任何彻底的解决方案。
1982年,“拜占庭将军问题”也被提出。中本聪在他早期的电子邮件中解释了工作量证明如何解决这个问题。然而,他在比特币白皮书中写道:“为了在点对点的基础上使用去中心化的时间戳服务器,我们需要使用工作量证明系统。”这句话说明工作量证明主要是用来解决时间戳排序问题的。
时间排序是最根本的问题
这里必须强调的是,在中本聪提出解决方案之前,去中心化系统中确定事件和时间点之间的相关性的困难使得去中心化账本无法实现。区块链还有很多其他技术细节值得深思,但时机仍然是最基本、最重要的一点。我们甚至可以认为,如果时间排序不能完成,就不会有区块链。
简单回顾一下“工作量证明”
简单来说,比特币的工作量证明就是经过SHA-2哈希函数运算后找到一个能够满足特定条件(小于某个值)的值(得到的哈希值)。这个要求的值越小,可能满足条件的输入值就越少,找到这样的输入值的难度就越高。
这种机制之所以被称为“工作量证明”,是因为满足条件的值太少了。找到这样的数字需要大量的实验(也称为工作)。所需的工作量又意味着所需的时间。
通过改变需求,我们可以调整找到这个值的难度和概率。比特币难度的动态调整使得整个网络平均每十分钟就能找到这样一个值(译者注:虽然满足这样一个值的要求在不断变化)。
块之间没有发生任何事情
链的状态是链上区块中执行交易的结果。因此每个新块都会生成一个新状态。因为区块链的状态随着每个新区块的产生而不断改变(译者注:没有新区块产生时状态不会改变),所以我们看一下产生一个区块的平均时间(十分钟)操作是区块链时间的最小计量单位。
SHA 函数是无记忆且程序化的
安全散列算法在统计中被称为无记忆的。这个属性对于人类来说显然是违反直觉的。失忆最好的例子就是抛硬币。如果一枚硬币连续十次正面朝上,是否意味着下一次正面朝上的可能性更大?直觉告诉我们:“是的。”但事实上,无论之前的记录是什么,正面或反面的概率仍然是50-50。
这种无记忆性是工作量证明无过程性质的先决条件。无进程意味着当矿工在挖矿时重复尝试不同的随机数时,每次尝试都是一个独立的事件。无论他们付出多少努力,在随后的每次尝试中找到正确结果的概率都是相同的。换句话说,每次不成功的尝试都不会让矿工“更接近”正确的结果。已经尝试挖矿一年的矿工并不比刚刚开始挖矿的矿工更有可能找到下一个区块。
因此,在给定的难度下,在给定时间内找到结果的概率仅取决于所有矿工遍历可能的哈希值的速度。它与过去的历史无关,与区块数据无关,只有哈希率( ,进行哈希运算的速度)。
事实上,计算哈希值是矿工数量和挖矿设备速度的函数。
(请注意:SHA并不是严格意义上的无进程,因为哈希值的数量是有限的。但是,由于256位整数的范围太大,实际上我们认为它是无进程的。)
SHA函数的输入值并不重要
在比特币区块链中,工作量证明算法的输入值是一个区块的区块头(包含该区块中交易数据的一些摘要信息,以及前一个区块的哈希值)。但即使我们只是随机输入一些数据,找到满意的哈希值的概率仍然是相同的。无论输入是有效的块头还是一些随机字节,我们找到正确结果所需的时间平均仍然是十分钟。当然,如果你真的使用随机内容作为输入值,即使找到结果,你的区块也不会被打包到区块链上。这种情况虽然可以算是工作量证明,但是并没有什么用。
整个宇宙的难度是统一的
你知道吗,困难是普遍存在的。这意味着无论你在整个宇宙的哪个位置,难度都是相同的。因此,我们可以请火星上的矿工帮忙挖矿。他们不需要认识地球上的矿工,甚至不需要互相交流。整个网络仍然每 10 分钟开采一个区块。 (好吧,实际上他们必须想办法告诉我们地球人他们首先开采了这个区块,否则即使他们开采了我们也不会知道。)
显然,远程参与的矿工之前彼此没有任何交流,因为他们只是试图一起解决相同的数理统计问题。他们其实并不知道彼此的存在。
“统一”这个属性看似神奇,其实很容易理解。我说“团结”是因为这个词很容易理解。但准确来说,它的意思是“每个矿工都知道”。
SHA-256 哈希函数的输入值可以是 0 到 2^256 之间的任何整数(因为输出值是 32 位字节,也在 0 到 2^256 之间;任何更大的值都将具有相同的哈希值)值作为先前的值,或者是多余的)。虽然这是一个非常大的数字(甚至比已知宇宙中的原子数还要大),但每个人至少都知道这个范围,并可以从中选取一个值。
如果输入值的范围、使用的函数(SHA-256)和难度要求是每个人都知道的,那么找到解决方案的概率对每个人来说都是均匀且公平的。
做矿工很简单,计算SHA就可以了
如果问题是找到合适的哈希值,那么您所需要做的就是尝试运行一次哈希函数,然后“当”,您已经影响了全局哈希率。因为这个尝试,你也可以被视为一个矿工,帮助别人解决这个问题。你不需要告诉别人你做了什么(除非你找到了最终的解决方案),别人也不需要知道。但无论如何,你的尝试都会影响整体结果。一点也不夸张。
如果您还有点怀疑,也没关系。想想这个类比——找到最大的素数。这个问题很难,一旦找到更大的素数,这个数就会被认为是“找到”和“已知”。在数字世界中,素数是无限的。但因为我们都使用相同的编号系统,所以无论谁试图解决它,我们都会面临同样的问题。你不需要告诉别人你决定找到最大的素数。您只需要等待,直到真正找到解决方案。如果没有人愿意研究这个问题,那么这个问题的解决方案就永远找不到。因此,只要最终结果公布,参与(即反复尝试寻找结果)就会影响结果,即使参与过程完全保密。这样看来,中本聪发明的机制真是高明——它利用上述逻辑,让秘密的参与过程和不成功的尝试影响最终的结果。
值得注意的是,由于SHA功能是无过程的,因此每次尝试都可以被视为参与者在付出努力后立即离开网络。因此,我们可以认为矿工每秒无数次进入和退出网络。
参与情况将在统计结果中体现
神奇的秘密参与属性反过来也成立。全球算力之所以为大家所知,并不是因为矿工在某些“矿工注册表”中注册,然后报告各自的算力。事实并非如此。
算力之所以被大家熟知的原因其实很简单。每十分钟左右找到某个难度的解决方案需要某人在某个地方进行多次尝试(大约 10^21)。
我们不知道这些参与者是谁,他们也不需要告诉别人他们正在工作。此外,它们可以存在于宇宙的任何地方。但可以肯定的是,这些参与者(矿工)一定存在。因为网络不断地产生区块,也就是不断地寻找符合要求的解决方案。
工作量就是时钟
综上所述,我们可以知道工作量证明的核心:挖矿的难度要求是一个时钟。如果您愿意,您可以将其称为“宇宙钟”。它不需要与其他任何人同步,每个人都可以“看到”它。
即使时钟不准确也没关系。重要的是每个人的时钟都是一样的,并且链的状态可以明确地与这个时钟的滴答声联系在一起。
该时钟由未知数量的参与者的集体哈希率提供动力,这些参与者分散在地球各地,彼此之间没有联系。
最后一块拼图
工作量证明问题的解决方案必须是区块的哈希值(准确地说是区块头)。正如我们之前所说,输入值并不重要。但如果它是一个真正的块,那么当找到解决方案时,这将是时钟的“滴答”时刻。不是之前,不是之后,而是那一刻。我们非常确定,因为区块是这个机制的一部分。
换句话说,如果函数的输入值不是一个块,我们仍然会有一个时钟,但我们将无法将块与时钟的滴答声关联起来。使用块作为输入值可以很好地解决这个问题。
值得注意的是,我们的工作量证明时钟只能给我们滴答声。但我们无法从滴答声中辨别出顺序。连续的哈希链就是用来解决这个问题的(译者注:因为区块头包含了挖矿矿工选择的区块作为父区块的哈希值,所以这就形成了顺序)。
这与分布式共识有什么关系?
共识是指一致同意。所有参与者必须遵守的一项规则是时钟会滴答作响。此外,每个人都可以听到滴答声并了解与每个滴答声相关的数据。正如中本聪在电子邮件中提到的那样,这实际上解决了拜占庭将军问题。
还有另一个共识旨在处理特殊情况 - 与冲突块相关的两个连续刻度。这种冲突只能通过等待下一个刻度出现来解决。当与勾号关联的下一个块出现时,它位于先前两个冲突块之一之后。这将导致另一个块成为“孤儿块”。一条链将如何发展是一个概率问题,但也或多或少与工作量证明时钟有关。
大概就是这样发生的
以上就是工作量证明在区块链上的作用。矿工并不是通过购买“彩票”来赢得打包区块的权利,也不是将电力转化为有价值的东西。这些说法已经走得太远了。
抽签这个词无非是为了吸引更多矿工参与挖矿的一种方式。它本身并不是区块链运行的机制。有人可能会说,区块的哈希值形成了一条链,但这与工作量证明无关。它只是利用密码学来加强区块序列的记录。哈希链还确保之前的报价越来越不可更改并且越来越安全。
工作量证明机制还增强了区块的不变性。这也使得隔离见证()变得可行,但也可以通过保留签名()来实现。所以这个角色只是次要的。
总结
比特币区块链的工作量证明实际上是一个分布式、去中心化的时钟。
如果你理解了这个解释,那么你应该对工作量证明和权益证明之间的区别有更清晰的理解。显然,两者有根本的不同:权益证明是权力(随机分布),而工作量证明是时钟。
在讨论区块链时,我们说“工作量证明”,这不太合适。该术语是从该项目中传承下来的;它被用来展示努力。在区块链上,主要用于获取可验证的时间序列。当一个人看到满足难度条件的哈希时,他/她知道生成该哈希一定需要一些时间。而这个时候就是“工作量”造成的。但这个哈希值之所以有意义,是因为它证明它是在一段时间内生成的。
工作量证明主要是关于时间而不是工作的事实也指出,可能存在其他更耗时但需要更少能量的统计问题。这个事实也意味着比特币的(算力)实际上过高。我们前面提到的比特币时钟实际上只需要它的一部分就可以顺利运行。然而,奖励机制的存在刺激了能源消耗。
很难找到一种方法来享受更快的滴答率,需要更少的工作,所以如果你找到了,请告诉我!
另外,特别感谢Sasha对本文的修改和建议。
(超过)
(文中超链接较多,可点击左下角“阅读原文”从网站获取)
原文链接: