作者 | Richard Chen
来源 | 链闻
本文为 Nervos Community 出品,原载链闻,经加密谷编辑。作者 Richard Chen 就职于位于旧金山的早期加密行业风投基金 1confirmation,职务为投资分析师。
目前,大部分围绕 Layer 1 的讨论都是关于如何设计出新的共识算法,以获得更好的可扩展性。然而,关于 Layer 1 所面临的状态增长问题却很少被人提及。事实上,解决状态增长的问题是 Layer 1 取得成功的一个关键因素。
状态增长是指区块链规模增长的速度,它是目前的底层公链所面临的现实问题之一。如果不尽快得以解决,它将成为潜在威胁。
正如原文标题“The State Growth Problem Facing Blockchains”所示,区块链的状态增长问题正逐渐得到人们的重视。它非常重要,但其发展状态也没有人们想象中的那么悲观,各种针对状态增长的解决方案已经相继出现,比如以太坊:状态租赁和状态剪枝;Nervos:直接让用户承担存储成本;此外,人们还在尝试通过一些新的密码学原理构建“无状态区块链”来解决这一问题。
状态存储的“公地悲剧”
公地悲剧是指如果没有对个人用户作限制,他们将耗尽系统的共享资源。 这一概念起源于 1833 年,由英国经济学家 William Forster Lloyd 提出,用来描述人们对公共土地的过度使用。他指出,牧牛人共享一块土地,每个人都有权让他们的牛在土地上吃草。如果有牧民在共享的土地上放了超过特定分配数量的牛,那么这些牧民将能获得更多的好处,但这时,整个牧民群体将共同分担这片土地上的损失。如果所有牧民都做出了这个自私的决定,那么过度放牧就会导致共享的土地被破坏,影响微观经济的可持续性,这对所有人都不利。
在加密世界中,区块链节点共享它们的磁盘空间来存储交易历史和状态,磁盘空间可以被视为一种电子格式的公共资源。
Nervos 首席架构师兼研究团队负责人 Jan 在《区块链与状态爆炸》一文中对区块链的“公地悲剧”现象做了如下描述:
存储是一种占用资源的行为。在一个区块中被占用了的存储,除非使用者主动释放,否则无法在后面的区块中被其它使用者使用。节点需要为存储持续地付出成本,而使用者却不需要为存储持续地支付手续费(交易手续费只需要支付一次)。使用者只需要在往区块链上写数据的时候支付一点手续费,就可以永久使用一个可用性超过 Amazon S3 的存储,其无限大的永久存储成本需要区块链网络中的所有全节点来承担。
由于各种 DApp 的存在,以太坊上的“公地悲剧”现象相对更加严重。例如,在区块 5700001 (2018 年 5 月 30 日)的时候,使用状态最多的 5 个合约是:
EtherDelta, 5.09%;
IDEX, 4.17%;
CryptoKitties, 3.05%;
ENS, 1.92%;
EOS Sale, 1.73%;
比较有趣的是最后一个,EOS Sale。虽然 EOS 的众筹已经完成,其代币已经在 EOS 链上流转,但众筹记录却永远留在了以太坊节点上,在消耗全节点的存储资源。
在缺乏管理的情况下,区块链的存储资源会被有意或无意的滥用。在一个设计合理的经济模型中,使用者必须承担存储占用的成本, 这个成本应该不仅与占用存储空间的大小正相关,还应该与占用时长正相关。
** 状态爆炸**
BTC 网络整个历史的大小在 10 年内增长到了 229 GB,而以太坊网络在短短 4 年间增长到了 262 GB (Geth) / 180 GB。如今,任何在不解决状态增长问题的前提下扩大以太坊规模的尝试,都只会加剧这一态势。
以太坊状态储存的增长(引自 Alexey Akhunov 的存储租赁提案)
目前,在 AWS 上运行一个以太坊全节点每月的成本大约为 50-70 美元。如果在本地运行且具备良好的网络环境,成本会更低。但是,如果运行一个节点的成本持续的超过硬件改进和价格降低的速度(摩尔定律),那么以太坊的节点数量将会萎缩到非常少,而且会高度集中。那时,可能只有像 Infura 和 Etherscan 等具有经济动机的节点,才会参与到以太坊节点的运营中来。 以太坊节点数量下降的情况已经开始发生。造成这种情况的原因有很多,但运行完整节点的成本和难度无疑是重要的影响因素。
来源:bitnodes.earn.com 和 ethernodes.org (通过 Wayback Machine 获取历史数据)
另外,节点的个数也很重要,因为它是加密网络去中心化的一种度量方式。如果只有几个节点在运行以太坊,那么它们就很容易串通起来并审查交易。如果出现这种情况,以太坊就会失去对抗审查的能力,而抗审查性对开发者来说无疑是最具有吸引力的特点。 在理想状态下,运行全节点的成本应该完全控制在非专业参与者所能承受的范围内,这样才能最大程度地确保网络的去中心化。将这一门槛保持在较低水平,能够更大程度的允许去中心化网络的参与者独立地验证交易,而不是必须去信任第三方。这也是公链的核心价值之一。 在未来,当区块链技术被大量采用,如果出现一个杀手级应用程序,每天都有数亿用户往区块链写入数据,状态增长将以什么样的速度持续下去呢?如果没有针对状态增长的解决方案,只有几个由资源丰富的验证节点组成的中心化区块链才能支撑起这个应用程序,这显然违背了 Web 3 的初衷。
** 状态租赁方案**
不过,以太坊并非无药可救。目前,人们针对底层公链的状态增长问题进行了大量的研究。最值得关注的解决方案是“状态租赁”:以太坊 2.0 的发展路线图计划考虑对状态收取租金,以太坊 1.x 很可能就已经关注到了这个问题。 状态租金(State Rent)也被称为存储租金或状态费用,它要求用户为在区块链中存储的数据预付租金。所支付的租金与数据大小和在链上存储的时间成正比。人们提出了许多不同的收费模式,但都还没有明确的定论。通过让用户而不是全节点支付状态费用,可以确保未使用的信息可以随着时间的推移被筛选和删除,从而防止状态膨胀。 不同的状态租赁实现方案在用户友好性和实现复杂度方面也有所不同。其中最简单的租赁机制是只单纯地收回那些不支付租金的智能合约,并且不向用户提供任何恢复其智能合约的方法(具有讽刺意味的是,这里的假设前提却是:区块链是一个不可篡改的分布式账本)。 相比之下,另外一种租赁机制,对用户更加友好,但实现起来会更加复杂。用户未来可以在不支付租金的情况下,重新启用合约。当用户无法支付租金时,该智能合约也不会被自动收回。实际上,人们必须创建一个能以某种方式与智能合约交互的交易,来触发回收机制。为了使被收回的智能合约能够被再次恢复,“收回”的操作并不会完全删除智能合约的状态,而是会留下一个“存根”(Stub)。这是对被收回前智能合约状态的承诺(Commitment),允许用户在以后恢复状态。 举例来说,如果你有一个含有大量 Token 的智能合约钱包,但是由于忘记支付租金而被删除,这时,你仍然可以在另一个智能合约中重建该合约的状态,使用一个特殊的操作码从存根中恢复智能合约钱包。这样之前的钱包就又可以恢复使用了。 需要注意的是,分片并不能解决状态增长的问题。分片只是将整个链分成 N 个较小的链,但是每个分片链的增长率仍然将超过摩尔定律。起初,在每个分片链上运行一个全节点会很容易,但很快它将又会变得缓慢,且资源肿胀。
状态剪枝
还有一个很大的问题是,在 Ethereum 2.0 Serenity 推出之前,状态增长问题很可能已经失控,因此,这个问题在现有的以太坊 1.0 链中就亟需得到控制。 一些核心开发者认为,目前的以太坊网络最多只能再支撑 3 年的状态增长。如果在此之前没有进行一些重大的改变来减缓这种增长状态,那么以太坊将无法向 2.0 阶段顺利过渡。针对以太坊 1.x 的升级建议之一是通过状态租赁或状态剪枝(或兼而有之)来减少和限制对存储空间的需求。
状态租赁方案是以太坊 1.x 中最难、也最具争议的改变,因为它将对现有的以太坊主网带来重大变化。另一方面,其技术实现也确实非常复杂。相对而言,状态剪枝是一种简单且没有争议的更改,可以被立即采用。
目前全节点下载的大部分数据都是过去的区块和记录,实际的账户状态只是整个数据的一小部分。 需要说明的是,过去的区块和记录将继续存储在某个地方,并且可以被广泛使用(例如 IPFS),但是它们不需要被存储在控制网络的全节点上。全节点将只存储一些区块和记录的近期历史,比如一年左右的数据。 但是,状态剪枝会影响那些需要依靠全节点索引和查询所有过去事件的 DApp。所以,用户在本地运行这些 DApps 时,需要一个空间更为密集的归档节点,或者需要可以查询过去区块和记录的索引服务。不过,对大多数用户来说,运行一个全节点会变得像以太坊早期时那样快速、轻松。 但这只是暂时的解决办法。假设状态剪枝原本能够储过去一年的数据,那么随着区块链应用越来越多,更多用户每天都在往区块链中添加新的状态,由于存储空间不变,那么能被记录的历史时间就需要逐渐缩短(比如从一年减少到几个月),才能支持存储利用率的增加。缩短存储在链上的历史数据时间会破坏大量的 DApp 应用。
Nervos 的状态储存方案:总量限制和交易定价
解决状态增长问题的另一种方法是根据第一性原则重新构建 Layer 1,直接让用户承担存储成本。
Nervos 是一条多资产的价值存储公链,由前以太坊核心开发者、前 Blockstream 研究人员研发。这是我们所见过的在以太坊之外建造 Layer 1 的最强团队,该项目计划在 2019 年第四季度上线主网,目前测试网已经上线。Nervos 有一个非常巧妙的经济模型设计,它解决了目前以太坊网络上的许多问题。
对于像以太坊这样采用账户模型的区块链来说,实施状态租赁方案非常复杂。在账户模型中,所有用户的资产都存储在单个智能合约中,例如 ERC-20 合约,它显示的是每个持有特定加密货币的余额。如果没有一种直接的方法来划分每个用户的状态,就很难协调所有用户以公平、有效的方式缴纳状态租金。
BTC 使用的是 UTXO 模型,以太坊使用的是账户模型,而 Nervos 使用的是 Cell 模型。在 Cell 模型中,每个用户的数字资产分别存储在各自的 Cell 中。如果用户不想继续持有资产,则可以释放 Cell 中的数据,并将存储空间出售或者借给其他用户。这样的设计可以很容易的计算出每一位用户(而不是整个智能合约)所需要支付的状态租金,所以可以清楚的将成本转嫁给个人用户。 区块链应该始终能够从存储状态的用户那里收取状态租金,并对不诚实的用户进行惩罚,但这又大大的增加了系统的复杂性。再加上智能合约的可组合性,“收回”和“恢复”行为会变得愈发复杂。如果一些依赖于某个特定智能合约的用户或社群拖欠付款,那么即使这个智能合约按照最新的租金制度支付费用,但它仍有可能无法完全得到实施。 为了解决这一问题,Nervos 收取状态租金的设计,类似于在限制碳排放的环境政策中采取总量管制和排放交易的方式。
总量管制与排放交易是一种自由市场的解决方案,旨在限制公共领域的污染问题。Nervos 使用类似的机制来限制存储共享中的状态爆炸问题。
Nervos 底层公链的原生代币为 Common Knowledge Bytes,简称 CKBytes。CKBytes 代表的是 Cell 的容量,单位为 Byte,它们赋予持有者占用区块链存储空间的权利。 假设你拥有 1000 个 CKBytes,那么就可以创建一个容量为 1000 bytes 的 Cell,或者多个容量之和为 1000 bytes 的 Cells。你可以使用这 1000 bytes 的存储空间来存储资产、应用程序状态或其他类型的数据。 由于 CKBytes 的供应总量代表的是总体的状态大小,Token 的发行策略事实上限制了其状态增长。由于状态存储空间是有限的,它自然成为了一种稀缺资源(就如 BTC 的带宽和以太坊的计算一样),存储空间可以在市场上被自由定价和交易。因此,当全局状态容量的绝大部分被占满时,新增的存储成本会更高,而当全局状态容量的绝大部分空闲时,新增的存储成本会更低。 Nervos 并没有强制用户定期支付租金,而是通过通胀的方式来收取租金。Nervos 的代币发行政策分为基础发行和二级发行,其二级发行的 CKBytes Tokens 是对所有现有持币者征收的通胀税。对于使用 CKBytes 存储状态的用户来说,这种重复缴纳的通胀税是用户向矿工支付状态租金的方式。 那么,不被用于存储状态的 CKBytes 会怎么样呢?它们也必须支付租金吗?Nervos 想出了一种巧妙的解决方案,其经济模型允许用户将未使用的 CKBytes 锁定在名为 NervosDAO 的特殊合约中,并且该 NervosDAO 中的持有者将获得二级发行中的一部分代币,这部分 Token 的数量将与他们所拥有的实际 Token 数量成正比,用来对冲二级发行带来的价值稀释,以此解决了二级发行所带来的通胀问题。可以说,他们持有的是像 BTC 那样的有硬顶的 Token。 例如,60% 的 CKBytes 被用于存储状态,35% 被锁定在 NervosDAO,5% 在交易所进行交易。那么,二级发行中的 60% 将发放给矿工,35% 发放给 NervosDAO,并按比例分配给其持有者,剩下的 5% 交给社区治理(暂定为被烧毁)。 这种加密经济模型的亮点在于,人们对存储在 Nervos 上的资产和状态的需求,会直接转化为对 Nervos 原生代币的需求。因此,CKBytes 可以有效地从它们所保护的资产中捕获价值。整个生态系统中各个角色的动机将会趋于一致,即更高的 Token 价格,以及更加安全的加密经济网络——开发者的应用会得到更广泛的采纳,矿工能够获得更高的收益,token 持有者可以获得价格上升的收益。
无状态区块链
最后一种方法是完全去除掉全节点存储状态这个概念。这听起来很难实现,不过在 2018 年 12 月,斯坦福大学的研究者 Dan Boneh、Benedikt Bünz 和 Ben Fisch 提出了两个新密码原语:累加器和向量承诺(Accumulators and Vector Commitments),这让无状态区块链成为可能。 在无状态的区块链中,全节点可以不需要存储区块链的整个状态,而只需要对状态进行短暂的承诺(Commitment)以验证交易。这与轻节点不同,轻节点虽然只需要下载区块头,但必须依赖全节点来验证整个交易的历史记录,以确保没有“双花”的情况出现。无状态的全节点能够确保与常规全节点相同的安全性,但无需存储任何状态。 其中,Cambrian Tech 的研发水准处于累加器(Accumulator)技术的最前沿,并为无状态 BTC 节点构建了概念验证(Proof-of-Concept)模型。同样的概念也可以应用于像以太坊这样采用账户模型的区块链中,但此时会使用向量承诺而不是累加器。 许多下一代区块链(如 Filecoin)正在寻求将其全节点架构升级为无状态的区块链模型。
结论
目前有很多不涉及改变其底层链架构的方案来解决状态增长问题,这些方法的技术细节不在本文讨论之列。由于几乎所有的 DApps 都将继续在底层链上存储状态,在可预见的未来,上述状态增长解决方案似乎是比较实用的。 Crypto 令人兴奋,因为它横跨了多个学科。资源分配是经济学中被广泛研究的对象,我们可以从相关文献中汲取教训,来解决加密行业中的状态增长问题。“状态租赁”和“总量限制与交易定价”只是防止公共存储搭便车的两种机制,除此之外还有许多其他建设性的提议,不再一一赘述。 开发者们忽视了一个基本事实:技术并不是静态的,而是不断发展的;研发往往都是为了解决技术上遇到的挑战。我乐观地认为,未来,状态增长将不再是一个威胁,它终将成为过去。
Richard Chen 作者 Kelly、Toya 翻译
Sonny Sun 编辑
Roy **排版** ****
内容仅供参考 不作为投资建议 风险自担
版权所有 未经允许 严禁转载
☟☟☟
声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。
简介:分享区块链领域专业、前沿、有趣的内容
评论0条