区块链状态增长的问题正逐渐得到人们的重视,它非常重要,但也没有人们想象中的那么悲观,各种针对状态增长的解决方案已经相继出现:

以太坊正在尝试用状态租赁和状态剪枝的方案解决状态增长问题;Nervos 通过重头构建区块链,直接让用户承担状态存储成本的方式,解决状态增长问题;以及人们尝试通过两种新的密码学原语构建无状态区块链来解决状态增长的问题。

状态增长是一个有趣的话题,它将考验人们对待历史复杂问题时的应对能力。当然,它终将会成为过去。

原文标题:《对抗状态增长的一剂良药》(The State Growth Problem Facing Blockchains
作者:Richard Chen,旧金山的早期加密行业风险基金 1confirmation 投资分析师
译者与校对:Kelly、Toya

目前,大部分围绕 Layer 1 的讨论都是关于如何设计出新的共识算法,以获得更好的可扩展性。然而,关于 Layer 1 所面临的状态增长问题却很少被人们提到。解决状态增长的问题是 Layer 1 取得长期成功的一个尚未充分探讨的关键因素。

区块链是一个分布式账本,它用于存储像交易这样的状态数据。状态增长是指区块链规模增长的速度。目前,状态增长是底层公链所面临的一个严重问题,如果不尽快得以解决,它将成为存在的威胁。至于原因,我们很快将会看到。

幸运的是,已经有很多基于此的研究和项目正在尝试解决这个问题。本文我们将详细阐述状态增长的问题,以及它与经济学中公地悲剧问题的联系。我们也将解释为什么状态增长问题如此重要,并概述核心开发人员为应对状态增长问题正在研究的各种解决方案。

(存储)公地悲剧

公地悲剧是指如果没有对个人用户作限制,他们将耗尽系统的共享资源。这个词起源于 1833 年,由英国经济学家 William Forster Lloyd 提出,用来描述人们对公共土地的过度使用。在他举的例子中,牧牛人共享一块土地,每个人都有权让他们的牛在土地上吃草。如果有牧民在共享的土地上放了超过特定分配数量的牛,那么这些牧民将能获得更多的好处,但这时,整个牧民群体将共同分担这片土地上的损失。如果所有的牧民都做出了这个自私的决定,那么过度放牧就会导致共享土地被破坏,这对所有人都不利。

在加密世界中,区块链节点共享它们的磁盘空间(一种公共资源)来存储交易历史和状态。

Nervos 首席架构师兼研究团队负责人 Jan 在文章《区块链与状态爆炸》中举到了一个例子,正能说明区块链中公地悲剧的现象:

存储是一种占用资源,在一个区块中被占用了的存储,除非使用者主动释放,否则无法在后面的区块中被其它使用者使用。节点需要为存储持续的付出成本,而使用者却不需要为存储持续的支付手续费(记住交易手续费只需要支付一次)。使用者只需要在往区块链写数据的时候支付一点点手续费,就可以永久使用一个可用性超过 Amazon S3 的存储,其无限大的永久存储成本需要区块链网络中的所有全节点来承担。

Ethereum 上由于各种 DApp 的存在,The Tragedy of (Storage) Commons 相对更加严重。例如,在区块 5700001 (May 30, 2018)的 时候,使用状态最多的 5 个合约是:

  1. EtherDelta, 5.09%
  2. IDEX, 4.17%
  3. CryptoKitties, 3.05%
  4. ENS, 1.92%
  5. EOS Sale, 1.73%

比较有趣的是最后一个,EOS Sale。虽然 EOS 的众筹已经完成,EOS 代币已经在 EOS 链上流转,EOS 众筹的记录却永远留在了 Ethereum 的节点上,消耗 Ethereum 全节点的存储资源。

可以看到,在缺乏管理的情况下,区块链的存储资源会被有意或者无意的滥用。在一个设计合理的经济模型中,使用者必须承担存储占用的成本, 这个成本不仅仅与占用存储空间的大小成正比,还与占用时间的长度成正比

状态爆炸

最近,状态增长已成为一个严重的问题,尤其是在以太坊上。比特币网络整个历史的大小(所有区块加起来的大小)在 10 年内增长到 229GB,而以太坊网络在短短 4 年内增长到 262 GB (Geth) / 180 GB [1]。如今,任何在不解决状态增长问题下扩大以太坊规模的尝试,都只会加剧这一问题。

1confirmation 分析师:区块链的状态增长问题终将得到解决以太坊状态储存的增长(引自 Alexey Akhunov 的存储租赁提案)

目前,在 AWS 上运行一个以太坊全节点每月的成本大约为 50-70 美元。如果您在本地运行且具备良好的网络环境,那么成本会更低。但是,如果运行一个节点的成本持续的超过硬件改进和价格降低的速度(即摩尔定律),那么以太坊的节点将会溃缩到非常少而且会非常集中,可能只有由像 Infura 和 Etherscan 等具有经济动机的节点,会参与以太坊节点的运营中来。

以太坊节点数量下降的情况已经开始在现实世界中发生。造成这种情况的原因有很多,但目前运行完整节点的成本和难度巨大无疑是一个重要原因。

1confirmation 分析师:区块链的状态增长问题终将得到解决来源:bitnodes.earn.com 和 ethernodes.org (通过 Wayback Machine 获取历史数据)

另外,节点的个数也很重要,因为它是加密网络去中心化的一种度量方式。如果只有几个节点在运行以太坊,那么它们就很容易串通起来并审查交易。如果出现这种情况,以太坊就会失去对抗审查的能力,而抗审查性对开发者来说无疑是最具有吸引力的特点。

在理想的情况下,运行全节点的成本应该完全控制在非专业参与者所能承受的范围内,这样才能最大程度地确保网络的去中心化。将这一门槛保持在较低水平,能够更大程度的允许去中心化网络的参与者独立地验证交易,而不是必须去信任第三方。这也是为什么公链是有价值的根本原因。

在未来,当区块链技术被大量采用,一个杀手级别的应用程序出现,每天都有数亿用户往区块链写入数据时,状态增长将以什么样的速度持续下去呢?如果没有针对状态增长的解决方案,只有几个由资源丰富的验证节点组成的中心化区块链才能支撑起杀手级别的应用程序,这就违背了 Web 3 的初衷,这是非常具有讽刺意味的。

状态租赁方案

不过以太坊并非是无药可救的。目前,人们针对底层公链的状态增长问题进行了大量的研究。最值得关注的解决方案是「状态租赁」:以太坊 2.0 的发展 路线图 计划考虑对状态收取租金,以太坊 1.x 很可能就已经关注到了这个问题。

状态租金(State Rent)也被称为存储租金或状态费用,它要求用户为在区块链中存储的数据预付租金。所支付的租金与数据的大小和数据在区块链上存储的时间成正比。人们提出了许多不同的收费模式,但都还没有明确的定论。通过让用户而不是全节点支付状态费用,可以确保未使用的信息可以随着时间的推移而被筛选、被删除,从而防止状态膨胀。

不同的状态租赁实现方案在用户友好性和实现复杂度方面也有所不同。其中最简单的租赁机制是只单纯地收回那些不支付租金的智能合约,并且不向用户提供任何恢复其智能合约的方法(具有讽刺意味的是,这里的假设前提却是区块链是一个不可篡改的分布式账本)。

相比之下,另外一种租赁 机制 对用户更加友好,但实现起来会更加复杂,用户未来可以在不支付租金的情况下,重新启用合约。当用户无法支付租金时,该智能合约也不会被自动收回。实际上,人们必须创建一个能以某种方式与智能合约交互的交易,来触发回收机制。为了使被收回的智能合约能够被再次恢复,「收回」的操作并不会完全删除智能合约的状态,而是会留下一个「存根」(Stub)。这是对被收回前智能合约状态的承诺(Commitment),它允许我们在以后恢复状态。

举个例子,如果你有一个含有大量 Token 的智能合约钱包,但是由于忘记支付租金而被删除,这时,你仍然可以在另一个智能合约中重建该合约的状态,使用一个特殊的操作码从存根中恢复智能合约钱包。这样之前的钱包就又可以恢复使用了。

需要注意的是,分片并不能解决状态增长的问题。分片只是将整个链分成 N 个较小的链,但是每个分片链的增长率仍然将超过摩尔定律。起初,在每个分片链上运行一个全节点会很容易,但很快它将又会变得缓慢,且资源肿胀(Resource-intensive)。

状态剪枝

还有一个很大的问题是,在未来 Ethereum 2.0「Serenity」推出之前,状态增长问题很有可能就已经失控,这个问题在现有的以太坊 1.0 链中就亟需得到控制。一些核心开发者认为,目前的以太坊网络最多只能再支撑 3 年的状态增长。如果在此之前没有进行一些重大的改变来减轻状态增长,那么以太坊将无法在向 2.0 的过渡中存活下来。因此,针对以太坊 1.x 的升级建议之一是通过状态租赁或状态剪枝(或两者一起)来减少和限制对存储空间的需求。

状态租赁方案是以太坊 1.x 中最难也最有争议的改变,因为它将对现有的以太坊主网络带来重大的变化。它的实现在技术上也非常复杂,尤其是因为它还需要为用户提供友好的体验。

一个好消息是,状态剪枝(删除过去的区块和记录)是一种简单且没有争议的更改,可以被立即采用来减少所需的磁盘空间。目前,全节点下载的大部分数据都是过去的区块和过去的记录,实际的账户状态只是整个数据的一小部分。需要说明的是,过去的区块和记录将继续存储在某个地方,并且可以被广泛使用(例如 IPFS),但是它们不需要被存储在控制网络的全节点上。全节点将只存储一些区块和记录的近期历史,比如一年左右的数据。

但是,状态剪枝会影响那些需要依靠全节点索引和查询所有过去事件的 DApp。所以,用户在本地运行这些 DApps 时,需要一个空间更为密集(Space-intensive)的归档节点,或者需要可以查询过去区块和过去记录的索引服务。不过对于大多数用户来说,运行一个全节点会变得像以太坊早期时那样地快速且轻松。

但这只是暂时的解决办法。假设状态剪枝原本能够储过去一年的数据,那么随着区块链的应用越来越多,越来越多的用户每天都在往区块链中添加新的状态,这样一来,由于存储空间不变,那么能被记录的历史时间需要逐渐缩短,比如从一年减少到几个月,才能支持存储利用率的增加。缩短存储在链上的历史数据时间会破坏越来越多的 DApp。

Nervos:「总量限制及交易定价」的状态储存方案

image (81).jpg

解决状态增长问题的另一种方法是根据第一性原则重新构建 Layer 1,且直接让用户承担存储成本。

Nervos 是一条多资产的价值存储公链,由前以太坊核心开发者、Blockstream 前研究人员等开发。这是我们所见过的在以太坊之外建造 Layer 1 的最强团队,该项目计划在 2019 年第 4 季度上线主网(测试网已经上线)。Nervos 有一个非常巧妙的经济模型设计,它解决了目前存在在以太坊上的诸多问题。

对于像以太坊这样采用账户模型的区块链来说,实施状态租赁 方案 非常复杂。在账户模型中,所有用户的资产都存储在单个智能合约中,例如 ERC-20 合约,它显示的是每个持有特定加密货币的余额。如果没有一种直接的方法来划分每个用户的状态,就很难协调所有用户以公平、有效的方式缴纳状态租金。

比特币使用的是 UTXO 模型,以太坊使用的是账户模型,而 Nervos 使用的是 Cell 模型。在 Cell 模型中,每个用户的数字资产分别存储在各自的 Cell 中。如果用户不想继续持有资产,则可以释放 Cell 中的数据,并将存储空间出售或者借给其他用户。这样的设计可以很容易的计算出每一位用户(而不是整个智能合约)所需要支付的状态租金,所以可以清楚的将成本转嫁给个人用户。

其次,区块链应该始终能够从存储状态的用户那里收取状态租金,并对不诚实的用户进行惩罚,比如收回或恢复智能合约,但这又大大的增加了系统的复杂性。再加上智能合约的可组合性,「收回」和「恢复」会变得更加复杂。如果一些依赖于某个特定智能合约的合约拖欠付款,那么即使这个特定的智能合约按照最新的租金制度支付费用,但它仍有可能无法完全得到实施。

为了解决这一问题,Nervos 对收取状态租金的设计,就类似于在限制碳排放的环境政策中,总量管制和排放交易的运作方式。

1confirmation 分析师:区块链的状态增长问题终将得到解决

总量管制与排放交易是一种自由市场的解决方案,旨在限制公共领域的污染问题。Nervos 使用类似的机制来限制存储共享中的状态爆炸问题。

Nervos 底层公链的原生代币为「Common Knowledge Bytes」,简称「CKBytes」。CKBytes 代表的是 Cell 的容量,单位为 Byte,它们赋予持有者占用区块链存储空间的权利。假设您拥有 1000 个 CKBytes,那么您可以创建一个容量为 1000 bytes 的 Cell,或者多个容量之和为 1000 bytes 的 Cells。您可以使用这 1000 bytes 的存储空间来存储资产、应用程序状态或其他类型的数据。

由于 CKBytes 的供应总量代表的是总体的状态大小,Token 的发行策略事实上限制了其状态增长。由于状态存储空间是有限的,它自然成为了一种稀缺资源(就如比特币的带宽和以太坊的计算一样),存储空间可以在市场上被自由定价和交易。因此,当全局状态容量的绝大部分被占满时,新增的存储成本会更高,而当全局状态容量的绝大部分空闲时,新增的存储成本会更低。

Nervos 并没有强制用户定期支付租金,而是通过通胀的方式来收取租金。Nervos 的代币发行政策分为基础发行和二级发行,其二级发行的 CKBytes Tokens 是对所有现有持币者征收的「通胀税」。对于使用 CKBytes 存储状态的用户来说,这种重复缴纳的通胀税是用户向矿工支付状态租金的方式。

那么,不被用于存储状态的 CKBytes 会怎么样呢?它们也必须支付租金吗?Nervos 想出了一种巧妙的解决方案,其经济模型允许用户将未使用的 CKBytes 锁定在名为 NervosDAO 的特殊合约中,并且该 NervosDAO 中的持有者将获得二级发行中的一部分代币,这部分 Token 的数量将与他们所拥有的实际 Token 数量成正比,以弥补二级发行所带来的对他们而言不公平的稀释。所以在他们看来,二级发行所带来的通胀就像不存在的那样,他们持有的是像比特币那样的有硬顶的 Token。

例如,60% 的 CKBytes 被用于存储状态,35% 被锁定在 NervosDAO,5% 在交易所进行交易。那么,二级发行中的 60% 将发放给矿工,35% 发放给 NervosDAO,并按比例分配给其持有者,剩下的 5% 交给社区治理(暂定为被烧毁)。

这种加密经济模型的亮点在于,人们对存储在 Nervos 上的资产和状态的需求,会直接转化为对 Nervos 原生代币的需求。因此,CKBytes 可以有效地从它们所保护的资产中捕获价值。整个生态系统中各个角色的动机将会趋于一致,即更高的 Token 价格,以及更加安全的加密经济网络——用户的资产可以获得更高的安全性,因此更多的资产需要被存储,于是开发者的应用会被更广泛的采纳,从而矿工能够获得更高的收益,最终持有者可以获得代币价格上升的收益。

无状态区块链

最后一种方法是完全去除掉全节点存储状态这个概念。这听起来很难实现,不过在 2018 年 12 月,斯坦福大学研究者 Dan Boneh, Benedikt Bünz 和 Ben Fisch 提出了两个 新密码原语——累加器和向量承诺(Accumulators and Vector Commitments),这让人们设计无状态区块链成为可能 [2]。

在无状态的区块链中,全节点可以不需要存储区块链的整个状态,而只需要对状态进行短暂的承诺(Commitment)以验证交易。这与轻节点不同,轻节点虽然只需要下载区块头,但必须依赖全节点来验证整个交易的历史记录,以确保没有双花的情况出现。无状态的全节点能够确保与常规全节点相同的安全性,但无需存储任何状态。

Cambrian Tech 的研发水准处于累加器(Accumulator)技术的最前沿,并为无状态比特币节点构建了概念验证(Proof-of-concept)。同样的概念也可以应用于像以太坊这样采用账户模型的区块链中,但这里会使用向量承诺而不是累加器。许多下一代区块链,如 Filecoin,正在寻求将其全节点架构升级为无状态的区块链模型 [3]。

结论

目前,有很多不涉及改变其底层链的解决方案来解决状态增长问题,这些方法的技术细节不在本文分析范围内。此外,由于几乎所有的 DApps 都将继续在底层链上存储状态,在可以预见的未来,本文描述的上述状态增长解决方案似乎是最实用的。

「Crypto」是个令人兴奋的东西,因为它横跨了多个学科。由于状态增长属于经济学中被广泛研究的公地悲剧问题,我们可以从经济学文献中汲取教训,来解决加密行业中的状态增长问题。「状态租赁」和「总量限制与交易定价」只是防止公共存储搭便车问题的两种机制,除此之外还有许多其他建设性的提议,比如诺贝尔经济学奖得主 Elinor Ostrom 的著作《Governing the Commons》。

绝大多数人喜欢攻击其他链的各种技术缺陷。但是他们忽视了一个事实:技术并不是静态的,而是不断发展的;研究和开发往往都是为了解决技术上遇到的挑战。鉴于不同领域中加密学对现有技术的依赖程度,以及该领域的研发速度,我乐观地认为,状态增长问题将不再是一个威胁,它终将会成为过去。

注释: 1confirmation 是以太坊、Nervos 和 Cambrian Tech 的早期投资者。

[1] 以太坊上区分全节点和存档节点。每添加一个区块,状态数据都会被添加,并从最新版本的以太坊状态树(State Trie)中删除。归档节点会保存每个历史区块的所有剪枝后的状态数据,这意味着您可以在任何历史块区上查看账户余额和智能合约状态,而不仅仅是在最新的区块上。存档节点目前需要 2.7TB 的存储空间。这意味着,归档节点主要只用于研究目的或者像 Etherscan 这样的区块浏览器中,普通用户可以只运行剪枝后的以太坊全节点来验证交易。

[2] 累加器(Accumulator)的功能就像一个安全的去中心化集合。它可以让全节点有效的在一个集合上达成共识,证明某个元素包含或不包含在此集合之中,而不需要任何单个节点存储整个集合。类似于默克尔树(Merkle Tree),累加器将其状态承诺存储在常数的空间中。然而,一个显著的差异在于,它的包含和排除证明也会占用常数的空间(Constant Space),并且可以在常数时间(Constant Time)内得到验证。

在一个集合中,元素的准确顺序并不重要,但在一个向量中,顺序很重要。向量承诺类似于累加器,但是向量承诺不仅仅承诺元素包含(或排除)在向量中,而且还会承诺其位置。换句话说,向量承诺可以在全节点上证明某个元素是否存在于向量中的某个位置上。

[3] UTXO 和账户模型的区别在于,存储在账户模型区块链中的数据顺序很重要。因此,累加器会用在类似比特币这样采用 UTXO 模型的区块链中,向量承诺会用于类似以太坊这样采用账户模型的区块链中。

来源链接:talk.nervos.org