区块链可扩展性的限制

本文深入探讨了区块链可扩展性的限制,分析了影响区块链扩展的多个技术因素,包括计算能力、带宽和存储要求。作者提到,在确保去中心化的同时,区块链技术需要进行根本性的技术改进,如无状态性和状态过期等,以解决当前的瓶颈。同时,分片技术被认为能够进一步提高扩展性,但也带来了对用户数量和历史数据存储的风险。总结上,这篇文章强调了在提升区块链性能的过程中,保持去中心化的重要性。

区块链可扩展性的局限性

区块链可扩展性的局限性

特别感谢 Felix Lange、Martin Swende、Marius van der Wijden 和 Mark Tyneway 的反馈和审阅。

区块链的可扩展性能推到多远? 如 Elon Musk 所希望的,你真的能“将区块时间加速 10 倍,区块大小增加 10 倍,并将费用降低 100 倍”,而不导致极端的中心化以及妥协区块链的基本属性吗?如果不能,那你能做到多远?如果你改变共识算法呢?更重要的是,如果你改变技术以引入 ZK-SNARKs 或分片等功能呢?理论上,一个分片的区块链只需不断添加更多的分片;那么是否存在添加过多的分片的情况?

事实证明,无论是否使用分片,限制区块链扩展性的因素是重要且相当微妙的。在许多情况下都有解决方案,但即便有解决方案也存在限制。本文将逐一讨论这些问题。

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

在凌晨 2:35,你接到了来自在世界另一端的伴侣的紧急电话,她帮助管理你的矿池(也可能是质押池)。大约在 14 分钟前,你的伴侣告诉你,你的矿池和其他几个矿池从还承载着 79% 网络的链上分叉出来。根据你的节点,主要链的区块是无效的。出现了余额错误:关键区块似乎错误地将 450 万个额外的币分配给了一个未知地址。

一个小时后,你和其他两个小矿池(也像你一样感到措手不及)以及一些区块浏览器和交易所进行了电话聊天。你终于看到有人粘贴了一个推文链接,里面包含了一则发布消息。“宣布新的链上可持续协议开发基金。”推文开头写道。

到了早晨,Twitter 上关于此话题的争论以及在唯一没有审查讨论的社区论坛上的讨论泛滥开来。但是到那时,450 万个币中很大一部分已经在链上转换为其他资产,并且数十亿美元的 DeFi 交易也发生了。79% 的共识节点,所有主要的区块浏览器和轻钱包的终端都在跟随这条新链。也许新的开发基金会资助某些开发,或者可能会被领先的矿池和交易所及其亲信全部挪用。但无论结果如何,该基金在实际意义上已经既成事实,普通用户没有任何反击的方式。

这会在你的区块链上发生吗? 你的区块链社区的精英,包括矿池、区块浏览器和托管节点,可能协调得相当好;很可能他们都在相同的 Telegram 频道和微信群组里。如果他们真的 组织一次突如其来的协议规则变更来进一步促进自己的利益,那么他们可能能够做到。以太坊区块链已在十个小时内完全解决 共识故障;如果你的区块链只有一个客户端实现,并且你只需要对几十个节点进行代码更改,协调客户端代码的更改可以执行得更快。避免这种社会攻击有效的唯一可靠方法是通过一种已经去中心化的利益相关者:用户的被动防御。

想象一下如果用户在运行验证链的节点(无论是直接还是通过 更先进的间接技术)的情况下,这个故事将如何发展,并在即使超过 90% 的矿工或质押者支持这些区块的情况下,自动拒绝违反协议规则的区块。如果 每个 用户都运行一个验证节点,那么攻击将很快失败:几个矿池和交易所将会分叉,看起来非常愚蠢。但即使 有些 用户运行验证节点,这次攻击也不会导致攻击者的 干净胜利;相反,它将导致 混乱,不同的用户对链的视图各不相同。至少,随之而来的市场恐慌以及可能持久的链分裂将大大减少攻击者的利润。面对如此长期的冲突,想象前进的过程就会抑制大多数攻击。

如果你有一个由 37 个节点运行者和 80000 个被动监听者组成的社区,检查签名和区块头,那么攻击者就会获胜。如果你有一个每个人都能运行节点的社区,攻击者就会失败。我们不知道何为 群体免疫 抵御协调攻击的确切阈值,但有一件事是显而易见的:节点越多越好,节点越少越坏,我们绝对需要超过几十个或几百个节点。

那么,我们可以要求全节点做多少工作的局限性是什么?

为了最大化能运行节点的用户数量,我们将专注于普通消费硬件。有些通过要求购买一些容易获取的专业硬件(例如,从亚马逊)实现的容量增加,实际上并不会大幅提高可扩展性。

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

  • 计算能力:我们可以安全要求运行节点的 CPU 使用率为多少百分比?
  • 带宽:根据当前互联网连接的现实,一个区块可以包含多少个 字节
  • 存储:我们可以要求用户存储多少 GB 的数据?此外,读取速度必须多少?(即硬盘驱动器是否可以,还是我们需要固态硬盘)

许多对区块链如何使用“简单”技术扩展到何种程度的错误理解源于对每个数字过于乐观的估计。我们可以逐一分析这三个因素:

计算能力

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

限制如此之低的原因有四个主要原因:

  • 我们需要安全边际,以应对 DoS 攻击(攻击者设计的交易利用代码中的弱点,处理时间比正常交易长)。
  • 节点需要在离线后能够同步链。如果我在网络上掉线了一分钟,我应该能在几秒钟内赶上进度。
  • 运行节点不应迅速耗尽电池,使所有其他应用程序变得很慢。
  • 节点还需要执行其他非区块生成的任务,主要是验证和响应 p2p 网络上的传入交易和请求。

请注意,直到最近,大多数关于“为什么只能 5-10%?”的解释都集中于另外一个问题:由于 PoW 区块会在随机时间出现,验证区块所需的时间过长会增加多个区块同时生成的风险。对此存在许多解决方案(例如 Bitcoin NG,或简单地使用权益证明)。但这些解决方案并不能解决其他四个问题,因此并未如许多人最初所想的那样,带来大幅度的可扩展性提升。

并行处理也并非灵丹妙药。往往,即使是看似单线程的区块链客户端也已进行并行处理:一个线程可以验证签名,另一个线程执行交易,背景中有一个单独的线程处理交易池逻辑。当你接近所有线程的 100% 使用率时,运行节点将变得更加耗电,同时 DoS 攻击下的安全裕度也会降低。

带宽

  • 错误答案:如果我们每 2-3 秒有 10MB 的区块,那么大多数用户都有超过 10MB/sec 的网络,所以当然可以处理。
  • 正确答案可能 我们可以每 12 秒处理 1-5 MB 的区块。但这很困难。

如今,我们常常听到有关互联网连接带宽的高宣传统计数字:100 Mbps 和 1 Gbps 的数字已经很常见。然而,所宣传的带宽与连接的实际带宽预计有很大差距,原因有几个:

  1. “Mbps”指的是“每秒数百万 比特”;比特是字节的 1/8,因此你需要将宣传的比特数量除以 8 以获得宣传的字节数量。
  2. 互联网提供商和所有公司一样,往往会撒谎。
  3. 总是有多个应用程序同时使用同一互联网连接,因此节点无法占用整个带宽。
  4. p2p 网络不可避免地会引入自己的开销:节点经常最终多次下载和重新上传相同的区块(更不用说交易在被包含在区块之前通过内存池进行广播)。

当 Starkware 在 2019 年进行了一次实验,首次发布 500 kB 的区块时,这在 交易数据Gas成本降低 后成为可能,一些节点实际上无法处理这种大小的区块。处理大区块的能力此后有所提升,并且将继续改善。但无论我们做什么,我们仍然离能够简单取平均带宽的 MB/sec,相信我们在 1s 延迟上没问题,而拥有这样的区块远远大于现实。

存储

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

这里的主要论点显而易见,和其他地方的论点一样:理论与实践的差距。在理论上,有 8 TB 固态硬盘 可在亚马逊购买(你 确实 需要 SSD 或 NVME;HDD 对于存储区块链状态来说太慢了)。在实践中,用于撰写本博客文章的笔记本电脑只有 512 GB,如果让大家自己去购买硬件,很多人会变得懒惰(或者他们买不起 800 美元的大容量 SSD),最终使用一个集中提供者。即便你能将区块链存储到某些存储中,较高的活动水平也可以快速消耗磁盘,强迫你不断获取新的磁盘。

此外,存储大小决定了新节点上线并开始参与网络所需的时间。现有节点必须存储的任何数据是新节点必须下载的数据。这一初始同步时间(和带宽)也是用户运行节点的主要障碍。在撰写本博文时,同步一个新的 geth 节点花了我大约 15 小时。如果以太坊的使用量增加了 10 倍,同步新的 geth 节点将至少需要一周的时间,并且更有可能导致你的互联网连接变得滞后。 在攻击期间,这一点尤其重要,当对攻击的成功回应可能需要许多之前未运行节点的用户快速启动新的节点时。

交互影响

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

例如,如果缓存是 4 GB,并假设数据库的每一层比前一层大 4 倍,那么以太坊当前的 ~64 GB 状态将需要 ~2 次访问。但如果状态大小增加 4 倍达到 ~256 GB,那么访问将增加到 ~3 次(即每次读取的访问次数将变为 1.5 倍)。因此,将Gas上限增加 4 倍可能会使区块验证时间增加 ~6 倍。这个影响可能更强烈:当硬盘接近满时,读取和写入的时间往往比接近空时要长。

这对以太坊意味着什么?

如今,在以太坊区块链上,运行一个节点对许多用户来说已经很具挑战性,尽管在普通硬件上至少仍然是 可能的 (我在写这篇文章时刚同步了一个节点!)。因此,我们已接近瓶颈。 核心开发人员最关心的问题是存储大小。 因此,目前,即使对计算和数据瓶颈的努力以及对共识算法的改变,不太可能导致Gas上限的大幅增加被接受。即使 解决以太坊最大的未解决 DoS 漏洞 也仅仅导致了 20% 的Gas上限增加。

解决存储大小问题的唯一方案是 无状态和状态过期无状态性 允许验证链的节点 无需 保持永久存储。状态过期 会将未被近期访问的状态推出,迫使用户手动提供证明以更新它。这两个方向的研究已进行了很长时间,关于无状态性的概念验证实现也已经开始。这两项改进结合可以大大缓解这些问题,为显著的Gas上限增加开辟空间。但即便无状态和状态过期实现后,Gas上限可能最多只能安全增加 ~3 倍,直到其他限制开始占据主导。

另一个可能的中期解决方案是利用 ZK-SNARKs 来验证交易。ZK-SNARKs 将确保普通用户不必亲自存储状态 验证区块,尽管他们仍需下载区块中的所有数据以保护免受 数据不可用攻击。此外,即使攻击者无法强制通过 无效 的区块,如果容量增加到运行共识节点变得 过于 困难,那么仍存在协调审查攻击的风险。因此,ZK-SNARKs 无法无限增加容量,但它们仍然可以在相当大的范围内增加容量(可能增1-2个数量级)。一些链正在探索这一Layer1 的方法;以太坊通过称为 ZK rollups 的第二层协议(例如 [zksync](https://zksync.io/)、[Loopring](https://loopring.org/) 和 Starknet)获得了这一方法的好处。

那么分片后会发生什么?

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

因此,分片区块链可以安全地具有非分片区块链所无法达到的高交易吞吐量。这确实需要加密方面的很多聪明才智,以创造高效替代方案来替代天真的完全验证,从而成功拒绝无效区块,但这可以做到:相关的 理论 已经 得到很好的确立,基于 草案规范 的概念验证也已经 在研发中

以太坊计划采用 二次分片 ,因为总可扩展性受到节点必须处理单个分片和必须为每个分片执行一些固定管理工作的 beacon链的限制。如果分片太大,节点将无法再处理单个分片;如果分片数量过多,节点将无法处理 beacon 链。前者与后者的乘积形成了上限。

理论上,可以通过立方分片甚至指数分片进一步推动。然而,此类设计中的数据可用性采样将变得更加复杂,但它是可行的。但以太坊不会进一步推进超过二次分片。原因在于,从交易分片到子分片的额外可扩展性收益实际上无法实现,因为其他风险将变得不可接受地高。

那么这些风险是什么?

最低用户数量

非分片区块链理论上只要有一个用户关注参与就可以运作。分片区块链并非如此:没有单个节点可以处理整个链,因此你需要足够的节点,以便它们至少能够 共同 处理该链。如果每个节点可以处理 50 TPS,而链可以处理 10000 TPS,那么该链至少需要 200 个节点才能存活。如果链在任何时候达到少于 200 个节点,那么要么节点无法跟上链,要么节点无法检测到无效区块,或者可能发生其他坏事,这取决于节点软件的设置。

在实践中,安全的最小数量远高于天真的“链 TPS 除以节点 TPS”启发法,因为还需要冗余(包括 数据可用性采样);对于上面的例子,它让我们称之为 1000 个节点。

如果一条分片区块链的容量增加 10 倍,最低用户数量也会增加 10 倍。现在,你可能会问:为什么不从一些容量开始,并仅在看到大量用户时才增加容量,实际需要时再增加,用户数量降低时再减少?

这方面存在一些问题:

  1. 区块链本身无法可靠地检测其上的唯一用户数量,因此这需要某种治理来检测并设定分片数量。治理区块链的容量限制 可能很容易成为分歧和冲突的焦点
  2. 如果许多用户同时突然意外退出怎么办?
  3. 增加启动硬分叉所需的最低用户数量会使抵御敌意接管变得更加困难。

最低用户数量少于 1000 是几乎肯定没问题的。另一方面,最低用户数量为 100 万显然是不可行的。即使低于 10,000 的最低用户数量,也可以说风险开始上升。因此,似乎难以证明分片区块链能拥有超过几百个分片

历史可获取性

用户真正重视的区块链的重要属性是 永续性。存储在服务器上的数字资产将在公司破产或失去对该生态系统的维护兴趣时停止存在。而以太坊上的 NFT,则 永远存在

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

量化这种风险是简单的。获取区块链的数据容量以 MB/sec 为单位,然后乘以 ~30,以获得每年的数据存储量(以 TB 为单位)。当前的分片规划数据容量约为 ~1.3 MB/sec,所以大约 40 TB/年。如果提高 10 倍,这将变为 400 TB/年。如果我们希望数据不仅可访问,而且能 方便 访问,我们还需要元数据(例如,解压缩 rollup 交易),所以将其设置为 4PB/年,即十年后为 40PB。互联网档案馆使用 50PB。所以这是分片区块链可以安全扩展到的合理上限。

因此,在这两个维度上,以太坊的分片设计实际上已经十分接近合理的安全最大值。这些常数可以 稍微 增加,但不能增加太多。

总结

有两种方法来尝试扩展区块链:根本性的技术改进简单地增加参数。增加参数在一开始听起来非常吸引人:如果你在便签纸上做算术,很容易说服自己,消费级笔记本电脑可以处理数千个交易,无需 ZK-SNARKs或 rollups或分片。不幸的是,这种方法存在许多微妙的原因,根本上是有缺陷的。

运行区块链节点的计算机无法将 100% CPU 功率用于链验证;为了抵御意外的 DoS 攻击,它们需要较大的安全边际,需要用于处理内存池中交易等任务的额外能力,并且你不希望在计算机上运行节点使得该计算机在同一时间无法用于 任何 其他应用。带宽同样有开销:10 MB/s的连接并不意味着你每秒可以生成 10MB 的区块!可能每 12 秒生成 1-5MB 的区块。这在存储方面也是相同的。增加运行节点的硬件要求并将运行节点的权限限制在专业参与者中 不是 解决方案。 对于区块链的去中心化,普通用户能够运行节点,并拥有将节点作为常见活动的文化是至关重要的

另一方面,根本的技术改进是 _可以_奏效的。目前,以太坊的主要瓶颈是存储大小,无状态和状态过期可以解决此问题,并允许最多增加约 ~3 倍——但不能超过,因为我们希望运行节点变得比现在 更容易分片区块链可以扩展得更远,因为在分片区块链中,没有单个节点需要处理 每个 交易。但即便在这里,容量也存在限制:随着容量的增加,最低安全用户数量增加,归档链的成本(以及在没有人费心归档链时数据丢失的风险)也增加。但我们并不必过于担忧:这些限制足够高,因此我们可能可以用区块链的完全安全性处理超过一百万个交易每秒。但是,必须付出努力,以做到这一点而不牺牲造就区块链如此有价值的去中心化。

  • 原文链接: vitalik.eth.limo/general...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Vitalik Buterin
Vitalik Buterin
https://vitalik.ca/