模块化执行层如何通过将计算与验证分离的方式来实现可扩展性。
免责声明:本文由一名Fuel社区的成员翻译。为了提供准确的翻译,我们进行了仔细的检查,但仍然不排除会有错误或遗漏。Fuellabs不对翻译信息的准确性、可靠性或及时性负责。
为了实现真正的可扩展性,区块链领域正越来越多的走向了模块化架构。即使是Ethereum这样曾经的单体链,也正在转向模块化的设计路线,希望以此克服单体链设计缺陷带来的挑战。
模块化区块链堆栈的核心组件之一是执行层。Fuel正在为模块化区块链堆栈构建最快的执行层。
什么是模块化执行层?它们将如何让区块链更加具有可扩展性?
模块化执行层和单体链的执行层相比,有以下两个核心优势:
1.单体链将计算和验证结合在同一层,导致了安全性低下和可扩展性受限的问题。模块化执行层通过分离计算和验证拖来避免这种情况,从而能在规模上提供更强大的安全保证。
2.当涉及到单片链所能支持的计算速度和种类时,单片链们被锁定在低效的技术中。这个时候,模块化执行层可以专门设计用来优化高效计算。
这篇文章阐述了模块化的第一个核心优势,第二个核心优势将在即将出版的第二部分中探讨。
要了解来自模块化执行层 (MEL) 的创新,首先我们需要了解单体链上的计算和验证是如何处理的。
区块链是依赖于执行交易并将它们捆绑在一个区块中的实体网络--它们被称为超级节点/验证者。没有检查和平衡,坏的超级节点可以在区块中包含无效的交易(例如,将代币铸造到自己的地址)。为了防止这种情况,区块链依靠其他节点网络来确定区块的有效性,然后将其添加到他们的链版本中。
所以区块链运行所需要的两个核心功能:
区块的产出(计算) - 执行交易并将各个状态转换来构建区块。
区块的验证(验证) - 确认状态转换是有效的。
注意:为了方便理解,这一段落对区块的生产和验证在单体链上的工作方式进行了简化解释。在真实的情况中,这个过程更加复杂,并且可能根据链的具体设计而有所不同。但是许多相同的核心原理都是互相适用的。
在大多数单体链设计中,计算和验证是由相同的实体--验证器(即完整的节点)执行的。当用户发送交易时,验证器将执行该交易,然后将相应的状态转换包含在一个区块中。一旦这个区块被创建和传播,其他完整节点就会下载这个区块,并重新执行区块中的交易,以确认它是有效的。如果区块是有效的且假设超级节点是诚实的,完整节点会将该区块附加到他们版本的链上,从而证明它的有效性。
有时,应用程序或用户需要访问区块链的状态,但不想承担运行完整节点并独立验证所有交易的高资源要求。因此,他们可以运行轻客户端,假设完整节点提供的区块仅包含有效交易。他们不下载完整的区块链,也不验证之前的所有交易是否有效。相反,他们必须相信大多数完整节点是诚实的(就是只在他们的链副本中包含有效区块)。
这就是所谓的诚实多数假设,大多数单体链容易受到51%攻击的原因就是因为这个。在单片机模式下,由于需要诚实的多数完整节点来验证区块链的有效性,轻客户端被迫相信占比多的一方。如果超过一半的完整节点是不诚实的,轻客户端没有办法知道这一点,所以他们最终会跟随一个遭受破坏且无效的链。
因为依赖诚实的多数假设的原因,单体链的扩展性受到了严重的限制。因为它为了提高交易吞吐量,必须增加区块的大小 和/或 频率,来使得更多的交易在相同的时间内处理。这就增加了完整节点的资源需求(和相关的成本);更大/更快的区块=更多的计算=更高的成本。
随着运行一个完整节点的成本增加,更多的实体将选择运行一个轻型客户端,依靠着越来越小的完整节点网络来验证链的有效性。像这种区块验证的日益集中化是对单体链安全的主要威胁,因为更集中的验证者池更容易受到攻击,也更容易勾结起来。
值得兴奋的是,区块链系统现在有可以摆脱依赖诚实的大多数假设的设计。为了避免踏入这种单体设计的陷阱,模块化的区块链堆栈将计算与验证分离。通过将执行(即计算)从基础链(通常被称为 "父链")上移开,可以在实现规模更大的情况下又不影响去中心化。
在模块化区块链堆栈中,负责计算的这一层--换句话说,他是处理交易和应用单个状态转换。
Fuel将模块化执行层定义为:一个可验证的计算系统,专为模块化区块链堆栈设计。更具体地说,一个可验证欺诈或可验证的区块链(或其他计算系统),利用模块化区块链来提供数据可用性。
更透彻的讲,如果计算系统不具备以下两点:1)无法验证欺诈性或有效性。2)不能将数据可用性移交给另一层,那么它们就不是模块化执行层。
与单体链一样,模块化执行层采用专门区块生产网络。这些实体是处理执行交易和生成区块的资源密集型流程。然而,与单片系统不同,验证不是在执行层处理,而是在模块化区块链堆栈的较底层处理。
模块化执行的奇妙之处在于,只要验证(即区块验证)是去中心化的,计算(即出块)就不需要去中心化。区块大小可以增加,导致生产区块的节点集中化--但只要验证是分离的,无效的区块就不会被添加到链上。
但这是如何做到的?如果我们允许区块生产保持中心化,我们如何确保安全性得到保障?这就是模块化发挥作用的地方。
模块化执行层将执行的资源密集型功能抽象为强大的超级节点,这些超级节点打包和执行批量交易,并定期将这些批次作为区块发布到父链(结算/共识/数据可用性层)。为了让这些超级节点保持诚实,还有其他不生成区块的完整节点(通常称为“验证者”或“证明者”),它们下载并重新执行发布到父链的区块,以保证它们只包含有效的交易。
这些完整节点如何传达交易的有效性或无效性的具体细节取决于模块化执行层采用的是optimistic模式还是zero-knowledge模式。在optimistic的MEL的情况下,完整节点只在检测到无效交易时采取行动(通过欺诈证明)。相反,在zero-knowledge MEL的情况下,完整节点主动证明交易的有效性(通过有效性证明)。任何一种情况下,超级节点提供的所有交易的有效性或无效性都是在父链上证明的,而不是在模块化执行层。
为了提供更深层次的说明,让我们探讨一下optimistic MEL的情况(假设所有交易都是有效的,除非有其他证明)。如果模块化执行层上的单个完整节点在父链上发布的区块中检测到了无效交易,他们也可以生成一个欺诈证明(在预定的 "争议解决窗口 "内),以加密方式证明该交易是无效的。
根据特定模块化堆栈的结构,这可以通过多种方式处理,比如:
在具有结算层的模块化堆栈中:
完整节点将欺诈性证明提交给结算层上专用的争议解决合约,这个合约直接重新执行交易(请注意,这要求MEL交易的结构能够以确定性的方式在结算层的VM上提供欺诈证明-例如,FuelVM被设计为可以在EVM内证明欺诈,以实现Ethereum上的结算)。
如果交易无效,违规的超级节点将受到严厉的惩罚(即损失资金),“举报者”将获得其中一部分资金的奖励,并将链条恢复到无效交易之前的状态。由于不能保证无效交易之后的任何交易都对应于有效状态,因此这些后续交易将被重新执行。
在没有结算层的模块化堆栈中:
完整节点通过点对点网络传播欺诈证明,以警告轻客户端该区块包含无效交易。使用欺诈证明作为超级节点不诚实行为的证据,完整节点可以在母链上提出惩罚交易,从而削减超级节点的资金。
由于没有结算层来指定链的“权威”版本,恶意完整节点理论上可以选择不拒绝该区块;但是,欺诈证明已经传达给轻客户端,所以他们知道不要跟随恶意完整节点的链版本。因此,社区共识将保证无效区块被拒绝。
在任何情况下,由于验证过程被确立在父链上而不是执行层上,安全性被外包给父链,这意味着执行层可以在较低的安全保障下来运行。即使99%的执行层完整节点都是不诚实的,只需要有一个诚实的完整节点就可以确保执行层只包含有效的交易。
这意味着,不必依赖诚实的大多数完整节点,模块化执行层(和MEL轻客户端)可以基于单一诚实的少数假设运行。
鉴于单体系统中的大多数完整节点只能恢复无效区块,而模块化系统中的单个完整节点可以通过使用欺诈/有效性证明来强制恢复无效交易。
允许计算发生在父链之外,可以大大提高交易吞吐量。区块大小可以显著增加,而不必担心区块生产的中心化,因为单独的区块验证过程可以保持超级节点的诚实。
虽然更大的区块确实会给执行验证的完整节点带来更高的负担,但诚实少数假设意味着中心化在这方面的威胁较小,因为基于中心化的漏洞依赖于不诚实的多数,这让他变得不可能。
在模块化架构下,轻客户端也可以保证以更高的安全性运行,因为欺诈性证明使它们能够基于单个诚实的完整节点的证明来识别无效交易(单体系统则要求轻客户端相信至少有一半的完整节点是诚实的)。
另外,超级节点知道任何恶意活动都会被检测到并会会被严惩,所以他们甚至不太可能尝试不诚实的行为。因此,执行层可以进行计算优化的(即处理大量交易),同时依赖于模块化堆栈安全性优化的底层。
这种模块化架构确实带来了一些额外的技术和博弈论挑战。
尽管欺诈证明/有效证明可以使诚实的完整节点证明欺诈,但还存在另一个问题:数据可用性。为了生成证明,完整节点依赖区块可用性,因为它们需要下载并重新执行区块中的所有交易以确定其有效性并生成证明。
一个恶意的超级节点理论上可以只向父链发布区块头,可能会扣留相关的一些或全部数据。这可以防止完整节点生成 欺诈/有效性 证明来警告轻客户端注意这个问题。
当尝试验证一个区块时,完整节点很容易识别出恶意超级节点是否隐藏了数据。在这种情况下,它们可以简单地假定这条链是无效的,并从中分叉。但是轻客户端如何在不下载整个区块的情况下确定超级节点是否隐藏了数据?
被称为数据可用性采样(DAS) 的新技术使轻客户端能够概率性地确定是否已发布这些区块的全部内容。简而言之,轻客户端从完整节点请求区块的随机小部分(或“样本”)。
如果所有请求的样本都可用,那么假设有足够的轻客户端执行数据可用性采样,这就概率性地证明整个区块是可用的。如果这个区块的任何部分不可用,轻客户端就知道有数据被隐藏,因此可以从该链的版本中分叉出去。
这篇文章没有足够的空间来全面解释这项技术,但您可以在这里阅读更多信息。最重要的是,DAS使轻客户端能够在恶意的超级节点拒绝提供数据的情况下识别无效区块。
另一个潜在的问题是被称为 "验证者困境 "的现象。简化版本如下:
如果超级节点知道完整节点会识别不诚实的行为,他们就会表现得诚实以免被处罚。
随着时间的推移,如果完整节点假设超级节点会继续表现诚实,他们就没有动力继续验证区块,因为他们没有了因识别到无效交易而获得的奖励。
如果完整节点没有经济激励继续验证区块,他们可能会停止这样做。此时,超级节点可能会表现得不诚实。即使仍然有少量的完整节点,超级节点可能会贿赂剩余的完整节点以忽略足够有价值的无效交易。
这最终会导致一个循环性的矛盾,即模块执行层越安全(即超级节点行为不诚实的动机越少),它就越倾向于较低的安全性(即完整节点不再有动机验证区块)。另一方面,它越不安全,就越倾向于更高的安全性。
这个困境可以通过多种途径来缓解(有关这些因素的博弈论分析,请参阅这篇详细的文章):
利他主义 - 因为MEL只需要一个诚实的验证者,只要有至少一个利他主义的完整节点在运行,系统就可以保持安全。然而,虽然这可能在实践中足够安全,但它不是控制大量资产的系统的足够保证。
经济利益 - 许多实体有经济激励来运行完整节点,超出了潜在的举报者奖励。例如,像区块浏览器、流动性提供商或dapp等产品和服务需要访问MEL的完整状态才能有效地运行他们的业务。然而,这些实体(理论上)容易受到恶意超级节点的贿赂。
巨鲸 - 那些在MEL上拥有大量资产的实体可以选择运行一个完整节点,以确保其利益得到保护,并确保链条的安全。
快速提现 - 由于optimistic的MEL在保证模块化堆栈较低层的最终性之前依赖于争议解决窗口,因此直到该窗口结束之前,从MEL到结算层的提款不会被最终确认。因此,存在一个提供快速提现的第三方服务市场,接受MEL上的代币,并立即将相同的代币(扣除费用)发送给结算层上的用户。为了确保他们在结算层上发送资金之后MEL状态不被恢复,服务提供商被激励在进行此类交易之前验证链的有效性。
超级节点 - 可以对提交构建在先前无效区块之上的超级节点引入惩罚。有了这样的机制,超级节点将被激励在提交区块之前验证链的有效性。
尽管上述缓解策略可能不都完全有效,但是当它们结合在一起时,就有明显的动力让许多不同的各方势力继续在MEL上运行完整节点并验证链的状态。
通过采用一种在单一诚实少数假设下具有高安全性的设计,模块化区块链堆栈可以实现比以往单片设计下更高吞吐量的区块链开发。
然而,除了将计算与验证分离所带来的可扩展性优势外,通过专注于堆栈顶部的设计:模块化执行层可以在可扩展性方面迈出更大的一步。使这一层的计算更具可扩展性和效率是构建更好的区块链的下一步。
目前正在开发的大多数模块化执行层都使用Ethereum作为其父链,因此默认使用EVM作为执行环境。这相当于改进内燃机的能源效率:对已经过时的技术进行挣扎式的更新。
实际上,模块化堆栈打开了更广阔的设计空间,模块化执行层不再需依赖于低效的EVM。Fuel正在利用这个新扩展的设计空间来构建一个超越EVM的模块化执行层,优化高效和可扩展的计算,卓越的开发者体验和最大的安全性。
在第 2 部分中,我们将探讨模块化执行层如何超越上一代区块链设计的技术限制,实现真正的可扩展性。
Fuel是模块化区块链堆栈的最快执行层。该技术功能强大且时髦,可实现并行交易执行,为开发人员提供扩展所需最大的灵活吞吐量和最高级别的安全性。开发人员选择FuelVM是因为其卓越的开发体验以及超越 EVM 局限性的能力。