区块链的模块化问题已经讨论了很长时间。在分层架构中,Layer 1 区块链的理想品质是什么?
近期在加密货币领域流行的一种观点认为,要解决区块链 “不可能三角”,即同时实现高安全性、去中心化和可扩展性,最有效的方法是采用分层架构或者说模块化架构。
这种设计将交易执行、共识和数据可用性分离到不同的层中,从而在不牺牲去中心化和安全性的前提下实现更高的吞吐量。这种分层架构不仅很有发展前景,而且从目前的情况来看,它似乎是解决区块链 “不可能三角” 的唯一可行方法。
许多智能合约平台最初是单片区块链,不支持分层架构。然而,最近这些平台开始转向了模块化扩展之路。那么,问题来了:在日益模块化的行业中,Layer 1 区块链应该扮演什么样的角色?要解决区块链 “不可能三角”,在模块化区块链中,理想的 Layer 1 应该专注于什么?
分层架构要求根据功能和责任的不同,将区块链分解成专门的组件。如果说单片区块链试图成为各行各业的 "万金油",但最终却一无所长,那么在分层网络中,每一层都应该具备独特的专长。对于 Layer 1 来说,这个专长应该是什么呢?
区块链是用来验证的,不是用来计算的
首先,我们需要搞清楚区块链有什么用。
以太坊的成功推广了智能合约的概念,即 "在区块链上进行的通用计算"。然而,这个概念并非一直流行,要了解它是如何产生的,我们必须从比特币说起。
比特币区块链最初的设计目标很简单:将比特币从一个持有者转移给另一个持有者。然而,随着网络的运行,人们开始在其基础上构建其他应用,包括在交易中添加元数据以创造新的资产和协议。很快,瑞波(Ripple)和恒星(Stellar)等其他项目开始涌现,它们试图解决比特币可编程性差和可扩展性受限的问题,从而使比特币能够支持更多的操作,例如创建用户自定义的资产、搭建去中心化交易所以及在银行之间进行转账等。
然而,这些区块链项目只针对特定应用而设计,功能相当有限。在比特币基础上开发 Mastercoin 协议失去耐心之后,以太坊的创始人 Vitalik Buterin 开始着手创建一个单一的、公共的、“图灵完备” 的区块链,让它可以执行通用的可编程计算。2015 年底,以太坊应运而生,它允许任何人在以太坊区块链上创建智能合约。智能合约是一种与小型数据库相关联的通用程序,只能由拥有该数据库的程序进行修改。
在以太坊(或其他基于账户模型的智能合约平台)上创建智能合约时,需要设置数据库的初始状态,然后通过向合约发送交易来调用合约。根据合约的内部代码,它可以执行各种操作,包括触发其他合约、修改数据库或向调用者发送响应。这里需要注意的是,所有这些步骤都在网络中的每个节点上独立执行或计算,并且结果完全相同。
从表面上看,在区块链上通过智能合约进行各种计算似乎是一个非常好的主意。然而,当人们开始思考区块链究竟是什么以及要做什时,这个看法很快就变味了。
事实证明,计算本质上是不可预测的,这意味着不可能通过简单地查看程序来预知程序的执行结果,也无法确保程序部署后就能够完成执行。这种不确定性在区块链环境中是无法容忍的,因为每个节点都需要就每个区块达成一致。
为了解决这个问题,智能合约平台引入了交易费用或者说 “gas” 的概念。每笔区块链交易在执行之前都会事先说明发送者的 "gas"(通常以区块链的原生货币支付)有多少可以用于处理这笔交易。随着合约逐步在智能合约平台的虚拟机中执行,这些费用会逐渐耗尽。如果在执行完成之前就耗尽了 gas,数据库中的任何更改都会被撤销,这意味着区块链的状态不会发生永久性改变,而 gas 却被消耗掉了。通过这种机制,用户只能在愿意付费的范围内给网络带来负担。
以太坊等智能合约平台还面临另一个基本问题:并发性。并发性指的是系统在不影响结果的情况下,不按顺序或部分顺序处理不同任务的能力。就区块链而言,具有良好并发性的网络可以并行处理多笔交易,从而在可扩展性方面带来巨大优势。
然而,智能合约在并发性方面面临挑战,因为它们需要访问全局状态(存储在区块链上的其他合约信息)才能正常运行。这意味着,如果两个智能合约同时执行,并且它们都试图修改同一段数据,就会发生冲突。为了解决这个问题,智能合约平台必须按照特定的顺序逐个执行交易。这种串行执行(与并发执行相反)可确保所有节点以相同的方式和顺序正确处理所有交易,但同时也会大幅降低区块链的运行速度,因为网络无法同时处理多个交易(这也会延长新用户同步节点所需的时间)。
这些问题凸显了一个简单的事实,比特币技术社区多年来一直都很清楚:区块链对于计算来说是非常糟糕的。原因也很简单,区块链的核心目标是提供一个去中心化、无需信任的系统来验证交易,而不是处理大规模的计算或数据存储任务。
计算与验证的区别
计算是一个随机过程,涉及执行一系列指令或程序,这些指令或程序可能相当复杂,需要进行算术计算、数据操作和逻辑比较等操作,因此需要大量的处理能力。根据输入以及协议或合约中所定义的规则,计算的结果为新的区块链状态。例如,在执行智能合约时,可能会涉及多个操作、循环和条件检查,这可能需要大量的 CPU 周期来完成,因此对于单个节点而言,计算成本较高。此外,计算结果通常需要存储,这会增加节点在内存和磁盘空间方面的负担。
相比之下,验证是一个确定性过程,是根据已知的标准或一组规则检查结果的正确性或有效性,其资源需求远低于执行原始计算。例如,验证区块链中的一个简单交易的有效性可能涉及数字签名的验证,验证区块的有效性可能需要检查矿工向网络广播的工作量证明是否符合协议当前的难度目标。无论如何,这些都是单一操作,只需要很少的计算资源。
在这种模式下,引入复杂通用计算并不合适,因为区块链的去中心化是通过复制而非分配来实现的。将繁重的计算任务分配给网络中的众多节点,让它们承担着任务的不同部分(这是通过 "分片" 进行扩展的前提,但这个想法已经失宠),而不是执行完全相同的计算任务,这才是区块链应该做的。另一方面,验证是有意义的,因为它不属于资源密集型,并且在整个网络中复制此任务是确保无需信任的唯一方法。
所有这些表明,引入串行执行、gas 限制以及执行交易的要求,都是人为地对区块链施加的限制,表明区块链无法进行复杂计算这一事实。
换个角度思考区块链
换个角度,将区块链类比为法院其实会更好。
确保交易没有受到欺诈的方法之一是,每个人都必须在法庭上完成交易,这样,一位公正且值得信任的法官可以确保没有人作弊或违背承诺。然而,如果每个人都将所有交易提交给法庭,法庭将不堪重负(由于其规模有限),人们将不得不等待不可接受的时间才能等到法庭批准他们的交易。为了解决这个问题,人们可以不把每一笔交易都提交给法院(整个网络),而是通过合同和记录来组织业务活动,只有在出现纠纷时才需要诉诸法庭解决。这样,每个人都能够及时完成交易,而无需担心法庭不堪重负。
这个类比非常贴切地描述了分层架构区块链的工作原理。模块化区块链不是在单一层上执行和验证所有交易,而是将这些功能转移到不同的层中。其中 Layer 1 用于验证和最终结算,Layer 2 用于处理交易。
区块链依赖于区块生成者(矿工或验证者)将交易写入区块。然而,如果没有制衡机制,恶意的区块生成者可能会在区块中添加虚假交易(例如凭空铸造代币)。为了防止这种情况,区块链依赖于由全节点构成的网络,在将区块添加到自己版本的区块链之前,这些全节点会独立地确定其有效性。
然而,单片区块链的问题在于,计算或交易的执行和验证由相同的实体(验证者/矿工,即全节点)执行。当用户发起交易时,验证者或矿工将对其进行计算/执行,并将其写入区块中。当区块创建并广播时,其他全节点会下载该区块,并重新执行区块中的所有交易,以确认它们是否有效。如果区块有效,诚实的节点会将其添加到自己运行的区块链上,从而证明其有效性。
单片区块链的可扩展性受到这种设计的严重限制,因为要提高交易吞吐量,就必须增加区块的大小和/或频率,这反过来又会增加全节点的资源需求。处理更大、更快的区块需要更多计算,从而导致成本上升。与区块生产者不同的是,全节点不会因其服务而获得回报,这意味着它们没有经济动力去承担更高的成本。这种困境自然会导致更多的网络参与者选择退出,只运行轻节点,因为轻节点不用下载完整的区块链,也不需要验证之前的所有交易是否有效,而是盲目地认为大部分的算力或质押者都是诚实的。此外,运行轻节点也是一种乐观的情况,因为实际情况表明,大多数智能合约平台的用户依赖于中心化的 RPC 提供商来接入区块链,而不是自己运行节点。
总之,当区块生成(交易执行)和验证耦合在一起时,提高吞吐量必然会导致区块验证的中心化或全节点的中心化,从而给网络带来巨大的风险。这与区块链的初衷相悖,因为区块链旨在通过去中心化来实现无需信任、抗审查和无需许可的系统。区块链必须保持去中心化,因为去中心化系统:(1) 由于依赖于许多独立运行的组件,因此不太可能出现故障(抗故障能力);(2) 由于缺乏中心故障点,攻击、破坏或操纵的成本更高;(3) 更能抵抗共谋。
Layer 1 要做什么?
模块化区块链的好处是鱼和熊掌可以兼得。
通过将交易执行转移给 Layer 2,Layer 1 可以专门从事验证和数据可用性工作,以实现高度的安全性和去中心化,而无需考虑试图扩展 Layer 1 计算时可能会遇到的限制。
模块化架构的精妙之处在于,只要验证或区块验证足够去中心化,计算或区块生产就不需要那么去中心化。区块大小和出块频率的增加会导致区块生产者的集中化,但只要验证是解耦的,并由 Layer 1 的不同实体执行,无效区块就永远不会被添加到链上。
这正是诸如 rollup 和零知识证明之类的 Layer 2 扩展解决方案所做的,交易执行或区块生产的资源密集型任务由称为排序器的中心化实体完成,这些实体将多个链下交易捆绑(或 “汇总”)在一起,然后将其提交到 Layer 1 进行验证和最终结算。
尽管链下交易的验证根据 rollup 类型(零知识证明或 optimistic rollup)而有所不同,但目标都是要确保批量交易的有效性,以防止欺诈,对于 Layer 1 的全节点来说,这是一项资源密集程度远低于交易执行的任务。此外,rollup 可以在较低的安全保证下运行,并对可扩展性进行了优化,因为它们借用了底层 Layer 1 的安全性,其中包含了验证过程。
需要注意的是,Layer 1 的广泛验证和去中心化对整个系统至关重要。假设一个强大的作恶者试图改变协议(例如更改原生代币的发行),并获得大多数区块生成者的支持。在这种情况下,如果没有其他人验证区块链,攻击很可能得逞,其他人可能会采纳新的欺诈性区块链作为标准。然而,如果大多数用户都在验证区块链(运行全节点),攻击几乎肯定会失败,因为作恶者需要说服用户下载软件补丁,主动接受更改。
因此,尽可能降低运行全节点所需的资源,以确保尽可能多的用户运行全节点,至关重要。正如前所述,实现这一目标的唯一可行方法是优化 Layer 1 以进行验证,并将计算转移到 Layer 2 网络上。
在这种情况下,Layer 1 不能做太多事情,因为做太多的事情意味着更高的复杂性,复杂性增加会增加脆弱性,但 Layer 1 又必须足够强大,以支持上面的 Layer 2 网络。如果 Layer 1 能够提供足够大的数据量的数据可用性,那么它的计算能力可以保持在较低水平,因为与执行相关的所有其他内容都可以(并且应该)放到搭建在 Layer 1 上的其他层中。
这正是底层公链 Nervos CKB 试图解决的问题。Nervos 的方法是将去中心化的共同知识和计算分开,将繁重的工作从底层公链转移到其他层中,使底层能够专注于需要全球共识的共同知识,并为上层的 Layer 2 网络提供安全性。
对于开发者来说,Nervos CKB 提供了一个多功能结算层,支持所有当前和未来的密码学原语,并提供 “刚好足够” 的验证支持。与以太坊等通用智能合约平台相比,Nervos CKB 作为验证层和结算层的表现力更强,效率更高,引入错误的可能性更小。
此外,密码学原语(如哈希算法和签名方案)可以像插件一样直接被 dApp 开发者调用,这意味着 CKB 将永远能够支持所有类型的 Layer 2 解决方案,无需为了使用其他密码学原语而进行硬分叉升级。
CKB 通过使用最久经考验的工作量证明(PoW)共识机制来优化去中心化和安全性,并通过引入状态租赁来解决区块链状态爆炸的问题,将扩展全局状态的权利与平台的原生代币 CKB 挂钩,其中 1 CKB 等于区块链上 1 个字节的空间。这确保了运行全节点的资源需求长期保持较低,保证验证层的持久去中心化。
最重要的是,CKB 的代币经济设计从一开始就与该平台的价值存储性质相符。接下来,我们将详细介绍这一点。
Layer 1 区块链是价值存储平台,而不是交易性平台
从概念上讲,区块链具有价值存储和执行交易的双重功能。
价值存储需要长期占用全局状态,而交易则需要消耗瞬时但可再生的计算和带宽资源。然而,当前的 Layer 1 区块链存在一些问题,其代币经济设计未能充分反映其价值存储属性,尤其是在众多区块链采用模块化或分层扩展方法的背景下,大部分交易应该被转移到链外,使底层主要充当最终结算层或价值存储平台。所以这一现状引发关切。
除了依赖通货膨胀之外,当前 Layer 1 区块链的长期安全假设还依赖于交易费用,这直接违背了它们将大部分交易活动转移到 Layer 2 以提高吞吐量和降低交易费用的目标。这意味着,区块链在链下扩展方面越成功,矿工或验证者长期保护链的激励就越低。
虽然更多的链下交易意味着更高的吞吐量,但同时也降低了矿工和验证者的手续费收入,降低 Layer 1 的整体安全性,而讽刺的是,Layer 1 是堆栈中提供安全性的主要模块。由于任何人都可以随时创建 Layer 2 执行层,基础层不再需要担心计算或交易执行,而是需要去中心化验证、提供安全性和存储价值。
因此,Layer 1 区块链应专注于成为价值存储平台,而非交易性平台。这也是 Layer 1 引入其他执行层的主要目的。从代币经济学的角度看,Layer 1 的矿工或验证者应为长期的价值存储而非一次性交易处理获得激励和补偿。
在这一点上,CKB 是唯一一个自下而上设计、以价值存储为目标的 Layer 1。
确保这一点的机制是 Cell 记账模型,它是 UTXO 模型的通用版本。该模型使所有资产(包括非原生代币、NFT 和智能合约)均成为 CKB 区块链上的一等公民。这意味着它们存储在由用户直接控制的 cell 中,而不是像以太坊等基于账户模型的区块链那样存储在第三方智能合约中。这确保了用户对自己在 CKB 区块链上的所有资产拥有直接的控制权和所有权,这也是价值存储平台应该维护的必要功能。
确保 CKB 能长期提供安全保护的主要机制是其独特的代币经济模型和激励结构。CKB 原生代币有两种发行方式:基础发行和二级发行。
基础发行的工作原理类似于比特币,大约每四年减半一次,直到所有基础发行的代币都被挖出为止。所有基础发行的代币都归 CKB 矿工所有,每个区块都会奖励一定数量的 CKB 代币,奖励矿工提供交易处理和保护网络安全所付出的计算机资源。
虽然基础发行在保护网络安全方面和网络启动阶段初始代币的公平分配方面发挥了关键作用,但真正确保 CKB 长期可持续性的机制是二级发行。二级发行不设上限,并遵循每年 13.44 亿 CKB 的固定发行计划,旨在从长期状态占用者那里收取状态租金,确保矿工们能够永久地获得提供安全服务的补偿,而不受链上交易量的影响。
根据区块链当前状态的使用情况,二级发行在矿工、NervosDAO 储户和 Nervos 国库之间进行分配。举个例子,假设 60% 的 CKB 代币用于存储状态,25% 存入 NervosDAO,15% 保持完全流通。那么,二次发行的 CKB 中有 60% 将分配给矿工,25% 分配给 NervosDAO 储户,15% 分配给国库(点此了解更多关于国库的信息,目前分配给国库的 CKB 直接被销毁)。
状态占用者需要为他们存储在 CKB 区块链上的字节数据持有相应数量的 CKB 代币,因此他们无法将这些 CKB 代币存入 NervosDAO,这反过来又意味着他们持有的 CKB 代币会不断被稀释。这种稀释的目标范围很窄,只影响到状态占用者,所以对系统中的其他利益相关者来说 CKB 实际上是一种有硬顶的资产。
Nervos CKB 之所以采用二级发行,是因为它与所有其他模块化区块链网络一样,旨在通过将交易执行转移到其他层来实现规模化。基础发行的 CKB 奖励每减半一次就会减少一次,越来越多的交易又在其他层执行,所以 CKB 无法仅依靠交易手续费来保证区块链的长期安全性。CKB 作为 Layer 1 的主要角色,目的是为其他 Layer 2 提供安全保障,并充当最终结算层和数据可用层,因此必须以与其价值存储功能相一致的方式为其安全提供资金。
通过二级发行收取状态租金的机制正是 CKB 能够做到这一点的关键所在。通过对状态占用者引入定向通胀,CKB 可以对长期状态占用者征税,并奖励提供长期状态保护的矿工。由此产生的激励结构既能防止状态爆炸问题,又能保证矿工有独立于链上交易量的可预测收入来源,从而确保 CKB 区块链的长期安全。
总结
在区块链世界中,所有的道路都通向集中式的区块生产和去中心化的区块验证,将这两种功能分配到不同层上是在不牺牲去中心化和安全性的情况下进行扩展的唯一方法。
然而,要做到这一点,就必须要有一个模块化的区块链堆栈,该堆栈建立在以价值存储为重点的 Layer 1 上,即:(1)针对验证而非计算进行优化;(2)功能强大或者灵活,可以支持当前和未来所有类型的 Layer 2 扩展解决方案;(3)面向未来,以确保长期的可持续性,无需潜在的有争议的硬分叉;(4)在核心协议层面保持稳定性,以体现技术的确定性和可预测性;以及(5)具有与其价值存储性质相一致的代币经济学和激励结构。
从目前的情况来看,Nervos CKB 是唯一一个具备所有这些特质的底层公链,并且从一开始就是一个模块化的区块链网络。