区块链可拓展性的提升并不简单

原创
1312 天前
2032

前段时间,特斯拉创始人马斯克发推表示,狗狗币在理想情况下可将区块确认时间加快10倍、将区块大小增加10倍,并降低手续费用100倍,然后它将轻松获胜。

这个表态引起了加密行业很多KOL的批评,以太坊创始人Vitalik今日也撰文谈及此事,表示简单地提升区块链网络参数会导致更多的麻烦,并详细阐述了区块链网络提升性能所需要面对的问题与限制,故此链捕手对本文进行了翻译,并作出不影响原意的删减。

你能将区块链的可扩展性推进多远?正如马斯克希望的那样,你能否真正实现「将区块确认时间缩短10倍,将区块大小增加10倍并将手续费降低100倍」,而又不会导致极端的中心化并损害使区块链的基本属性?如果没有,你能走多远?如果你更改共识算法怎么办?更重要的是,如果你更改技术以引入诸如ZK-SNARK或分片之类的功能,会发生什么情况?

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

节点需要足够分散

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

一个小时后,你正在与其他两个小矿池进行电报聊天。你最终看到有人将一个链接粘贴到一条推特上,其中包含一条已发布的消息。这条推文的开头是「宣布新的链上可持续协议发展基金」。

到了早上,在推特与社区论坛上的争论无处不在。但是到那时,这450万枚代币中的很大一部分已经在链上转换为其他资产,并且进行了数十亿美元的DeFi交易。79%的共识节点,以及所有主要的区块链探索者和轻钱包的节点都遵循了这一新链条。也许新的开发者基金将为某些发展提供资金,或者也许所有这些都被领先的交易所吞并。但是,不管结果如何,该基金在所有意图和目的上都是既成事实,而普通用户则无力反击。

这可以在你的区块链上发生吗?你所在区块链社区的精英可能协调得很好,包括矿池、区块浏览器和托管节点。他们很可能都在同一个电报频道和微信群组中。如果他们真的想对协议规则进行突然更改以促进自己的利益,那么他们可能会这样做。要使这种协同的社会攻击无效,唯一可靠的方法是通过被动防御,而这个群体实际上是分散的:用户。

想象一下,如果用户正在运行验证区块链的节点,然后自动拒绝破坏协议规则的区块(即使超过90%的矿工或利益相关者支持),故事将会如何发展。如果每个用户都运行一个验证节点,那么攻击很快就会失败:一些矿池和交易所会在这个过程中分叉出来,看起来相当愚蠢。

但是,即使一些用户运行验证节点,攻击也不会让攻击者大获全胜;相反,它会导致混乱,不同的用户会看到不同的区块链视图。至少,随之而来的市场恐慌和可能持续的分裂将极大地减少攻击者的利润。驾驭这样一场旷日持久的冲突的想法本身就会阻止大多数袭击。

Paradigm研究合伙人Hasu的推特

如果你有一个由37个节点运行程序和80000个被动侦听程序组成的社区来检查签名和阻止区块头,则攻击者获胜。如果你的社区中每个人都运行一个节点,那么攻击者就会失败。我们不知道针对协同攻击的群体免疫力的确切阈值是多少,但有一件事是绝对清楚的:更多的节点是好的,更少的节点是坏的,我们肯定需要几十个或几百个以上的节点。

节点工作的限制在哪里?

为了最大限度地增加可以运行节点的用户数,我们将重点放在常规的消费类硬件上。完整节点处理大量事务的能力存在三个关键限制:

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

许多人错误地认为,使用「简单」技术可以使区块链扩展多远,这是由于对这些数字过于乐观。我们可以逐一审视以下三个因素:

1)计算能力

错误的答案:100%的CPU能力可以花在块验证上。

正确答案:大约有5-10%的CPU能力可用于块验证。

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

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

请注意,直到最近,大多数对「为什么只有5-10%?」 的解释专注于一个不同的问题:由于PoW区块是随机出现的,因此验证区块所花费的时间较长,会增加同时创建多个区块的风险。

有许多解决此问题的方法(例如,Bitcoin NG或仅使用权益证明机制)。但是这些修补程序不能解决其他四个问题,因此它们无法像许多人最初认为的那样在可拓展性方面带来巨大的收益。

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

2)带宽

错误的答案:如果我们每2-3秒就有10 MB的数据块,那么大多数用户的网络速度都> 10 MB /秒,因此他们当然可以处理。

正确答案:也许我们可以每12秒处理1-5 MB的块,虽然很难。

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

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

当Starkware在2019年进行实验时,他们首次发布了500 kb的区块,这是因为交易gas成本的降低首次使这种可能性成为可能,实际上有几个节点无法处理该大小的区块。

自那以后,区块链处理大型数据块的能力已得到提高,并将继续提高。但无论我们做什么,我们仍远不能天真地获得以MB/秒为单位的平均带宽,说服自己我们可以接受1s的延迟,并能够拥有如此大小的数据块。

3)存储

错误答案:10TB。

正确答案:512G。

正如你可能猜到的那样,这里的主要论点和其他地方一样:理论和实践之间的区别。理论上,你可以在亚马逊上购买8 TB的固态硬盘。实际上,用来写这篇博客文章的笔记本电脑有512 GB,如果你让人们去买自己的硬件,他们中的许多人会变得懒惰(或者他们买不起800美元的8TB固态硬盘),而使用中心化的供应商。

而且,即使你可以将区块节点安装并运行到一些存储磁盘上,高水平的活动也很容易迅速烧毁磁盘,迫使你不断地购买新磁盘。

此外,存储大小决定了新节点能够联机并开始参与网络所需的时间。现有节点必须存储的任何数据都是新节点必须下载的数据。初始同步时间(和带宽)也是用户运行节点的主要障碍。在写这篇博客时,同步一个新的geth节点花了我大约15个小时。

分片区块链的风险

如今,在以太坊区块链中,运行一个节点已经对许多用户构成挑战。因此,我们遇到了瓶颈。核心开发人员最关心的问题是存储大小。因此,目前,在解决计算和数据瓶颈方面的努力,甚至是对共识算法的更改,都不太可能导致大量的gas limit增加。即使解决了以太坊最大的突出DoS漏洞,也只能使gas limit增加20%。

解决存储大小问题的唯一方法是无状态和状态到期。无状态性允许一类节点在不维护永久性存储的情况下验证区块链。状态到期会清楚最近未访问的状态,从而迫使用户手动提供续订的证明。

这两种路径都已经使用了很长的时间,并且关于无状态性的概念验证实现也已经开始。这两项改进相结合,可以极大地缓解这些担忧,并为大幅提高gas limit打开空间。但是,即使在实施了无状态和状态到期之后,gas limit可能也只能安全地增加大约3倍,直到其他限制开始占主导地位为止。

分片从根本上绕过了上述限制,因为它将区块链上包含的数据与单个节点需要处理和存储的数据解耦。它们使用先进的数学和密码技术来间接验证区块,而不是节点通过亲自下载和执行来验证区块。因此,分片区块链可以安全地拥有非分片区块链无法达到的交易吞吐量水平。这确实需要大量的密码学智慧来创建高效而简单的完全验证方式,成功地拒绝无效区块,但这是可以做到的:理论已经很成熟,基于规范草案的概念验证已经在进行中。

以太坊正计划使用二次方分片,因为节点必须能够处理单个分片和信标链(必须为每个分片执行一定数量的管理工作),所以总可拓展性受到限制。如果分片太大,节点将无法再处理单个分片,如果分片太多,节点将无法再处理信标链。这两个约束的乘积形成了上限。可以想象,通过进行立方分片甚至指数分片,可以走得更远。在这样的设计中,数据可用性抽样肯定会变得复杂得多,但这是可以做到的。但是,以太坊不会比二次曲线走得更远。原因是,交易分片实际上无法实现额外的可拓展性增益,除非其他风险变得非常高。

那么这些风险是什么?

1)最小用户数

可以想象,只要有一个用户愿意参与,非分片区块链就可以运行。分片区块链不是这样的:没有一个节点可以单独处理整个区块链,因此需要足够的节点来一起处理。如果每个节点可以处理50个TPS,而区块链需要处理10000个TPS,那么链上至少需要200个节点才能运行。

如果该区块链在任何时间出现少于200个节点的情况,那要么节点无法跟上区块链,要么节点无法检测到无效区块,或者可能会发生许多其他不良情况,这具体取决于节点软件的安装方式。

如果分片区块链的容量增加10倍,则最小节点数也将增加10倍。那么,你可能会问:为什么我们不从一点点容量开始,在看到大量用户涌入时再增加容量;而如果用户数减少,则减少容量?因此我们能掌握实际需要它的部分。 

这里有一些问题:

  • 区块链本身无法准确地检测到有多少个唯一节点,因此这将需要某种治理来检测和设置分片数量。超出容量限制很容易成为分裂和冲突的源头。
  • 如果许多用户突然意外退出,该怎么办?
  • 增加分叉启动所需的最小节点数,会使得抵御恶意收购变得更加困难。

几乎可以肯定,最低节点数最好不超过1000。因此,似乎很难证明具有超过数百个分片的区块链是合理的。

2)历史可检索性

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

是的,人们将在2371年仍在下载和检索你的加密猫。

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

量化这种风险很容易。以区块链的数据容量(MB /秒)为单位,乘以30即可得到每年以TB为单位存储的数据量。当前的分片计划的数据容量约为1.3 MB /秒,因此约为40 TB /年。如果将其增加10倍,则将变为400 TB /年。

如果我们希望数据不仅可以访问,而且可以方便地到达,则还需要元数据(例如,解压rollup事物),因此每年需要4 PB,或者10年后需要达到40 PB。这是大多数分片区块链可以安全获得的合理上限。

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

总结

尝试扩展区块链的方法有两种:基本的技术改进和简单的增加参数。首先,增加参数听起来很有吸引力:如果你在餐巾纸上进行数学运算,就很容易说服自己,家用笔记本电脑每秒可以处理数千笔交易,不需要ZK-SNARK、rollups或分片。不幸的是,这种方法从根本上有缺陷,其中有很多微妙的原因。

运行区块链节点的计算机无法耗费100%的CPU容量来验证区块链;他们需要很大的安全边际来抵抗意外的DoS攻击,他们需要备用容量来执行诸如在内存池中处理的事务。并且用户不希望在计算机上运行节点以使该计算机无法同时用于任何其他应用程序。

带宽同样也有开销:10 MB / s的连接并不意味着你每秒可以拥有10 MB的块,每12秒最多可能有1-5 MB的块,与存储相同。增加运行节点的硬件配置并将节点的运行限制在特定参与者上并不是解决方案。对一个要去中心化的区块链来说,普通用户能够运行节点并且拥有一种运行节点的常见活动文化是至关重要的。

基本的技术改进肯定是起作用的。当前,以太坊的主要瓶颈是存储容量,无状态性和状态到期可以解决此问题,并允许将其增加多达约3倍(但不能超过300倍),因为我们希望运行一个节点比现在变得更容易。分片的区块链可以进一步扩展,因为分片的区块链中没有单个节点需要处理的交易。

但即便如此,容量还是有限制的:随着容量的增加,最低节点数也会增加,而归档链的成本(如果没有人费心管理归档链,数据丢失的风险上升)也会增加。

但是我们不必太担心:这些限制足够高,我们可以在区块链完全安全的情况下每秒处理超过一百万笔交易。但要做到这一点,而不牺牲区块链的去中心化,还需要付出努力。