以太坊之类区块链的扩展存在各种限制 - vitalik


您能将区块链的可扩展性推进多远?正如Elon Musk希望的那样,您能否真正实现“将区块时间缩短10倍,将区块大小增加10倍并将手续费降低100倍”,而又不会导致极端的集中化并损害使区块链成为其本质的基本属性?如果没有,那你能走多远?如果您想更改共识算法怎么办?更重要的是,如果您更改技术以引入诸如ZK-SNARK或分片之类的功能,该怎么办?从理论上讲,分片的区块链可以继续添加更多的分片。有太多的东西吗?
事实证明,无论分片与否,都有重要且相当微妙的技术因素限制了区块链的扩展。在许多情况下,都有解决方案,但是即使有了解决方案,也存在局限性。这篇文章将探讨这些问题中的许多问题。
 
普通用户能够运行节点对于区块链去中心化至关重要
在凌晨2:35,您会收到来自世界另一端的伙伴的紧急电话,伙伴帮助您管理采矿池(或者可能是赌注池)。从大约14分钟前开始,伙伴就告诉您,采矿池和其他几个人从仍然承载着79%网络网络的链中分离出来。根据您的节点,多数链的块是无效的。出现平衡错误:密钥块似乎错误地将450万枚额外硬币分配给了一个未知地址。
一个小时后,您正在与其他两个像您一样懵逼的街区探险者和交流者聊天。您最终会看到某人将指向发布的消息的链接粘贴到推文上。这条推文说:“宣布分支一条新链协议实现可持续发展基金”。
到了早上,在Twitter上以及在没有审查讨论内容的一个社区论坛上的争论,讨论无处不在。但是到那时,这450万枚代币中的很大一部分已经在链上转换为其他资产,并且进行了数十亿美元的defi交易。79%的共识节点,以及所有主要的区块链探索者和钱包的端点都遵循了这一新链条。也许新的开发者基金将为某些发展提供资金;或者也许所有这些都被领先的交易所,交易所及其亲人所吞并。但是,不管结果如何,该基金在所有意图和目的上都是既成事实,而普通用户则无力反击。
这会在您的区块链上发生吗?您的区块链社区的精英,包括采矿池、区块浏览器和托管节点,可能协调得很好,他们很可能都在同一个微信群组中。如果他们真的想对协议规则进行突然更改以促进自己的利益,那么他们可能会这样做。
以太坊区块链可以再在十小时内完全解决了共识失败; 如果您的区块链只有一个客户端实现,并且您只需要将代码更改部署到几十个节点,那么协调对客户端代码的更改可以更快地完成。唯一可靠的方法,使这种社会协调攻击的失效方法是通过来自实际上分散的一个选区的被动防御:用户。
如果您有一个每个人都在运行节点的社区,那么攻击者将会失败。更多的节点就是好,更少的节点就是坏,我们肯定需要几十个或几百个以上。
 
那么,我们需要完整的节点来完成多少工作的限制是什么?
为了最大化可以运行节点的用户数量,我们将重点关注常规的消费类硬件。可以通过要求一些容易获得的专用硬件购买(例如,从Amazon购买)来实现容量的增加,但是实际上并没有增加太多的可扩展性。
完整节点处理大量事务的能力存在三个关键限制:

  • 计算能力:我们可以安全地要求运行一个节点的CPU的百分比是多少?
  • 带宽:考虑到当前互联网连接的现实情况,一个块可以包含多少个字节?
  • 存储:我们可以要求用户存储多少GB磁盘?另外,它必须多快才能被读取?(即可以使用硬盘吗,还是我们需要固态硬盘)

许多错误地认为,使用“简单”技术可以使区块链扩展多远,这是由于对每条限制都过于乐观。我们可以一一经历以下三个因素:
 
计算能力
  • 错误认识:100%的CPU能力可以花在块验证上
  • 正确认识:大约有5-10%的CPU能力可用于块验证

限制如此之低的主要原因有四个:
  • 我们需要一个安全余量来掩盖DoS攻击的可能性(攻击者为利用代码弱点而进行的交易比常规交易需要更长的处理时间)
  • 节点脱机后需要能够同步链。如果我断开网络一分钟,我应该能够在几秒钟内赶上
  • 运行节点不应很快耗尽电池电量,而会使所有其他应用程序变慢
  • 节点还需要执行其他非区块生产任务,主要围绕在p2p网络上验证和响应传入的事务和请求。

请注意,直到最近,大多数解释是“为什么只有5-10%?” 专注于一个不同的问题:由于PoW块是随机出现的,因此验证块所花费的时间较长,会增加同时创建多个块的风险。有许多解决此问题的方法(例如,Bitcoin NG或仅使用权益证明)。但是这些修补程序不能解决其他四个问题,因此它们无法像许多人最初认为的那样在可伸缩性方面带来巨大的收益。
并行性也不是万能的。通常,即使是看似单线程的区块链客户端也已经并行化:签名可以由一个线程验证,而执行则由其他线程完成,并且有一个单独的线程在后台处理事务池逻辑。而且,越接近所有线程100%的使用率,运行节点所消耗的能量就越多,并且抵御DoS的安全裕度也越低。
 
带宽
  • 错误认识:如果我们每2-3秒就有10 MB的数据块,那么大多数用户的网络速度都> 10 MB /秒,因此他们当然可以处理
  • 正确认识:也许我们可以每12秒处理1-5 MB的块。虽然很难。

如今,我们经常听到关于互联网连接可以提供多少带宽的非常高的广告统计数据:通常听到100 Mbps甚至1 Gbps的数字。但是,由于以下几个原因,公告的带宽和连接的预期实际带宽之间存在很大差异:
  1. “ Mbps”是指“每秒数百万个比特”;位是字节的1/8,因此您需要将广告位数字除以8以获得广告位字节数。
  2. 就像所有公司一样,互联网提供商经常说谎。
  3. 总是有多个应用程序使用同一Internet连接,因此节点无法占用整个带宽。
  4. p2p网络不可避免地会带来其自身的开销:节点经常最终会多次下载并重新上载同一块(更不用说在包含在块中之前通过mempool广播的事务)。

当Starkware在2019年进行实验时,他们首次发布了500 kB的区块,这是因为交易数据gas成本的降低首次使这种可能性成为可能,实际上有几个节点无法处理该大小的区块。此后,处理大型块的能力得到了改善,并将继续得到改善。但无论我们做什么,我们仍然是很远不能天真地取平均带宽MB /秒,说服自己,我们用ls好等待时间,并能够有一个是大小的块。
 
贮存
  • 错误回答:10 TB
  • 正确回答:512 GB

您可能会猜到,这里的主要论点与其他地方一样:理论与实践之间的差异。从理论上讲,您可以在亚马逊上购买8 TB固态硬盘(您确实需要SSD或NVME; HDD太慢,无法存储区块链状态)。在实践中,用于撰写此博客文章的笔记本电脑具有512 GB,如果您让人们去购买自己的硬件,则其中许多都只会变得懒惰(或者他们负担不起800美元的8 TB SSD),并且使用集中式提供商。即使您可以将区块链安装到某个存储上,高水平的活动也可以轻松地快速刻录到磁盘上,并迫使您不断购买新磁盘。
此外,存储大小决定了新节点能够联机并开始参与网络所需的时间。现有节点必须存储的任何数据都是新节点必须下载的数据。初始同步时间(和带宽)也是用户运行节点的主要障碍。在撰写此博客文章时,同步新的geth节点花了我大约15个小时。如果以太坊的使用量增加了10倍,那么同步一个新的geth节点将至少花费一周的时间,这很可能导致您的Internet连接受到限制。在攻击过程中,这尤其重要,因为对攻击的成功响应可能会导致许多用户在以前不运行节点的情况下旋转新节点。
 
互动效应
此外,这三种成本之间存在交互作用。由于数据库内部使用树结构来存储和检索数据,因此从数据库中获取数据的成本随数据库大小的对数增加而增加。实际上,因为可以将顶层(或顶层几层)缓存在RAM中,所以磁盘访问成本与数据库的大小成比例,该大小是缓存在RAM中的数据大小的倍数。
 
那么这对以太坊意味着什么呢?
如今,在以太坊区块链中,运行一个节点已经对许多用户构成挑战,尽管至少在常规硬件上仍然可行(我在写这篇文章时只是在笔记本电脑上同步了一个节点!),其实我们接近瓶颈。
核心开发人员最关心的问题是存储大小。因此,目前,在解决计算和数据瓶颈方面的英勇努力,甚至是对共识算法的更改,都不太可能导致大量的gas限制增加。即使解决了以太坊最大的突出DoS漏洞,也只能使gas限额增加20%。
解决存储大小问题的唯一方法是无状态和状态到期。无状态性允许一类节点在不维护永久性存储的情况下验证链。状态到期会推出最近未访问的状态,从而迫使用户手动提供续订的证明。这两种路径都已经使用了很长的时间,并且关于无状态性的概念验证实现也已经开始。这两项改进相结合,可以极大地缓解这些担忧,并为大幅提高gas限制打开空间。但是,即使在实施了无状态和状态到期之后,gas限制可能也只能安全地增加大约3倍,直到其他限制开始占主导地位为止。
 
分片后会发生什么?
分片从根本上克服了上述限制,因为分片将区块链中包含的数据与单个节点需要处理和存储的数据解耦。它们使用高级数学和密码技术间接验证块,而不是节点通过亲自下载和执行来验证块。
结果,分片区块链可以安全地拥有非分片区块链无法做到的非常高的交易吞吐量。这确实需要很多密码学上的聪明才智来创建能成功地拒绝无效块的幼稚的完全验证的有效替代品,但是可以做到这一点:该理论已经建立并且基于规范草案的概念验证已经在研究中。
以太坊正计划使用二次分片,其总体可扩展性受到以下事实的限制:节点必须能够处理单个分片和信标链,而信标链必须对每个分片执行一定数量的管理工作。如果分片太大,则节点将无法再处理单个分片;如果分片太多,则节点将无法再处理信标链。这两个约束的乘积形成上限。
可以想象,可以通过三次分片甚至指数分片来走得更远。在这种设计中,数据可用性采样肯定会变得更加复杂,但是可以做到。但是以太坊没有比二次分片更进一步的了。原因是,从交易分片到交易分片实际上无法实现额外的可伸缩性增益,除非其他风险变得不可接受地高。
那么这些风险是什么?
 
最小用户数
可以想象,即使只有一个用户愿意参与其中,非分片的区块链也可以运行,但是分片的区块链不是这样的:没有单个节点可以处理整个链,因此您需要足够的节点,以便它们至少可以一起处理链。
如果每个节点可以处理50 TPS,而链条可以处理10000 TPS,则该链至少需要200个节点才能生存。如果链在任何时候到达少于200个节点,则要么节点停止跟上链,要么节点停止检测无效块,否则可能会发生其他不良情况,具体取决于节点已安装的软件。
实际上,由于需要冗余(包括用于数据可用性采样),因此安全最小数量比单纯的“链式TPS除以节点TPS”启发式方法高出几倍;对于上面的示例,我们将其称为1000个节点。
如果分片区块链的容量增加10倍,则最小用户数也将增加10倍。现在,您可能会问:为什么我们不从一点点容量开始,而仅在看到大量用户时才增加容量,而如果用户数减少,则减少容量?
这有一些问题:
  1. 区块链本身无法可靠地检测到有多少个唯一用户,因此这将需要某种治理来检测和设置分片计数。超过容量限制的管理很容易成为分裂和冲突的源头
  2. 如果许多用户突然并意外退出,该怎么办?
  3. 增加分叉启动所需的最小用户数,使得抵御恶意收购变得更加困难。

几乎可以肯定,最少用户数不超过1,000。另一方面,最低用户数肯定不是100万。甚至最小的10,000名用户都可以说开始冒险了。因此,似乎很难证明具有超过数百个分片的分片区块链是合理的。
 
历史可检索性
用户真正珍视的区块链的重要属性是永久性。当公司破产或失去维护该生态系统的兴趣时,存储在服务器上的数字资产将在10年后停止存在。另一方面,以太坊的NFT是永远的。
但是一旦区块链的容量过高,存储所有这些数据就会变得更加困难,直到某个时刻存在很大的风险,历史的某些部分最终将被……没人存储。
量化这种风险很容易。以区块链的数据容量(MB /秒)为单位,乘以〜30即可得到每年以TB为单位存储的数据量。当前的分片计划的数据容量约为1.3 MB /秒,因此约为40 TB /年。如果将其增加10倍,则将变为400 TB /年。如果我们希望数据不仅可以访问,而且可以方便地访问,那么我们还需要元数据(例如,对汇总交易进行解压缩),因此,使每年4 PB,或者十年后达到40 PB。Internet档案使用50 PB。因此,这是分片区块链可以安全地获得多大的合理上限。
因此,看起来在这两个维度上,以太坊分片设计实际上已经大致瞄准了相当接近合理的最大安全值。常数可以增加一点,但不能增加太多。
 
总结
尝试扩展区块链的方法有两种:基本的技术改进和简单地增加参数。
首先,增加参数听起来很有吸引力:如果您在餐巾纸上进行数学运算,就很容易说服自己,家用笔记本电脑每秒可以处理数千笔交易,不需要ZK-SNARK,汇总或分片。不幸的是,这种方法从根本上有缺陷的原因有很多微妙的原因。
运行区块链节点的计算机无法花费100%的CPU能力来验证链;他们需要很大的安全裕度来抵抗意外的DoS攻击,他们需要备用容量来执行诸如在内存池中处理事务之类的任务,并且您不想在计算机上运行节点以使该计算机无法同时用于任何其他应用。带宽同样也有开销:10 MB / s的连接并不意味着您每秒可以拥有10 MB的块!每12秒可能有1-5 MB的块。与存储相同。增加对运行节点的硬件要求以及将节点的运行限制在专门的参与者上并不是一种解决方案。对于去中心化的区块链来说,对于普通用户而言,能够运行节点并具有一种文化,其中运行节点是一种常见的活动至关重要。
另一方面,基本的技术改进可以正常工作。当前,以太坊的主要瓶颈是存储大小,无状态性和状态到期可以解决此问题,并允许将其增加多达约3倍-但不能超过300倍,因为我们希望运行一个节点比现在变得更容易。
分片的区块链可以进一步扩展,因为分片的区块链中没有单个节点需要处理每个交易。但是即使在那儿,容量也有局限性:随着容量的增加,最小安全用户数增加,归档链的成本(以及如果没有人去麻烦归档链,数据丢失的风险)就会上升。但是我们不必太担心:这些限制足够高,以至于我们可以使用区块链的完全安全性每秒处理超过一百万笔交易。