「保持 Layer 1 简单,使用 Layer 2 来弥补不足」 是解决区块链可扩展性和功能性的好方法吗?Vitalik 认为短期内仍然需要并行开发 Layer 1 与 Layer 2 ,长期则可更关注 Layer 2 的开发。

原文标题:《Vitalik :区块链分层结构尚存在缺陷,短期需并行开发 Layer 1 和 Layer 2》(Base Layers And Functionality Escape Velocity)
作者:Vitalik Buterin,以太坊联合创始人
翻译:洒脱喜
中文来源:巴比特

以太坊联合创始人 Vitalik Buterin 在其最新发布的博文《基础层和功能逃逸速度》中提到,「保持 Layer 1 简单,使用 Layer 2 来弥补不足」 并不是解决区块链可扩展性和功能性问题的普遍答案,因为这种思路没有考虑到 Layer 1 区块链本身必须要具有足够的可扩展性和功能性,否则所谓的 Layer 2 协议只是可信的中介。在这篇文章中,Vitalik 提出了「功能逃逸速度」的概念,他还表示,短期内我们需要并行开发 Layer 1 与 Layer 2 ,而长期则要更关注 Layer 2 的开发。


区块链世界有这样一个常见的思路:区块链应该是最简单的,因为它们是很难改变的基础设施,如果发生了破坏,便会导致巨大的危害,并且应该以 Layer 2 协议的形式在一层区块链顶部建立相对复杂的功能,例如:状态通道、Plasma、Rollup 等等。 Layer 2 应该是持续的创新地点,而 Layer 1 应该是稳定的,只有在紧急情况下才会有大的变化(例如为了防止基础协议的密码学被量子计算机破解,一次重大的突破性变化就是可以的)。

这种层分离的想法是非常好的,从长远来看,我强烈支持这一想法。然而,这种思维忽略了一个重要的点:虽然 Layer 1 不能太强大,因为更大的功率就意味着更多的复杂性,因此会有更大的脆弱性,但 Layer 1 也必须要足够强大,这样建立在其之上的 Layer 2 协议才能是真正可行的。

一旦 Layer 1 协议实现了某种程度的功能,我将称之为「功能逃逸速度」,然后,是的,你可以在不进一步改变基础的情况下,在上面做任何其它事情。而如果 Layer 1 不够强大,你可以谈论用 Layer 2 系统来填补空白,但现实却是,如果不重新引入 Layer 1 试图摆脱的一整套信任假设,你是没有办法去构建这些系统的。这篇文章将讨论构成「功能逃逸速度」的最小功能是什么。

一种编程语言

必须能够在链上执行自定义用户生成的脚本。这种编程语言可以很简单,实际上不需要高性能,但它至少需要具备所需的功能级别,才能验证可能需要验证的任意内容。

这一点很重要,因为要构建在上面的 Layer 2 协议需要某种验证逻辑,而这种验证逻辑必须由区块链以某种方式执行。

你可能听说过图灵完备性,外行一般会认为,如果一门编程语言是图灵完备的,那么它可以做任何计算机理论上可做的事情。一种图灵完备语言编写的任何程序,都可以翻译成任何其它图灵完备语言的等效程序。然而,事实证明,我们只需要一些稍轻的东西:可以限制为不带循环的程序,或者保证在特定步骤中终止的程序。

富-有状态性(Rich Statefulness)

这不仅关乎一门编程语言,如何将编程语言准确地集成到区块链中也很重要。如果一种语言被用于纯粹的交易验证,那么它集成的方式就更为有限:当你将币发送到某些地址时,该地址表示一个计算机程序 P,该程序将用于验证从该地址发送币的交易。也就是说,如果你发送一笔哈希为 h 的交易,那么你将提供一个签名 S,然后区块链将运行 P(h, S),而如果该输出为 TRUE,那么该交易就是有效的。通常,P 是密码签名方案的验证器,但它可以执行更复杂的操作。注意,在这个模型中,P 无法访问交易的目的地。

然而,这种「纯函数」的方法是不够的。这是因为这种纯基于函数的方法,不足以实现人们真正想要实现的多种 Layer 2 协议。它可以实现通道(以及基于通道的系统,如闪电网络),但它不能实现其它具有更强特性的扩容技术,也不能用于具有更复杂状态概念的附属系统,等等。

举个简单的例子来说明纯函数范式所无法实现的事情,考虑一个具有以下特征的储蓄账户:有一个密码密钥 k 可以发起提款,如果其进行了提款,则在接下来的 24 小时内,同一密钥 k 可以取消提款。如果提款在 24 小时内仍未取消,那么任何人都可以「闯入」这个账户,然后完成提款。其目的是,如果密钥被盗,账户持有人可以防止小偷提取资金。窃贼当然可以阻止合法所有者获得资金,但攻击对窃贼来说是无利可图的,因此他们可能不会为此而烦恼(有关这种技术的解释,请参阅 原始论文)。

不幸的是,这种技术无法简单地通过纯函数来实现。问题是:需要有某种方法将币从「正常」状态转移到「等待取款」状态。但是程序 P 无法访问目的地!因此,任何可以授权将币转移到等待取款状态的交易,也可以授权立即偷取这些币,也就是说,P 不能区分两者的区别。在不完全释放币的情况下,改变币状态的能力,对许多应用而言都是很重要的,包括 Layer 2 协议。

Plasma 本身符合这个「授权、终结、取消」的范式:从 Plasma 的退出操作首先必须要获得批准,然后会有 7 天的挑战期,并且在这个挑战期内,如果挑战者提供了正确的证据,则退出就可以被取消。

Rollup 也需要这个属性:Rollup 中的币必须由一个跟踪状态根 R 的程序控制,如果某个验证器 P(R, R', data) 返回 TRUE,则从 R 更改为 R',但它只将状态更改为 R',在这种情况下,它不会释放币。

这种授权状态变化,而不需要完全将所有币设置在一个免费账户的能力,就是我所说的「富-有状态性」(rich statefulness)。

它可以有多种实现方式,有些是基于 UTXO 的,而没有它,且不包括信任假设的情况下(例如,一组被集体信任的工作人员来执行那些富状态程序),区块链就不足以实现大多数 Layer 2 协议。

注意:是的,我知道如果 P 可以访问 h,那么你可以将目的地地址作为 S 的一部分,并将其与 h 进行比较,然后以这种方式限制状态变化。但也有可能会出现一种编程语言资源太有限(或受到其他限制),从而无法真正做到这一点。令人惊讶的是,在区块链脚本语言中,这种情况是经常发生的。

充分的数据可扩展性和低延迟

事实证明,plasma、通道以及其它完全链外的 Layer 2 协议都有一些根本性的弱点,这些弱点阻碍了它们完全复制 Layer 1 的功能。我在 这里 详细讨论过这个问题(译者注:中文版在 这里);总结是,这些协议需要有一种方式,来裁决某些缔约方恶意不提供其承诺提供数据的情况,而且,由于数据发布是不可全局验证的(除非你自己下载了数据,否则你不知道何时发布数据),这些裁决游戏在理论上并不稳定。

通道和 Plasma 通过增加额外的假设,巧妙地绕过了这种不稳定性,特别是假设对于每一个状态,都有一个对该状态感兴趣的参与者没有被错误地修改(通常是因为它代表了他们拥有的币),因此可信任他们。然而,这远远不是通用的,例如,Uniswap 这样的系统就包含了一个大型的「中心」合约,它不由任何人拥有,因此它们不能有效地受到这种模式的保护。

有一种方法可以解决这个问题,那就是一种在链上发布少量数据,但在链外执行计算的 Layer 2 协议。

如果数据被保证是可用的,那么在链外进行计算就是可以的,因为判断 " 谁正确计算,谁错误计算 " 的游戏,在理论上是稳定的(或者完全可以被 SNARKsSTARKs 代替),这就是 ZK Rollup 和 optimistic Rollup 背后的逻辑。如果一个区块链允许发布并保证相当大数据量的可用性,即使其计算能力仍然非常有限,则区块链可支持这些 layer-2 协议,并实现高水平的可扩展性和功能性。

区块链需要处理和保证多少数量的数据?好吧,这取决于你所要求 TPS 的程度。通过 Rollup 方案,你可以将大多数活动压缩到每笔交易约 10-20 字节,因此每秒 1 kb 就可以为你提供 50-100 TPS。每秒 1 mb 就可以为你提供 50,000-100,000 TPS,依此类推。幸运的是,互联网带宽继续在快速增长,而且其增长速度似乎并没有像摩尔计算定律那样在减慢,因此,在不增加计算负载的情况下增加数据的伸缩性,是区块链可采取的一条扩容路径!

还要注意的是,重要的不仅仅是数据容量,还要考虑数据延迟(即具有较低的区块时间)。像 Rollup 这样的 Layer 2 协议(或者说 Plasma)仅在数据实际发布到链上时提供任何安全保证,因此,数据可靠地包含在链上(理想情况下为「最终确定」)所需的时间,是指 Alice 向 Bob 发送付款和 Bob 确信将包含此付款之间所需的时间。基础层的区块时间,是为其包含的内容而设置的延迟时间。这可以通过链上安全存款(又称「bond」)来解决,但这种方法本身就不完美,因为恶意方可以通过牺牲一笔存款来欺骗无限数量的不同人群。

结论

「保持 Layer 1 简单,使用 Layer 2 来弥补不足」 并不是解决区块链可扩展性和功能性问题的普遍答案,因为这种思路没有考虑到 Layer 1 区块链本身必须要具有足够的可扩展性和功能性,否则所谓的 Layer 2 协议只是可信的中介。然而,确实在某个阶段,任何 Layer 1 功能都可以复制到 Layer 2,在许多情况下,这样做是一个改善可升级性的好主意。因此,短期内我们需要并行开发 Layer 1 与 Layer 2 ,而长期则要更关注 Layer 2 的开发。

来源链接:vitalik.ca