区块链分层结构还需要怎样的技术来支持
扫描二维码
随时随地手机看文章
以太坊联合创始人Vitalik Buterin在其最新发布的博文《基础层和功能逃逸速度》中提到,“保持 layer 1简单,使用layer 2来弥补不足” 并不是解决区块链可扩展性和功能性问题的普遍答案,因为这种思路没有考虑到layer 1区块链本身必须要具有足够的可扩展性和功能性,否则所谓的layer 2协议只是可信的中介。在这篇文章中,Vitalik提出了“功能逃逸速度”的概念,他还表示,短期内我们需要并行开发layer 1与 layer 2 ,而长期则要更关注layer 2的开发。
(图片来自:Flickr)
以下是译文:
区块链世界有这样一个常见的思路:区块链应该是最简单的,因为它们是很难改变的基础设施,如果发生了破坏,便会导致巨大的危害,并且应该以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协议。
如果数据被保证是可用的,那么在链外进行计算就是可以的,因为判断“谁正确计算,谁错误计算”的游戏,在理论上是稳定的(或者完全可以被SNARKs或STARKs代替),这就是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的开发。