作者:Kalle Rosenbaum & Linnéa Rosenbaum

来源:https://bitcoindevphilosophy.com/#scaling

前篇见此处

scaling-banner

在本章中,我们要探索比特币如何扩容,以及无法为它扩容的方法。我们先要看看以前人们是怎么想这个问题的。然后,本章的主体是解释各种为比特币扩大吞吐量的办法,具体来说可分为垂直扩容、水平扩容、向内扩容和分层扩容。在每一段叙述之后,都会讨论这种方法是否会与比特币的价值立场相冲突。

在比特币世界里,人们常常会在不同意义上使用 “扩容(scale)” 这个词。一些人认为这个词指的是区块链交易吞吐量的提高,另一些人认为它的意思是更加高效地使用区块链,还有人认为这是指开发建立在比特币之上的系统。

在比特币的语境下,并且也是出于本书的目的,我们将 “扩容” 定义为 “提高比特币的可用吞吐量,而不牺牲其抗审查性 ”。这个定义概括了多种变更,比如:

  • 让交易的输入使用更少的字节
  • 提升签名验证的效率
  • 让比特币的点对点网络使用更少的带宽
  • 交易批量处理
  • 分层架构

我们很快会深入讨论扩容的各种方法,但先,我们先从比特币历史在扩容视角下的一个简述开始。

8.1 历史

扩容从比特币诞生以来就是讨论的焦点。给中本聪宣布比特币白皮书的 Cryptography 邮件组邮件的第一封回信的最开头段落,就是关于扩容的:

Satoshi Nakamoto wrote:
> I’ve been working on a new electronic cash system that’s fully
> peer-to-peer, with no trusted third party.
>
> The paper is available at:
> http://www.bitcoin.org/bitcoin.pdf

我们非常、非常需要这样一个系统,但按照我对你的提案的理解,它似乎无法扩容到所需的规模。

—— James A. Donald 回复中本聪,Cryptography 邮件组(2018)

这段讨论本身可能算不上非常有趣,也不准确,但它表明,扩容从一开始就一直是人们心头的顾虑。

关于扩容的讨论在 2015 ~ 2017 年间到达顶峰,那时候有许多不同的想法,围绕着要不要增加比特币区块体积的最大限制。这是相当无聊的讨论,关于要不要改变源代码中的一个参数,这种变更并不能在根本上解决任何问题,只能将扩容问题推迟一段时间来解决,这不过是在积累 “技术债”。

在 2015 年,一个叫做 “Scaling Bitcoin” 的大会在蒙特利尔(Montreal)举办;6 个月后,一场后续会议在香港(Hong Kong)剧本;此后还在世界各地举办了一连串的会议。Scaling Bitcoin 大会的关注点完全集中在如何解决扩容问题。许多比特币开发者和狂热爱好者聚集在这些会议中,讨论多种多样的扩容问题和提案。绝大部分讨论都没有落于提高区块体积限制的俗套,而是关于更加长期的解决方案。

在 2015 年 12 月的香港大会后,Gregory Maxwell 总结了他对讨论中的许多问题的观点,但他的起笔是更加广义的扩容哲学。

当前可用的技术,在扩容和去中心化之间存在根本的矛盾。如果比特币系统的使用成本变得太高,人们就会被迫信任第三方,而不是独立地强制执行这个系统的规则。如果比特币区块链的资源用量,相对于可得的技术,太大了,比特币就会失去其相对于传统系统的竞争优势,因为验证成本变得太高(排挤了许多用户),从而迫使系统重新引入信任因素。如果吞吐量太低、我们构造交易的方法太过低效,访问区块链来解决纠纷的代价就会变得太高,也会将信任因素推到这个系统中。

—— Gregory Maxwell,《为比特币系统提高吞吐量》(2015)

他讲的是吞吐量和去中心化之间的矛盾。如果你允许更大的区块,那就会吧一些推出网络,因为他们没有足够多的计算机资源来验证扩大之后的区块。但另一方面,如果使用区块空间变得更加昂贵,那就只有更少的人能负担使用它作为一种争议调解机制。不管是哪一种情况,用户都会被推向需要信任的服务。

然后,他总结了会议上出现的许多扩容方法,包括:计算上更加高效的签名验证、包含了区块体积变更的 “隔离见证(Segregated witness )” 、一种空间效率更高的区块传播机制,还有在比特币上开发分层的协议。自那以来,这些方法中的多项都已经实现了。

8.2 扩容方法

如前所述,为比特币扩大吞吐量并不必然要提高区块体积限制或其它限制。现在,我们要列举扩容的通用方法,其中一些并不受困于上一节提到的 吞吐量-去中心化 矛盾。

8.2.1 垂直扩容

“垂直扩容” 指的是增加处理数据的机器的计算机资源。在比特币的语境下,这样的机器就是全节点,也就是代表用户验证区块链的机器。

在比特币世界里,被讨论得最多的垂直扩容技术就是提高区块体积限制。这将要求一些全节点升级自己的硬件,以跟上增加的计算需求。这种方法的缺点在于,它的代价是中心化,这我们已经在前面的章节中讨论过了;更深入的讨论在章节 1.2中文译本)。

除了影响 “全节点去中心化” 的负面效果,垂直扩容可能也会对比特币的 “矿工去中心化” (详细解释见章节 1.1中文译本))和安全性产生负面效果,只是方式更加隐秘。我们先来看看矿工 “应该” 怎么运营。假设一个矿工在高度 7 处挖出了一个区块,并将这个区块发布到了比特币网络中;这个区块需要花费一些时间才能得到网络的广泛接受,这其中有两个原因:

  • 由于带宽的限制,区块在节点之间传播需要时间
  • 验证区块也需要时间

而当这个区块正在网络中传播的时候,许多矿工依然在区块 6 的基础上挖矿(也即依然在区块高度 7 处挖矿),因为他们还没收到这个,而且还没有验证它。如果在此期间,这些矿工中有人在区块高度 7 处发现了一个新区块,那就会在同一高度形成两个竞争区块。每个高度都只能有一个区块得到整个网络的认可,那就意味着这两个候选区块中必定有一个要被抛弃。

简而言之,网络中会出现这样的 “陈腐区块”,那是因为每一个区块都要花时间来传播,而传播的时间越长,出现陈腐区块的概率就越高。

假设区块体积限制被解除,实际挖出的区块的平均体积大幅提高,那区块在网络中的传播速度就会变慢(因为带宽限制和验证时间)。传播时间的增加也会提高出现陈腐区块的概率。

矿工们肯定不想让自己的区块变成陈腐区块,这就像煮熟的鸭子飞了,所以,他们肯定会尝试避免这样的情形。他们可以采取的措施包括:

  • 延迟对到来的区块的验证,也叫做 “无验证挖矿(validationless mining)”(更进一步的讨论在章节 9.2.4.4)。矿工可以仅检查区块头的工作量证明,然后直接在后面继续挖矿,等到下载得到完整的区块再验证。
  • 接入一个带宽更大、连接更稳定的矿池。

无验证挖矿会进一步降低全节点去中心化,因为矿工直接信任了到来的区块 —— 至少是暂时这样做了。它也会或多或少伤害安全性,因为可能会有一定比例的挖矿算力被用在了一条无效的区块链上,而不是全部用于打造最健壮的有效区块链。

上述第二点也对矿工去中心化有负面影响,详见章节 1.1中文译本),因为通常来说,拥有最稳定连接、最大带宽的矿池,也就是规模最大的矿池,这让矿工逐渐聚集成少量几个矿池。

8.2.2 水平扩容

“水平扩容” 指的是将工作负载分散到多台机器上的技术。虽然这是在热门的网站和数据库中普遍的扩容方法,但在比特币上并不容易实现。

许多人将这种比特币扩容方法称作 “分片(sharding )”。基本上,它的意思是让每个全节点只验证区块链的一部分。Peter Todd 曾经在这个概念上花费许多心思。他写了一篇博客文章来解释广义上的分片,还提出了他自己的想法,叫做 “树链(treechains )”。这篇文章非常难读,但 Todd 的一些观点是非常容易理解的。

在分片系统中,“全节点屏障” 无法生效,至少不能直接生效。根本原因在于,并不是每个人都持有所有数据,所以你必须在不是全部数据都可得的情况下确定发生了什么。

—— Peter Todd,《为什么用分片技术来扩容比特币是非常困难的》(2015)

然后他提出了关于处理分片(或者说水平扩容)的许多想法。在文章末尾,他总结道:

但还有一个大问题:老天爷!XXX 相比于比特币更加复杂!即使是分片的 “小巧” 版本 —— 我的线性化方案,不使用 zk-SNARKS 零知识证据 —— 可以也比当前正在使用的比特币协议要复杂一到两个数量级;而现在,这个行业的许多公司似乎都不再直接使用比特币协议、转而使用中心化的 API 供应商了。实际实现上述方案、把它交到终端用户手上,不会是简单的事。

另一方面,去中心化并不便宜:使用 PayPal 又比使用比特币协议简单一到两个数量级。

—— Peter Todd,《为什么用分片技术来扩容比特币是非常困难的》(2015)

他的结论是,分片 可能 在技术上是可以实现的,但要让系统增加大量的复杂性。给定许多用户已经觉得比特币太过复杂、偏向于使用中心化的服务了,要说服他们使用更加复杂的东西是很难的。

8.3 向内扩容

尽管水平扩容和垂直扩容都曾在中心化的系统(比如数据库和互联网服务器)上大放异彩,但因为其中心化效果,它们似乎并不适合比特币这样的去中心化系统。

一种获得的关注少得多的方法,我们可称为 “向内扩容(inward scaling)”,翻译过来就是 “以少御多”。它指的是许多开发者的持续工作:优化已经在服役的算法的表现,从而我们可以在系统现有的局限性下做得更好。

已经通过向内扩容实现的提升是让人惊讶的 —— 这完全没有夸张。为了给你一个基本印象,关于这些年来的提升,Jameson Lopp 曾为区块链同步运行基准测试,比较了从 0.8 版本以来的 Bitcoin Core

Bitcoin-Core-Sync-Performance-1

- 图 7. 多个版本的 `Bitcoin Core` 的初始化区块下载的性能。Y 轴是同步到的区块高度,X 轴是同步到该高度所花费的时间 -

不同颜色的线代表的是不同版本的 Bitcoin Core。最左边的那条是最新版本,版本0.22,是在 2021 年 9 月发行的,花了 396 分钟就完成了同步。最右边的是 0.8 版本,发行于 2013 年 11 月,花了 3452 分钟才完成同步。所有这些提升 —— 大概是 10 倍的性能 —— 都是靠向内扩容实现的。

这些提升可以归类为节约空间(内存、磁盘、带宽,等等)或者节约计算力。不管是哪类提升,都对上图中的提升有帮助。

计算优化的一个好例子是 libsecp256k1 库,这个库(和其它部分)实现了生成和验证电子签名的密码学原语。Pieter Wuille 是这个库的贡献者之一,他曾经发一条长推特来展示性能提升是如何在多个 PR 中实现的。

libsecp256k1speedups

- 图 8. 签名验证的性能如何逐渐提升;重要的 PR 在 X 轴上标出 -

上图展示了在两种 64 位的 CPU 类型(ARM 和 x86)上,验证签名的性能变化趋势。两类 CPU 的性能出现区别的原因在于,x86 架构有更多的专门指令可用,而 ARM 架构可用的指令更少,更通用。然而,两种架构上出现了同样的趋势。请注意,Y 轴是对数单位,这削弱了视觉上的冲击力;实际效果会更令人惊讶。

还有许多节约空间的提升的好例子。在关于 “Taproot” 如何有助于节约空间的 Medium 博文中,Murch 比较了各种 2-of-3 阈值签名脚本要占用的区块空间;在 Taproot 脚本中实现 2-of-3 阈值签名还有多种方式。

murch-taproot

- 图 9. 不同花费脚本的区块空间用量;Taproot 对比更加传统的脚本类型 -

使用原生隔离见证脚本的 2-of-3 阈值签名需要总计 104.5 + 43 vB = 147.5 vB(虚拟字节);而最为节约空间的 Taproot 脚本只需要 57.5 + 43 vB = 100.5 vB (在标准使用场景中)。在最差劲,同时也罕见的情形中,比如一个签名器因为某种原因而不可用的情形中,Taproot 脚本将使用 107.5 + 43 vB = 150.5 vB 。你不需要理解所有的细节,也能看出,开发者是如何思考空间节约的 —— 锱铢必较。

译者注:Taproot 脚本在许多情况下能够减少交易的区块空间用量 —— 但不是以裸字节数量计量,而是以 “vB(虚拟字节)” 这个单位来计量。隔离见证升级之后,交易的不同部分(可简单区分为交易本体数据和签名数据)在计算区块空间用量时会有换算的乘数,就是 vB 这个单位的来源。不过,用户使用的脚本类型的变更,很难说因为其交易体积减小而对图 7 所示的初始化同步速度提升有帮助,因为区块体积不一定减小了;可能主要还是来自隔离见证及后续版本脚本的验证运算负担本身降低了。

除了比特币软件的向内扩容,还有许多方法,能让用户也为向内扩容作出贡献。他们可以更加从聪明地制作交易,从而节约交易手续费,同时,还能减少他们对全节点资源的占用。两种常用的技术都朝向这个目标,分别叫做 “交易批量处理” 和 “输出整合”。

交易批量处理的想法是将多笔支付组合成一笔交易,而不是各自构成一笔交易。这可以给你节约许多交易手续费,同时减少区块空间占用。

tx-batching

- 图 10. 交易批量处理将多笔支付合并为一笔交易,以节约手续费 -

输出整合的想法是利用对区块空间需求较低的时期,将多个交易输出合并为单个输出。这可以在日后节约你的手续费,当你需要在区块空间需求较高的时候发起交易。

utxo-consolidation

- 图 11. 输出整合。在网络的手续费率较低时,将你的多个钱币铸造为一个,这样可以在日后节约手续费 -

输出整合如何算是内部扩容,可能并不明显。毕竟,区块链的数据可能会因为使用了这种方法而稍微增加。但是,UTXO 集,即追踪哪个地址拥有哪个钱币的数据库,会因为你花费的 UTXO 多于创建的 UTXO 而收缩。这就舒缓了全节点维护 UTXO 集的负担。

不幸的是,这两种 UTXO 管理 技术可能损害你或者你的收款方的隐私性。在批量处理情形中,每个收款人都将知道,被批量处理的输入都来自于你,而其它每个输出都给了一位收款人(除了那个找零,给了你自己)。而在 UTXO 整合中,你会揭晓这些被整合的输出都来自于同一个钱包。你可能必须在成本效率和隐私性之间作出取舍。

8.2.4 分层扩容

最有力的扩容方法可能就是 “分层” 了。分层背后的想法是,一套协议可以结算用户之间的支付,而无需让区块链来确认他们的交易。这已经在章节 2中文译本)和章节 3.7中文译本)中简要讨论了。

一个分层协议的起点是,两个或更多人同意一笔起点交易,并将它发布到区块链网络中,如图 12 所示。

scaling-layer

- 图 12. 一个标准的 layer 2 协议,建立在比特币 layer 1 之上 -

这个起点交易是如何构造的,因协议而异,但一种通用的方案是,参与者们先创建一笔待签名的起点交易,以及一系列预签名的惩罚交易;这些惩罚交易会以不同方式花费起点交易的输出。然后,起点交易才收集到所有的签名,并广播到区块链,而(保留在各用户手上的)惩罚交易可以获得全部签名并发布到区块链来惩罚行为不轨的参与者。这激励各方都信守承诺,从而协议可以获得免信任性。

一旦起点交易得到区块确认,协议就能开始工作。比如说,它可以在参与者之间实现非常快的支付、实现一些保护隐私的技术,或者实现比特币区块链无法支持的更加高级的脚本编程。

我们不会细说各个具体的协议如何工作,但正如你可以在图 12 中看到的,在分层协议的整个生命周期中,区块链很少被用到。所有有趣的动作都发生在 链外 。我们已经看到了这可能会增强隐私性(如果正确实现的话),但它同时也有利于可扩展性。

在一篇标题为《登上月球需要多级火箭,不然火箭等式就会吃掉你的午餐 …… 把所有小丑模样的人都放上投石车然后等待成功,是正确做法》的 Reddit 帖子中,Gregory Maxwell 解释了为什么分层是让比特币吞吐量扩大几个数量级的最佳方法。

一开始,他强调了将 Visa 和 Mastercard 视为比特币的主要竞争对手是错误的,以及,提高区块体积限制是因为这样的谬误而提出的错误方法。然后,他讲到了如何利用分层来真正改变局面。

所以,这是不是说,比特币无法成为支付技术的大赢家?不是。仅仅是说,为了具备服务全世界的支付需求的那种吞吐量,我们必须更加聪明。

从一开始,比特币就被设计成可以通过它的智能合约编程能力安全地结合各种层级(怎么,你以为这只是为了让人们能够把毫无意义的 “去中心化自治组织(DAOs)” 吹成宇宙级发明吗?)。是时候,我们将使用比特币系统作为一种非常容易访问、完全可信的机器人法官,然后在法庭外面管理我们的绝大部分商业 —— 只是,我们的交易方式将决定了,如果什么事情出了错,我们会持有所有的证据和已经建立的合同,从而确信这个机器人法庭会作出正确决定。(极客侧边注:如果这看起来是不可能的,请回头看看这篇关于交易 cut-through 的旧文章。)

这是可能的,就因为比特币的核心属性。一个可审查的、可以逆转的基础系统,并不适合在上面开发强大的上层交易处理系统 —— 而且,如果底层资产并不可靠,用它来交易也没有什么意义。

—— Gregory Maxwell,r/Bitcoin on Reddit (2016)

这个法官的比喻非常形象地说明了分层的工作原理:法官必须是廉洁的,而且不能反复无常,否则,在比特币基础层之上的层级也将无法可靠地工作。

他接着提出了对中心化服务的看法。通常来说,为了使用微不足道数量的比特币,信任一个中心服务器没有什么问题:那也是一种分层扩容。

在 Maxwell 写了这篇文章之后,许多新的层级出现了,他的话依然正确。闪电网络的成功,证明了分层是提高比特币有用性的正道。

8.3 结论

我们已经讨论了多种被设想过的扩容比特币(提高比特币的可用吞吐量)的方法。扩容从一开始就是人们对比特币的顾虑之一。

到了今天,我们知道了,比特币无法很好地垂直扩容(“购买更高级的硬件”)和水平扩容(“仅验证部分数据”),但可以内向扩容(“以少御多”)和分层扩容(“在比特币上开发协议”)。