> For the complete documentation index, see [llms.txt](https://liuchengxu.gitbook.io/blockchain/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://liuchengxu.gitbook.io/blockchain/misc/explain-pow.md).

# PoW 本质上是个去中心化的时钟

> 原文：[Blockchain Proof-of-Work Is a Decentralized Clock](https://grisha.org/blog/2018/01/23/explaining-proof-of-work/)
>
> 原文从区块链如何保持交易有序的基本问题出发，对该问题进行了详细阐述，并提出 PoW 本质上是实现了一个“时钟”的观点，这个时钟的一个滴答对应的就是 PoW 算出一次的解。

本文解释了比特币 PoW（Proof-of-Work, 工作量证明） 的关键要素，尤其对 PoW 来说不可或缺的一个特性，同时也表明关于 PoW 经常谈到的一些其他特性其实是次要作用，比如安全性，这些次要效应有用，但是非必要。

要想理解本文，首先要懂得在区块链中，PoW 是如何工作的一些有趣的属性，这些属性并不那么直观，甚至可以说相当反直觉，比如参与者如何在*从来没有相互交流*的情况下，共同地求解一个问题。

当理解了这些属性，你应该能够得出一个结论：PoW 的机制主要实现了一个分布式，去中心化的时间系统，即一个时钟。

注意本文并非关注 PoW 算法本身的细节，而是探究区块链如何“严丝合缝”地将 PoW 运用其中。如果你还没听过 PoW，请先阅读 [这里](https://en.bitcoin.it/wiki/Proof_of_work)。

## 分布式账本时间排序问题

在讲解决方案之前，先来关注问题本身。很多 PoW 的相关资料都很令人费解，因为它们常常在没有阐明问题的情况下，就试图讲清楚解决方案。

毫无疑问，任何账本都需要有序。你不能发费还没有收到的钱，也不能花费已经花出去的钱。区块链交易（或者说包含交易的块）必须有序，无歧义，同时无需可信的第三方。

即便区块链不是一个账本，而是就像日志一样的数据，对于所有节点来说，如果要想共同保有一份完全相同的区块链副本，有序也是必不可少的。交易顺序不同，就是不同的两条链。

但是，如果交易是由全世界的匿名参与者生成，也没有中心化机构负责给交易排序，那又如何实现这一点呢？有人会说，交易（或者块）可以包含时间戳，但是这些时间戳又如何可信呢？

时间是一个[人类概念](http://www.preposterousuniverse.com/blog/2015/04/03/the-reality-of-time/)，时间的任何来源，比如一个原子时钟，就是一个“可信第三方”，除此之外，由于网络延迟和[相对论效应](http://www.astronomy.ohio-state.edu/~pogge/Ast162/Unit5/gps.html)，时钟的大部分时间都有轻微误差。很遗憾，在一个去中心化系统中，不可能通过时间戳来决定事件的先后顺序。

我们所关心的“时间”并不是所熟悉的年，月，日这种概念。我们需要的是这样一种机制，它可以用来确认一个事件在另一个事件之前发生，或者可能并发发生。

首先，为了建立之前与之后的概念，首先必须要建立一个*时间点*的概念。理论上来说，建立一个点时间的概念似乎并不太可能，因为没有技术能够足够精确地测量 [普朗克时间](https://en.wikipedia.org/wiki/Planck_time)。但是你会看到，比特币通过创建属于自己的时间概念变相解决了这个问题，使得确立精确的时间点概念在事实上成为可能。

[Leslie Lamport](https://en.wikipedia.org/wiki/Leslie_Lamport) 1978 年的论文 [“分布式系统中的时间，时钟和事件顺序”](https://amturing.acm.org/p558-lamport.pdf) 中对这个问题有了详细描述，但是除了“正确同步的物理时钟”，实际上并没有提供一个详细的解决方案。1982 年 Lamport 同样描述了 [“拜占庭将军问题”](https://people.eecs.berkeley.edu/~luca/cs174/byzantine.pdf)，中本聪在他早期的一封邮件中 [解释](http://satoshi.nakamotoinstitute.org/emails/cryptography/11/) 了 PoW 如何解决了这个问题，[比特币白皮书](https://bitcoin.org/bitcoin.pdf) 指出“为了在端到端的基础上实现一个分布式的 *时间戳服务器*，我们将会使用一个工作量证明系统”，也表明了它主要解决了时间戳的问题。

## 时间是根本问题

必须要强调的是，在分布式系统中，*不可能将事件与时间点关联起来*，这是一个尚不可解问题，直到中本聪找到了一个解决方案，才使得分布式账本成为可能。在区块链中还有很多其他的技术细节，但是时间是最基础也是最重要的。没有时间，就没有区块链。

## PoW 回顾

简而言之，比特币的 PoW 就是 [SHA-2](https://en.wikipedia.org/wiki/SHA-2) 哈希满足特定的条件的一个解，这个解很难找到。通过要求哈希满足一个特定的数字，就确定了一个难度（difficulty），难度的值越小，满足输入的数字越少，找到解的难度就越大。

这就是所谓的“工作量证明”，因为满足哈希要求的解非常稀少，这意味着找到这样一个解需要很多试错，也就是，“工作（work）”。而工作也就是意味着*时间*。

## 块间无变化

链的状态由块所反映，每个新的块产生一个新的状态。区块链的状态每次向前推动一个块，平均每个块 10 分钟，是区块链里面最小的时间度量单位。

## SHA 无记忆，无进展

SHA(Secure Hash Algorithm) 在统计学和概率上以[无记忆性（memoryless）](https://en.wikipedia.org/wiki/Memorylessness) 闻名。对于我们人类而言，无记忆性有点反直觉。所谓无记忆性，就是无论之前发生了什么，都不影响这一次事件发生的概率。

关于无记忆性，最好的例子就是抛硬币。如果一个硬币连续 10 次都是正面，那么下一次是反面的可能性会不会更大呢？我们的直觉是会，但是实际上，无论上一次的结果是什么，每次抛硬币正反面都是一半一半的概率。

而对于需要无进展（progress-free）的问题，无记忆性又是必要条件。progress-free 意味着当矿工试图通过对 [nonces](https://en.bitcoin.it/wiki/Nonce) 进行迭代解决难题时，每一次尝试都是一个独立事件，无论之前已经算过了多少次，每次尝试找到答案的概率是固定的。换句话来说，每次尝试，参与者都不会离“答案”越近，或者说有任何进展（progress）。就下一次尝试而言，一个已经算了一年的矿工，与上一秒刚开始算的矿工，算出来的概率是一样的。

在指定时间内，给定一个难度，找到答案的概率*唯一地由所有参与者能够迭代哈希的速度决定*。与之前的历史无关，与数据无关，只跟算力有关。

因此，算力是一个与参与者数量，和那些用来计算哈希设备的速度相关的函数。

## SHA 与输入无关

在比特币中，输入的是区块头。但是如果给它随机传入一些值，找到一个合适哈希的概率仍然是一样的。无论输入是一个有效的块头，还是 /dev/random 中随机的一些字节，都要花费平均 10 分钟来找到一个解。

如果你找到了一个合适的哈希，但是输入却不是一个有效的块头，虽然无法将块上链，但是它仍然是一个工作量证明（即使没啥用）。

## 难度属于银河系

令人惊奇的是，难度是*universe（全宇宙，或者说通用的）*，也就是说它充满了整个宇宙，无处不在。火星上的矿工也同样能参与挖矿，但是他们不需要感知到地球矿工的存在，也不需要与地球上的矿工有交流，仍然是每 10 分钟就会解决一个“难题”。（好吧，当他们解出难题时，需要告诉地球上的矿工，否则我们永远也不知道）。

了不起的是，远距离参与者不需要通过真正的相互交流进行沟通，因为他们在共同地求解同一个统计学问题，并且他们甚至互相感知不到对方的存在。

“通用属性（universal property）”一开始看起来很神奇，实际上很容易解释。我用了“通用”一词，因为就这一个词即可表达到位，但是它实际指的是“所有参与者都知道（这个难度）”。

SHA-256 的输入可以是 0 到 2 的 256 方之间的任何一个整数（因为输出是 32 字节，也就是在 0 到 2^256，任何超过该范围的数将会导致冲突，也就是多余）。即使这个集合已经非常大了（[比已知宇宙里所有原子总数都大](https://learncryptography.com/cryptanalysis/why-is-2-256-secure)），不过每个参与者都知道这个集合，并且只能从这个集合里选取一个数。

如果输入的集合全世界都知道，SHA-256 全世界都知道，难度要求也是全世界都知道了，那么找到一个解的概率自然也就是“全世界都知道（universe）”。

## 计算 SHA 即参与

如果所述问题是找到一个合适的哈希，那么要想解出这个问题，只需要去试一次，但是，哪怕就试一次，你就已经影响了整个算力。就这次尝试而言，你就已经成为了一个帮助其他人解决问题的参与者。虽然你不需要告诉其他人你“做了”（除非你找到了答案），其他人也不需要知道，但是想要找到解的这次尝试*真真切切地*影响到了结果。对于全宇宙而言，也是如此。

如果上面这段话看起来仍然不是那么令人信服，一个很好的类比就是寻找大素数问题。找到最大的素数很难，并且一旦找到，它就是“被发现”或者“已知的”。有无数的素数，但是在全宇宙中，每个数只有一个实例。因此无论是谁试图找到最大素数，就是在解同一个问题，而不是这个问题另一个单独的实例。你不需要告诉其他人你已经打算寻找最大素数，你只需要在找到时通知其他人。如果从来没有人寻找最大素数，那么它永远也不会被找到。因此，只要参与（也就是试图找到素数），即使它正在秘密进行，仍会影响结果，只要公布最后的发现（如果找到）。

这就是中本聪设计的精妙之处，他利用了这个令人难以置信的统计学现象，即任何参与都会影响结果，即使秘密进行，即使尚未成功。

值得注意的是，因为 SHA 是 progress-free，每一次尝试都可以被认为是一个参与者加入其中，然后立即退出。因此可以这么理解，矿工们来了又走，每秒无数次轮回。

## 参与度由统计学揭示

这个神奇的秘密参与（secret participation）属性反过来也成立。很多网站上显示的全球算力，并非是由每个矿工在某个“矿工注册办公室”注册，并定期汇报他们的算力而来。并不存在这种事情。

因为对于在 10 分钟找到一个指定难度的解，所需算力是已知的，一个人平均必须尝试这么多次（截止成文之时大概 10^21）才能找到答案，无论这个人是谁，他在哪儿。

我们不知道这些参与者是谁，他们也从来都不会说我正在参与其中，没有找到解的人（实际上他们都是）从来不会告诉其他人他们正在进行计算，他们可能在世界上任何一个地方，但是我们肯定他们必然存在。因为生活还要继续，问题（找到满足条件的哈希）始终还是要被解决。

## 工作（work）是一个时钟（clock）

关键之处在于：找到满足条件的哈希的难度，就类似于一个时钟的角色。一个宇宙（universe）时钟，因为全宇宙只有一个这样的时钟，不需要同步，任何人都能“看”到这个时钟。

即使这个时钟不精确也没关系。重要的是，对所有人来说，它都是同一个时钟，链的状态与这个时钟的滴答（tick）无歧义地绑定到一起。

这个时钟由遍布地球上的未知数量的参与者共同操作，参与者相互之间完全独立。

## 谜题的最后一部分

解决方案必须是块哈希（准确来说，是块头）。上面已经提到，对于 SHA 来说，输入的内容并不重要，但是如果它是真实的块，那么无论何时找到一个解，它都发生在 PoW 这个时钟的滴答处。没有早一点，没有晚一点，而是恰好在这个点。我们知道这是毫无歧义的，因为块是整个机制的一部分。

换句话来说，如果块不是 SHA256 函数的输入，我们仍然有一个分布式时钟，但是我们无法将块绑定到这个时钟的滴答上。将块作为输入就解决了这个问题。

值得注意的是，我们的 PoW 时钟只提供了滴答。但是我们没办法从滴答中分出顺序，于是就引入了哈希链（hash chain）。

## 分布式共识

共识（consensus）意味着意见一致（agreement）。所有参与者别无选择，只能同意“时钟已然滴答”。并且每个人都知道滴答和附加的数据。正如中本聪在邮件里面所解释的，这确实解决了拜占庭将军问题，。

在一个罕见却又常见的情况下，会出现共识分离，有两个连续的滴答与一个块有关联，这就发生了冲突。通过哪个块与下一个滴答相关联解决了这个冲突，同时将有争议的块变为“孤儿块（orphan）”。链如何继续是个概率问题（a matter of chance），这也可能间接地归因于 PoW 的时钟。

## 就这样

这就是区块链的 PoW（工作量证明）。它并不是一个为了让矿工赢得出块权的“乐透”，也不是为了将实际能源转换成一个有价值的概念，这些都偏离了本质。

比如矿工奖励的角度来看，虽然这些奖励激励了矿工参与，但是这并不是区块链诞生的必要因素。块哈希形成一条链，但是这与工作量并没什么关系，它是从密码学上强制保证了块的顺序。哈希链使得前一个滴答“更确定”，“更加不可抵赖”，或者简单来说，更安全。

PoW 也能使块不可更改，这是一种好的副作用，也使得隔离见证（Segregated Witness）成为可能，但是隔离见证也能通过保留签名（见证,witness）实现，所以这也是次要的。

## 结论

比特被的 PoW 只是一个分布式，去中心化的时钟。

如果你理解了这个解释，那么你应该能够更好地理解 PoW 与 PoS 的异同。显然，两者不具有可比性：PoS 是有关于（随机分布的）权力（authority），而 PoW 是一个时钟。

在区块链的背景下，PoW 这个名字可能是个误用，起的并不太好。这个词来源于 [Hashcash](https://en.wikipedia.org/wiki/Hashcash) 项目，它确实用于证实工作（work）。在区块链中，它主要关于可验证的花费时间。当一个人发现满足难度的哈希时，我们知道它必然会花费一些时间。实现时间延迟的方法就是“工作”，而哈希就是这段时间的证明。

PoW 是关于 time 而非 work 的事实也表明，可能存在一些其他的统计学问题，这些问题同样消耗时间，但却需要更少的能源。这也可能意味着比特币算力有些“过分”，因为我们在上面所描述的比特币时钟，在只有部分算力的情况下，也是可信的，这是这种激励结构推动了能源消耗。

如果你找到了一个方法能够同步滴答，并且需要更少的工作，这是一个价值万亿美元的问题，请一定要告诉我！

P.S. 特别感谢 [UChicago Statistics](https://galton.uchicago.edu/) 的 [Sasha Trubetskoy](http://sashat.me/) 对上述文字的 review 和建议。
