【翻译】区块链可扩展性的限制

作者:维塔利克·布特林
原文发布时间:2021 年 5 月 23 日
原文链接:链接
英文标题:The Limits to Blockchain Scalability

核心思想提炼

  1. 普通节点越多,区块链越安全,这里的多不是几十个,几百个,而是越多越好,越多越安全。
  2. 以太坊区块链目前面临着性能的压力,这些压力来源于节点的计算能力带宽存储。因为期望大量的节点能够运行以太坊区块链,所以其在设计上希望能够让消费级硬件,或者说普通人能够承受的硬件可以运行以太坊区块链,但是这是目前以太坊核心开发团队面临的困境。
  3. 基于上面的因素,维塔利克认为无法简单地提升计算能力,带宽和存储能力来达到性能的要求,于是他提出了使用分片的方式来解决以太坊的性能问题。
  4. 最终,维塔利克认为可以同时走进行基础技术的提升和分片两条路来解决以太坊的性能问题。

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

你能将区块链的可扩展性推多远?你真的能像Elon Musk 所希望的那样“将区块时间加快 10 倍,将区块大小增加 10 倍,并减少 100 倍费用”,而不会导致极端中心化和损害区块链的基本属性吗(那些让区块链区别于其他技术的根本属性)?如果没有,你能走多远?如果你改变共识算法怎么办?更重要的是,如果您更改技术以引入诸如 ZK-SNARK 或分片之类的功能会怎样?理论上,分片区块链可以不断添加更多分片;有没有添加太多这样的事情?

事实证明,有重要且非常微妙的技术因素限制了区块链的扩展,无论是否有分片。在许多情况下有解决方案,但即使有解决方案也存在限制。这篇文章将讨论这其中的问题。

只需增加参数,所有问题都解决了。但代价是什么?

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

在凌晨 2 点 35 分,你接到来自世界另一端的合作伙伴的紧急电话,他帮助你运行你的矿池(或者它可能是一个 staking 池)。从大约 14 分钟前开始,你的合作伙伴告诉你,你的池和其他一些人从区块链网络中分离出来,但仍承担着 79% 的网络负载。根据您的节点,多数区块链链的块无效。有一个平衡错误:关键块似乎错误地将 450 万个额外的硬币分配给了一个未知地址。

一个小时后,你正在与其他两个和你一样一头雾水的小矿池(负责人)以及一些区块浏览器和交易所(负责人)进行电报(telegram)聊天。您终于看到有人粘贴了一条推文的链接,其中包含一条已发布的消息。 “宣布新的链上可持续协议开发基金”。

到了早上,推特和一个没有审查言论机制的社区论坛充满了(对这件事)的争论,讨论无处不在。但到那时,450 万个硬币中的很大一部分已经在链上转换为其他资产,并且发生了数十亿美元的 defi 交易。 79% 的共识节点,以及所有主要的区块浏览器和轻钱包节点,都加入了这条新链。也许新的开发基金会资助一些开发,或者可能只是被占据优势的矿池和交易所及其有关系的节点所侵占。但不管结果如何,该基金的所有目的和意图都是既成事实,普通用户没有办法反击。

电影即将上映。也许它可以由 MolochDAO 或其他东西资助。

这会发生在你的区块链上吗?你所在的区块链社区的大V,包括矿池、区块浏览器和托管节点,可能非常协调;很可能他们都在同一个电报频道和微信群里。如果他们真的想组织对协议规则的突然更改以促进自己的利益,那么他们可能可以这样做。以太坊区块链在十小时内彻底解决了共识失败;如果您的区块链只有一个客户端实现,并且您只需要将代码更改部署到几十个节点,那么协调客户端代码的更改可以更快地完成。使这种写作式社会攻击无效的唯一可靠方法,是通过一种去中心化的被动防御:大量的用户。

想象一下,如果用户正在运行验证链的节点(无论是直接验证还是通过更高级的间接技术),并且自动拒绝违反协议规则的区块,即使超过 90% 的矿工或质押者支持这些区块。如果每个用户都运行一个验证节点,那么攻击很快就会失败:一些矿池和交易所会分叉,但这么做看起来相当愚蠢。但即使只有一些用户运行验证节点,攻击也不会为攻击者带来干净利落的胜利;相反,它会导致混乱,不同的用户会看到不同的链。至少,随之而来的市场恐慌和可能持续的连锁分裂将大大减少攻击者的利润。在如此旷日持久的冲突中运行(区块链)的想法,其本身就阻止了大多数攻击。

听听 Hasu 关于这一点。

如果你有一个由 37 个节点运行和 80000 个被动监听的节点组成的社区,用于检查签名和区块头,那么攻击者就会获胜。如果你有一个社区,每个人都运行一个节点,那么攻击者就输了。我们不知道针对协同攻击的群体免疫启动阈值是多少,但有一点是绝对清楚的:好的节点越多,坏的节点越少,我们肯定需要超过几十或几百个。

那么,我们可以要求全节点完成多少工作的限制是什么?

为了最大限度地增加可以运行节点的用户数量,我们将专注于常规消费级的硬件。通过要求购买一些易于获得的专用硬件(例如从亚马逊)可以实现容量的一些增加,但它们实际上并没有增加那么多的可扩展性。

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

  • 计算能力:我们可以安全地要求多少百分比的 CPU 来运行一个节点?
  • 带宽:鉴于当前实际的互联网连接,一个块可以包含多少字节?
  • 存储:我们可以要求用户在磁盘空间上存储多少 GB 大小?此外,它必须多快可读? (即 HDD 好还是我们需要 SSD)

许多错误的看法来源于我们对这些数字的过于乐观地估计,即区块链可以使用这些“简单”技术在可扩展性上走多远。我们可以分析一下这三个因素:

计算能力

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

(CPU 功率的使用)限制如此之低有四个主要原因:

  • 我们需要一个安全边界来覆盖 DoS 攻击的可能性(攻击者利用代码中的弱点制作的交易比常规交易需要更长的时间来处理)
  • 节点在离线后又能够同步区块链。掉网一分钟,几秒就可以赶上
  • 运行一个节点不应该很快耗尽你的电池,并使所有其他应用程序非常缓慢
  • 节点还需要执行其他非区块生产的任务,主要围绕验证和响应 p2p 网络上的传入交易和请求

请注意,直到最近,大多数解释“为什么只有 5-10%?”专注于一个不同的问题:因为 PoW 区块出现的时间是随机的,验证区块需要很长时间会增加同时创建多个区块的风险。这个问题有很多修复方法(例如比特币 NG,或仅使用权益证明)。但是这些修复并没有解决其他四个问题,因此它们并没有像许多人最初认为的那样在可扩展性方面获得巨大收益。

并行性也不是灵丹妙药。通常,即使是看似是单线程区块链的客户端也已经并行化了:签名可以由一个线程验证,而执行由其他线程完成,并且有一个单独的线程在后台处理事务池逻辑。并且所有线程的使用率越接近 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 网络不可避免地引入了它们自己的开销:节点通常最终会多次下载和重新上传同一个块(更不用说交易在被包含在一个块中之前通过内存池进行广播)。

当 Starkware 在 2019 年进行一项实验时,他们在交易数据 gas 成本降低后首次发布了 500 kB 大小的块时,一些节点实际上无法处理这种大小的块。处理大块的能力已经得到改进,并将继续得到改进。但是无论我们做什么,我们离能够天真地获取以 MB/秒为单位的平均带宽,说服自己我们可以接受 1 秒的延迟,以及能够拥有那么大的块的结果仍然相去甚远。

存储

  • 错误答案:10 TB
  • 正确答案:512G​​B

正如您可能猜到的,这里的主要论点与其他地方相同:理论与实践之间的差异。理论上,您可以在亚马逊上购买 8 TB 固态驱动器(您确实需要 SSD 或 NVME;硬盘驱动器对于存储区块链状态来说太慢了)。实际上,用来写这篇博文的笔记本电脑有 512 GB,如果你让人们去购买他们自己的硬件,他们中的许多人就会变得懒惰(或者他们买不起 800 美元的 8 TB SSD)和使用中心化的提供商。即使您可以将区块链安装到某个存储设备上,高频率的活动也可以轻松快速地烧毁磁盘,并迫使您继续购买新的磁盘。

一组区块链协议研究人员对每个人拥有多少磁盘空间的民意调查。我知道样本量很小,但仍然……

此外,存储大小决定了新节点能够上线并开始参与网络所需的时间。现有节点必须存储的任何数据都是新节点必须下载的数据。这个初始同步时间(和带宽)也是用户能够运行节点的主要障碍。在写这篇博文时,同步一个新的 geth 节点花了我大约 15 个小时。如果以太坊的使用量增加 10 倍,那么同步一个新的 geth 节点至少需要一周时间,而且更有可能导致您的互联网连接受到限制。这在攻击期间更为重要,当对攻击的成功响应可能涉及许多之前没有运行过节点而启动新节点的用户。

交互效果

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

不要从字面上理解这个图;不同的数据库以不同的方式工作,通常内存中的部分只是一个(但很大)的层(参见 leveldb 中使用的 LSM 树)。但基本原理是一样的。

例如,如果缓存为 4 GB,并且我们假设数据库的每一层比前一层大 4 倍,那么以太坊当前的约 64 GB 状态将需要约 2 次访问。但是如果状态大小增加 4 倍到 ~256 GB,那么这将增加到 ~3 次访问(因此每次读取的访问次数增加 1.5 倍)。因此,gas 限制增加 4 倍,这将增加状态大小和读取次数,实际上可能转化为块验证时间增加约 6 倍。这种影响可能会更大:硬盘在满时读取和写入的时间通常比接近空时要长。

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

今天在以太坊区块链中,运行一个节点对许多用户来说已经是一个挑战,尽管它至少在常规硬件上仍然是可能的(我在写这篇文章时只是在我的笔记本电脑上同步了一个节点!)。因此,我们即将遇到瓶颈。核心开发者最关心的问题是存储大小。因此,目前在解决计算和数据瓶颈方面的努力,甚至共识算法的改变,都不太可能导致大幅增加 gas limit 被接受。即使解决了以太坊最大的未解决的 DoS 漏洞,也只导致 gas limit 增加了 20%。

存储大小问题的唯一解决方案是无状态和状态到期无状态允许一类节点在不维护永久存储的情况下验证链。状态到期将最近未访问的状态推出,迫使用户手动提供证明来更新它。这两条路径已经研究了很长时间,并且已经开始了关于无状态的概念验证实施。这两项改进相结合可以极大地缓解这些担忧,并为显着增加 gas 限制开辟空间。但即使在实施无状态和状态到期之后,gas limit 也可能只会安全地增加大约 3 倍,直到其他限制开始占主导地位。

另一种可能的中期解决方案是使用 ZK-SNARK 来验证交易。 ZK-SNARKs 将确保普通用户不必亲自存储状态或验证块,尽管他们仍然需要下载块中的所有数据以防止数据不可用攻击。此外,即使攻击者无法强制无效区块通过,如果容量增加到运行共识节点太困难的地步,仍然存在协同审查攻击的风险。因此,ZK-SNARKs 不能无限增加容量,但它们仍然可以显着增加容量(可能是 1-2 个数量级)。一些链正在第 1 层探索这种方法;以太坊通过 zksyncLoopring和 Starknet等第 2 层协议(称为 ZK rollups)从中获益。

分片后会发生什么?

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

因此,分片区块链可以安全地拥有非分片区块链无法实现的非常高水平的交易吞吐量。这确实需要很多密码学上的聪明才智,来创建有效的替代品以便成功拒绝无效块的朴素完整验证,但它可以做到:该理论已经建立,并且基于草案规范的概念共识已经在进行中

以太坊计划使用二次分片,其中总可扩展性受到以下事实的限制:节点必须能够处理单个分片和信标链,信标链必须为每个分片执行一些固定数量的管理工作。如果分片太大,节点就不能再处理单个分片,如果分片太多,节点就不能再处理信标链。这两个约束的乘积形成了上限。

可以想象,通过三次分片,甚至指数分片,可以走得更远。在这样的设计中,数据可用性采样肯定会变得更加复杂,但它是可以做到的。但以太坊并没有超越二次方。原因是,从交易分片到交易分片所获得的额外可扩展性收益实际上无法在其他风险变得不可接受的情况下实现。

那么这些风险是什么呢?

最少用户数

可以想象,只要有一个用户愿意参与,非分片区块链就可以运行。分片区块链不是这样的:没有一个节点可以处理整个链,因此您需要足够的节点,以便它们至少可以一起处理链。如果每个节点可以处理 50 TPS,而链条可以处理 10000 TPS,那么链条至少需要 200 个节点才能生存。如果链在任何时候都少于 200 个节点,那么要么节点停止跟上链的步伐,要么节点停止检测无效块,或者可能会发生许多其他坏事,具体取决于设置节点软件。

在实践中,由于需要冗余(包括数据可用性采样),最小的安全的用户数量比理论的“链 TPS 除以节点 TPS”计算方式高几倍;对于我们上面的例子,我们需要 1000 个节点。

如果分片区块链的容量增加 10 倍,则最小用户数也增加 10 倍。现在,您可能会问:为什么我们不从少量的容量开始,只有当我们看到很多用户时才增加它,所以我们确实需要它,如果用户数量回落,则减少它?

这有几个问题:

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

最低用户数低于 1,000 几乎可以肯定。另一方面,最低用户数 100 万肯定不是。即使最低用户数为 10,000 也可以说开始变得有风险。因此,似乎很难证明具有超过几百个分片的分片区块链是合理的。

历史(记录)可检索性

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

是的,在 2371 年人们仍然会下载和检查你的加密猫。处理它。

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

量化这种风险很容易。以区块链的数据容量 (MB/sec) 为单位,乘以 ~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 兆字节的块,也许吧。存储也是一样。增加运行节点的硬件要求并将节点运行限制为专门的参与者不是解决方案。对于去中心化的区块链,对于普通用户来说,能够运行节点是一个常规操作是非常重要的。

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

延伸阅读

  1. 什么是”区块 Gas Limit”

2021-12-20 17:10
https://vitalik.ca/general/2021/05/23/scaling.html#its-crucial-for-blockchain-decentralization-for-regular-users-to-be-able-to-run-a-node
https://zhuanlan.zhihu.com/p/447630311

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇