翻译:Kyle

区块链的可扩展性究竟能达到什么程度? 真能如 Elon Musk (特斯拉 CEO)所愿「通过将区块时间缩短 10 倍,将区块大小增加 10 倍从而将手续费降低 100 倍」,而又不会导致极端中心化并损害区块链本质的基本属性吗? 如果不能,那区块链的可扩展性究竟能达到什么程度? 如果选择通过更改共识算法来进行扩展,又会怎么样? 更重要的是,如果您更改技术以引入诸如 ZK-SNARK 或分片之类的功能,会怎么样? 从理论上讲,分片的区块链可以持续添加更多的分片,这会不会导致添加的东西更多?

事实证明,有一些重要且相当微妙的技术因素限制了区块链的扩展性,即便是采用分片的区块链也面临这些问题。 在许多情况下,我们都会有相应的扩展性解决方案,但是这些解决方案也存在局限性。 这篇文章将探讨这些可扩展性方案中存在的许多问题。

以太坊只需增加参数即可解决所有问题。但代价是什么?

普通用户也能运行节点,这对于区块链去中心化至关重要

凌晨 2:35,您收到来自世界另一端的伙伴的紧急电话,他在帮助您管理矿池(或者可能是质押池)。 您的伙伴告诉您,从大约 14 分钟前开始,您的池子和其他几个池子突然从链上分裂出来,原始链仍旧承载着 79%的网络算力。 根据您的节点,这个多数链(原始链)生产的区块是无效的。 这出现了余额错误:密钥区块似乎错误地将 450 万枚额外代币分配给了一个未知地址。

一个小时后,您开始与其他两个像您一样迷茫的矿池以及一些区块浏览器和交易所在电报群中沟通。最后你看到某人发出了一个推特链接。 该推文写道:「新的链上可持续协议发展基金正式发布」。

到了早上,推特上、社区论坛上开始充满没有审查过的论点,各种讨论无处不在。 但是这时候,此前新增发的 450 万枚代币中的很大一部分已经在链上被转换为其他资产,进而已经进行了数十亿美元的 DeFi 交易。 79%的共识节点以及所有重要浏览器和轻钱包都正在遵循这一新链条。 也许这个新的开发者基金将为某些开发提供资金,或者也许所有这些资金都会被领先的矿池,交易所等吞掉。 但是,不管结果如何,该基金在所有意图和目的上都是既成事实,而普通用户则无力反击。

以太坊好戏即将上映。也许可以由 MolochDAO 或其他机构资助

这种事情能发生在您的区块链上吗?您的区块链社区的精英,包括矿池,区块浏览器和托管节点,可能协调得很好。他们很可能都在同一个电报群和微信群中。如果他们真的想对协议规则进行突然更改以促进自己的利益,那么他们可能会这样做。以太坊区块链曾在十小时内完全解决了一个共识失败;如果您的区块链只有一个客户端实现,并且您只需要将代码更改部署到几十个节点,那么协调更改客户端代码的速度就可以更快。使这种协调的社会攻击无效的唯一可靠方法是通过去中心化社区的积极防御,也就是用户。

想象一下,如果用户正在运行验证区块链的节点(无论是直接还是通过更高级的间接技术),并自动拒绝破坏协议规则的区块,即使超过 90%的矿工或质押者支持该协议,结局会怎么样。如果每个用户都运行一个验证节点,那么这种攻击将很快失败:一些矿池和交易所将分叉,但这看起来很愚蠢。但是,即使只是某些用户运行了验证节点,该攻击也不会为攻击者带来胜利。相反,这将导致混乱,因为不同的用户会看到不同的链。至少,随之而来的市场恐慌和可能持续的链分裂将大大降低攻击者能够获得的利润。要解决冲突所需要的大量时间成本本身就会让攻击者放弃攻击想法。

让我们搞清楚一点:你对恶意协议更改的抵抗来自于一种由用户验证区块链的文化,而不是 PoW 或 PoS。

——Hasu

以太坊这一点可以看 Hasu 怎么说的

如果您的社区由 37 个节点运行者和 80000 个被动听众组成,他们负责用于检查签名和区块头,那么攻击者将获胜。 如果您的社区的每个人都在运行节点,那么攻击者将会失败。 我们不知道针对协同攻击的「牛群免疫」的确切阈值是多少,但是有一件事情是绝对清楚的:节点越多越好,节点越少越糟糕,我们肯定需要不止几十个或几百个。

那么,我们需要全节点完成多少工作?

为了最大化可以运行节点的用户数量,我们将重点关注常规的消费级硬件。 可以通过要求一些容易购买的专用硬件(例如,从 Amazon 购买)来增加一些网络容量,但是实际上这并没有给扩展性带来太多增加。

全节点处理大量交易的能力存在三个关键限制:

  • 计算能力:在安全运行一个节点的情况下,需要占用多少百分比的 CPU 能力?
  • 带宽:考虑到当前互联网连接的现实情况,一个区块可以包含多少个字节?
  • 存储:我们可以要求用户存储多少 GB 磁盘? 另外,读取速度要求多快? (HDD 机械硬盘可以用吗?还是说需要固态硬盘?)

许多对使用「简单」技术可将区块链扩展到多远的错误观点,是由于对这些数字中的每个都过于乐观。 我们可以一一介绍一遍这三个因素:

计算能力

  • 错误:100%的 CPU 能力可以用于区块验证
  • 正确:大约 5-10%的 CPU 能力可用于区块验证

百分比如此低主要原因有四个:

  • 我们需要一个安全边际来应对 DoS 攻击的可能性(攻击者为利用代码弱点而进行的交易比常规交易需要更长的处理时间)
  • 节点离线后需要能够同步链。 如果我断开网络一分钟,我应该能够在几秒钟内再次与网络同步
  • 运行节点不应太快耗尽电池电量,也不应使所有其他应用程序的运行变慢
  • 节点还需要执行其他非区块生产任务,主要围绕在 p2p 网络上验证和响应传入的交易和请求。

请注意,直到最近,大多数针对「为什么只有 5-10%?」的解释专注于一个不同的问题:由于 PoW 区块是随机出现的,因此验证区块所花费的时间较长,会增加同时创建多个区块的风险。 有许多解决此问题的方法(例如,Bitcoin NG,或使用 PoS)。 但是这些修补程序不能解决其他四个问题,因此它们无法像许多人最初认为的那样在扩展性方面带来巨大的好处。

并行性也不是万能的。 通常,即使是看似单线程的区块链客户端也已经并行化:签名可以由一个线程验证,而执行则由其他线程完成,并且有一个单独的线程在后台处理交易池逻辑。 而且,越接近所有线程 100%的使用率,运行节点所消耗的能量就越多,并且抵御 DoS 的安全边际也越低。

带宽

  • 错误:如果我们每 2-3 秒就有产出 10 MB 大小的数据区块,那么大多数用户的网络速度都 > 10 MB / 秒,因此他们当然可以处理这样的区块
  • 正确:也许我们可以每 12 秒处理 1-5 MB 的区块。这已经很难了。

如今,我们经常听到关于互联网连接可以提供多少带宽的广告统计数据:通常听到 100 Mbps 甚至 1 Gbps 的数字。但是,由于以下几个原因,广告中的带宽和预期的实际带宽之间存在很大差异:

  1. 「 Mbps」是指「每秒数百万个比特」;比特是字节的 1/8,因此您需要将广告的比特数字除以 8 以获得广告中的字节数。
  2. 就像所有公司一样,互联网提供商经常说谎。
  3. 总是有多个应用程序使用同一互联网连接,因此节点无法占用整个带宽。
  4. p2p 网络不可避免地会带来其自身的开销:节点经常最终会多次下载并重新上载同一区块(更不用说在包含在区块中之前通过 mempool 广播的交易)。

Starkware 在 2019 年进行了一次实验,他们首次发布了 500 kB 的区块,这是因为交易数据 gas 成本的降低首次使这种可能性成为可能,但实际上有几个节点无法处理该大小的区块。此后,处理大区块的能力得到了改善,并将继续得到改善。但是,无论我们做什么,我们仍然无法天真地获取以 MB / 秒为单位的平均带宽,让自己相信我们可以接受 1 s 的延迟,并且能够拥有如此大小的区块。

存储

  • 错误:10 TB
  • 正确:512 GB

您可能会猜到,这里的主要论点:理论与实践之间的差异。从理论上讲,您可以在亚马逊上购买 8 TB 固态硬盘(您确实需要 SSD 或 NVME; HDD 太慢,无法存储区块链状态)。实际上,用于撰写此博客文章的笔记本电脑具有 512 GB 存储空间,并且如果您让人们去购买自己的硬件,则其中许多都只会变得很懒惰(或者他们买不起 800 美元的 8 TB SSD),并且使用中心化提供商。即使您可以将区块链安装到某个存储上,高水平的活动也可以轻松地快速刻录到磁盘上,并迫使您不断购买新磁盘。

以太坊一组区块链协议研究人员对每个人都有多少磁盘空间进行了调查。 我知道样本量很小,但仍然可以说明一些问题

此外,存储大小决定了新节点能够联机并开始参与网络所需的时间。 现有节点必须存储的任何数据都是新节点必须下载的数据。 初始同步时间(和带宽)也是用户运行节点的主要障碍。 在撰写此博客文章时,同步新的 geth 节点花了我大约 15 个小时。 如果以太坊的使用量增加了 10 倍,那么同步一个新的 geth 节点将至少花费一周的时间,这很可能导致您的网络连接受到限制。 在攻击过程中,当对攻击的成功响应涉及到从未运行过节点的新用户时,这尤其重要。

交互效应

此外,这三种成本之间存在交互作用。 由于数据库内部使用树结构来存储和检索数据,因此从数据库中获取数据的成本随数据库大小的对数增加而增加。 实际上,因为可以将顶层(或顶部的几层)缓存在 RAM 中,所以磁盘访问成本与数据库的大小成正比,是缓存在 RAM 中的数据大小的倍数。

以太坊不要从字面上看这张图。 不同的数据库以不同的方式工作,并且内存中的部分通常只是一个单层(但很大)(请参阅 leveldb 中使用的 LSM 树)。 但是基本原理是相同的

例如,如果缓存为 4 GB,并且我们假设数据库的每一层都比前一层大 4 倍,则以太坊当前的〜64 GB 状态将需要约 2 次访问。但是,如果状态大小增加 4 倍至〜256 GB,那么这将增加至〜3 次访问。因此,gas 限制增加 4 倍实际上可以转化为区块验证时间增加约 6 倍。效果可能更强:硬盘已满时,读取和写入所需的时间通常比硬盘快用完时要更长。

那么这对以太坊意味着什么呢?

如今,在以太坊区块链中,尽管在常规硬件上仍然可行(我在写这篇文章时只是在笔记本电脑上同步了一个节点!),但运行一个节点已经对许多用户构成挑战。因此,我们正在接近瓶颈。核心开发人员最关心的问题是存储大小。因此,目前,在解决计算和数据瓶颈方面的英勇努力,甚至是对共识算法的更改,都不太可能导致人们接受的 gas 限制大幅度增加。即使解决了以太坊最大的突出 DoS 漏洞,也只能使 gas 限制增加 20%。

解决存储大小问题的唯一方法是无状态(Statelessness)和状态到期(State expiry)。 无状态允许一类节点在不维护永久性存储的情况下验证区块链。 状态到期会释放出最近未访问的状态,需要用户手动提供继续维护这些状态的证据。 这两种路径都已经使用了很长的时间,并且关于无状态的概念验证实现也已经开始。 这两项改进相结合,可以极大地缓解这些担忧,并为大幅提高 gas 限制打开空间。 但是,即使在实施了无状态和状态到期之后,gas 限制可能也只能安全地增加大约 3 倍,然后其他局限性再次开始主导。

分片之后会发生什么?

分片(Sharding)从根本上克服了上述限制,因为它使区块链中包含的数据与单个节点需要处理和存储的数据脱钩,而不是节点通过亲自下载和执行来验证区块,而是使用先进的数学和密码技术来间接验证区块。

结果就是,采用分片的区块链可以安全地拥有非分片区块链无法做到的非常高的交易吞吐量。 这确实需要很多密码学上的聪明才智来创建能成功地拒绝无效区块的完全验证的有效替代品,但是可以做到这一点:该理论已经建立并且基于规范草案的概念验证已经在研究之中。

以太坊

以太坊正计划使用二次分片,其总体可扩展性受到以下事实的限制:节点必须能够处理单个分片和信标链,而信标链必须对每个分片执行一定的管理工作。 如果分片太大,则节点将无法再处理单个分片;如果分片太多,则节点将无法再处理信标链。 这两个约束的乘积就形成了一种上限。

可以想象,可以通过三次分片甚至指数分片来走得更远。 在这种设计中,数据可用性采样肯定会变得更加复杂,但可以做到。 但是以太坊不会采用比二次分片更高的分片了。 原因是,从交易的分片的分片实际上无法实现额外的扩展性增益,除非其他风险开始变得不可接受地高。

那么这些风险是什么?

最小用户数

可以想象,即使只有一个用户愿意参与其中,非分片的的区块链也可以运行。而分片区块链不是这样的:没有单个节点可以处理整条链,因此您需要足够的节点,以便它们至少可以一起处理区块链。如果每个节点可以处理 50 TPS,而整条链可以处理 10000 TPS,则该链至少需要 200 个节点才能生存。如果该链在某个时候少于 200 个节点,则要么节点无法再跟上链,要么节点停止检测无效块,否则可能会发生其他不良情况,具体取决于节点软件如何设置的。

实际上,由于需要冗余(包括用于数据可用性采样),因此安全的最小节点数量比单纯的「链 TPS 除以节点 TPS」高出几倍;对于上面的示例,我们说是 1000 个节点。

如果分片区块链的容量增加 10 倍,则最小用户数也将增加 10 倍。现在,您可能会问:为什么我们不从容量很小的时候开始开始,在看到大量用户时增加容量,在用户数量减少时减小容量?

这里面其实有一些问题:

  1. 区块链本身无法可靠地检测到有多少个唯一用户,因此这将需要某种治理来检测和设置分片数量。针对容量限制的管理很容易成为分裂和冲突的根源。
  2. 如果许多用户突然并意外退出,该怎么办?
  3. 增加启动分叉所需的最小用户数,使得恶意接管变得更加困难。

最低用户数为 1,000,这是几乎肯定是可以的。 另一方面,最低用户数设为 100 万,这肯定是不行。 甚至将最低用户数设为 10,000,也是有点冒险的。 因此,似乎很难证明拥有超过数百个分片的分片区块链是合理的。

历史可检索性

用户真正珍视的区块链的重要属性是永久性。 当公司破产或失去维护该生态系统的兴趣时,存储在服务器上的数字资产将在 10 年内停止存在。 另一方面,以太坊上的 NFT 是永久的。

以太坊

是的,到 2372 年,人们仍能够下载和检查您的加密猫。

但是一旦区块链的容量过高,存储所有这些数据就会变得更加困难,直到某个时刻存在很大的风险,历史的某些部分最终将……没人存储。

量化这种风险很容易。以区块链的数据容量(MB / 秒)为单位,乘以〜30 即可得到每年以 TB 为单位存储的数据量。当前的分片计划的数据容量约为 1.3 MB / 秒,因此约为 40 TB / 年。如果将其增加 10 倍,则将变为 400 TB / 年。如果我们希望数据不仅可以访问,而且可以方便地访问,那么我们还需要元数据(例如,对汇总交易进行解压缩),因此,这就是每年 4 PB,或者十年后达到 40 PB。 互联网档案(Internet Archive)才使用 50 PB。因此,这是分片区块链安全的合理体积上限。

因此,看起来在这两个维度上,以太坊分片设计实际上已经大致针对相当合理的最大安全值。常数可以增加一点,但不能增加太多。

总结

尝试扩展区块链的方法有两种:基本的技术改进和简单地增加参数。首先,增加参数听起来很有吸引力:如果您是在餐巾纸上进行数学运算,这就很容易让自己相信家用笔记本电脑每秒可以处理数千笔交易,不需要 ZK-SNARK,汇总或分片。不幸的是,有很多微妙的理由可以解释为什么这种方法从根本上是有缺陷的。

运行区块链节点的计算机无法花费 100%的 CPU 能力来验证区块链;他们需要很大的安全边际来抵抗意外的 DoS 攻击,他们需要备用容量来执行诸如在内存池中处理交易之类的任务,并且您不希望在计算机上运行节点以使该计算机无法同时用于任何其他应用程序。带宽同样也有水分:10 MB / s 的连接并不意味着您每秒可以拥有 10 MB 的区块!也许是每 12 秒才能有 1-5 MB 的块。这与与存储相同。增加对运行节点的硬件要求以及将节点的运行限制在专门的参与者上并不是一种解决方案。对于去中心化的区块链而言,对于普通用户而言,能够运行节点并形成一种文化,即运行节点是一种普通活动,这一点至关重要。

另一方面,根本的技术改进是可行的。 当前,以太坊的主要瓶颈是存储大小,而无状态性和状态到期可以解决此问题,并允许将其增加最多约 3 倍——但不能更多,因为我们希望运行一个节点比现在更容易。 采用分片的区块链可以进一步扩展,因为分片的区块链中单个节点不需要处理每笔交易。 但是即使是分片区块链,容量也有局限性:随着容量的增加,最小安全用户数增加,归档区块链的成本(以及如果没有人去归档链,数据存在丢失的风险)就会上升。 但是我们不必太担心:这些限制足够高,以至于我们可以在保证区块链的完全安全性的同时每秒处理超过一百万笔交易。 但是在不牺牲使区块链如此有价值的去中心化性质的前提下,还将需要做一些工作。

特别感谢 Felix Lange,Martin Swende,Marius van der Wijden 和 Mark Tyneway 为本文提供的反馈和评论。