a16z:为什么说无状态区块链不可能存在
随着区块链支持更多用户和更频繁的交易,验证器为验证交易而存储的信息量(“状态”)也在增长。例如,在比特币中,状态由一组未使用的交易输出(utxo)组成。在以太坊中,状态由每个账户的账户余额以及每个智能合约的代码和存储组成。
对于拥有足够账户或 UTXO 来支持大部分人真正日常交易的区块链来说,这种存储负担将变得难以处理,从而使其难以成为验证者并对去中心化构成威胁。人们很容易将密码学作为一种解决方案,像默克尔树和零知识证明这样的工具已经帮助我们实现了以前难以置信的目标。
这正是“无状态区块链”的目标。但是,尽管在这方面做出了大量的工作,它们仍然远未实用。但事实证明,这种进展上的滞后是固有的——这些结构与实用性之间的差距永远无法弥合。我们最近的工作表明,如果没有额外的措施来管理状态,任何无状态的区块链方案,无论多么智能,都是不可行的。正如我们在这篇文章的末尾所展示的那样,这种不可能的结果不应该令人沮丧。
无状态的状态
如今,状态规模虽庞大但可控。例如,比特币节点存储大约7GB的数据,以太坊节点存储大约650GB的数据。但是,全节点的存储负担与链的吞吐量(每秒交易数或TPS)大致呈线性增长,而目前的吞吐量低得令人无法接受。根据当前的设计,真正支持日常交易(数十万到数百万TPS)所需的状态将变得难以处理,需要使用几TB甚至PB的存储空间。
这促使人们寻找技术方法来大幅减少验证者所需的状态量——无状态的区块链,它将要求验证者仅存储一个恒定大小的状态,而不管交易吞吐量如何。(实际上,这个术语是一个误称:仍然存在状态,只是足够小以适应任何未来的吞吐量——通常是恒定大小的。)这种轻量级的存储要求将使得运行验证者节点更加容易;乐观地讲,每个人都可以在他们的手机上运行一个节点。由于增加验证者的数量将增加链的安全性,降低验证者的准入门槛非常重要。
尽管对无状态区块链进行了大量研究(例如Todd, Buterin, Boneh等人,Srinivasan等人),但它们远非实用,据我们所知,没有一个被部署。所有已知的无状态区块链的根本问题是,它们要求用户存储称为证人的额外数据,以帮助验证者验证涉及其账户的交易。例如,这个见证可能是一个Merkle包含证明,表明用户的帐户及其余额包含在全局状态承诺中。当用户进行交易时,他们将此见证提交给验证者,表明他们的帐户有足够的余额。
与存储永远不需要更改的私钥不同,这些见证经常更改,即使对于不积极进行交易的用户也是如此,这给用户带来了不切实际的负担。类似地,想象一下,如果你必须持续监视全球范围内的所有其他信用卡交易,并相应地更新一些本地数据才能使用你自己的信用卡。为了使区块链实用,用户必须能够保持离线状态,只有在提交交易时才能与区块链交互。在许多情况下,比如硬件钱包,更新见证不仅不方便,而且不可能。
这就引出了一个自然的研究问题:我们能否构建一个不需要更新见证(或者很少需要更新见证)的无状态区块链?为回答这一问题,我们开发了一个新的理论框架(可撤销的证明系统),它概括了无状态区块链。使用这一框架,我们证明了一个结论性的不可能结果:简洁的全局状态和频繁的见证更新之间的权衡是根本性的。我们的证明技术是信息论的,这意味着未来的计算机不会强大到足以解决这个问题:无状态区块链结构和实用性之间的差距将永远无法弥合。
研究背景
为帮助建立对不可能结果的直觉,我们将首先使用Merkle树描述无状态区块链的自然但低效的构造。我们的目标是让验证器确定用户提交的交易是否有效——例如,用户是否有足够大的账户余额来进行交易。在无状态区块链方案中,验证器存储恒定大小的状态。当用户进行交易时,他们必须在交易中包含一个见证。验证器可以使用当前状态和用户提交的(交易、见证)对来验证该用户是否有足够的账户余额来进行交易。
我们首先构建一个Merkle 树,其中每个(账户 ID,余额)对(a,b)都作为叶子包含在内。验证器存储的恒定大小的状态V是该树的根,它充当对帐户余额对集的承诺。每个用户都维护其(账户 ID、余额)对的 Merkle 包含证明作为其见证人。叶子 ( a , b ) 的 Merkle 包含证明由沿着其到树根的路径上的伙伴节点 ( v 1 , …, v k ) 组成。给定用户使用帐户a进行的交易并声明余额b,验证器可以检查b通过检查 ( a , b )的证明 ( v 1 , …, v k )与其当前状态V ,确实是帐户a的余额。如果是这样,验证器将执行交易并必须相应地更新帐户余额。Merkle 树的一个便利属性是,给定叶子的 Merkle 包含证明,当该叶子发生更改时,很容易计算生成的根。换句话说,验证者可以轻松计算更新后的状态V' ,该状态V'在交易执行后捕获帐户 a 的新余额。
默克尔树方案有两个主要缺点。首先,用户的见证数量相对较大,在系统中账户总数中呈对数增长。理想情况下,它们应该是恒定大小的,我们可以使用RSA累加器(Boneh等人在无状态区块链的背景下研究)等方案来实现。
第二个缺点更难以避免:每当其他用户进行交易时,帐户-余额对的证明就会更改。回想一下,叶子的证明由从该叶子到树的根的路径上的伙伴节点(partner nodes)组成。如果任何其他叶子发生变化,这些节点中的一个就会发生变化,从而在实践中出现问题。大多数区块链用户希望被动地将他们的代币保存在钱包中,只有当他们想要进行交易时才登入。然而,在这种无状态区块链的实践中,用户必须不断监控其他人的交易,以使他们的见证保持最新状态。(虽然第三方可以代表用户进行这种监控,但这偏离了标准的无状态区块链模型。我们将在本文的最后讨论这个问题。)实际上,这对于无状态区块链来说是一个不可逾越的挑战,给用户带来了沉重的负担。
我们的结论:无状态是不可能的
这种现象并不是Merkle树结构所特有的——所有已知的无状态区块链方案都要求用户频繁更新他们的见证。我们在本文中说明了这一点。更准确地说,我们表明,必须更新其见证的用户数量与所有用户进行的交易总数大致呈线性增长。
这意味着,即使用户Alice没有进行任何交易,她的见证也可能需要随着其他用户的交易而更改。只要验证器存储的简洁状态太小而无法捕获完整状态(即所有帐户余额的集合),那么增加简洁状态的大小就没有什么帮助。我们按照下面的定理绘制了这种关系,以及不同吞吐量的区块链每天所需的见证人更改数量。这些图显示了见证人需要更改以获得最佳无状态区块链的次数。这里,数据域指的是帐户(在帐户模型中)或UTXO(在UTXO模型中)的总数。
我们证明的核心是信息论论证。Claude Shannon提出的信息理论的一个核心原则是,如果Alice从一个大小为2n的集合中随机选择了一个对象,并希望告诉Bob她选择了哪个对象,她必须向他发送至少n位。如果存在一个无状态的区块链方案,用户很少更新他们的见证,那么Alice可以用少于n比特的时间告诉Bob她选择了哪个对象——Shannon证明这是不可能的。因此,这种无状态区块链是不可能存在的。
为了简单起见,我们将在这里描述一个稍弱的陈述的证明:不可能存在用户永远不需要更新其见证的无状态区块链。关键思想是Alice使用无状态区块链方案将她的消息编码给Bob。最初,Alice 和 Bob 都知道所有n 个用户的完整帐户余额对。假设每个账户至少有一枚币。Alice 和 Bob 也都知道无状态区块链的简洁状态V和所有账户余额对( a i , b i )的见证人 w i。Alice 和 Bob 还就消息和帐户集之间的映射达成了一致。Alice会选择与她的消息对应的一组A账户,然后她会从这些账户中花费代币。她将使用无状态区块链与Bob沟通她选择的集合,而他可以从该集合中了解她的消息是什么。
编码: Alice 从A的每个账户中花费一枚代币。使用无状态区块链方案,Alice 计算更新后的状态V'并将V'发送给 Bob。
解码:对于每个i, Bob 检查是否Verify( w i , ( a i , b i )) 。Bob 输出账户集合B,使得Verify( w i , ( a i , b i )) = false。
Bob成功地输出了与Alice选择的相同集合:B = A。首先,观察到如果Alice从帐户a i中花费了一枚代币,则不应再接受其旧余额的见证 - 否则,Alice将能够加倍花费。因此,对于A中的每个账户a i,Verify( w i , ( a i , b i )) = false,并且 Bob 会将该账户包含在B中。另一方面,Bob 绝不会在B中包含Alice 所识别的账户。没有_花一枚代币,因为这些账户的余额保持不变,并且(回想一下我们要证明的宽松声明)他们的见证人永远不会改变。因此,B完全等于A。
最后,通过计算Alice应该发送给Bob的比特数来解决矛盾。她可以选择的账户子集有2 n 种可能,根据Shannon定律,她至少应该发送n比特给Bob。然而,她只发送了常量大小的状态V',远远比n比特要短。
(熟悉密码学的读者可能会注意到,我们在这里掩盖了一些细节;例如,Bob的解码失败的概率可以忽略不计。我们的论文包括完整的证明。)
虽然我们用无状态区块链描述了我们的证明,但Alice和Bob可以使用各种其他经过身份验证的数据结构(例如累加器、向量承诺)执行类似的过于高效的通信。我们使用一种新的抽象来形式化这类数据结构,我们称之为可撤销证明系统。
结果带来的影响
我们的结果表明,你不能“加密状态”——没有灵丹妙药式的方案允许我们构建一个用户永远不必更新他们的见证的无状态区块链。状态并没有消失,而是从验证器转移到用户身上,以频繁更新见证的形式推送给用户。
确实存在一些潜在的解决方案,但这些解决方案脱离了严格的无状态区块链模型。该模型允许第三方(既不是用户也不是验证者)负责存储完整的状态。这一方被称为证明服务节点(由Srinivasan等人进行了最严格的检查),它使用完整状态来代表用户生成最新的见证。然后,用户可以使用这些见证进行交易,就像在常规的无状态区块链中一样,其中验证器仍然只存储一个简洁的状态。该系统的激励机制,特别是用户如何补偿证明服务节点,是一个有趣的开放研究方向。
虽然到目前为止我们的讨论主要集中在L1区块链上,但我们的结果也会对L2系统(如rollup服务器)产生影响。rollup(无论是optimistic的还是ZK的)通常采用一个大的状态并使用存储在 L1 上的一个小值来提交它。此状态包括L2上每个用户的帐户。我们希望这些用户能够通过发布其当前账户余额的见证来直接在 L1 上提取资金(无需 L2 服务器的配合)。此设置也是我们模型中可撤销证明系统的一个实例。事实上,有人可能会说无状态区块链已经以 L2 rollup的形式在实践中得到了实施。
不幸的是,这意味着我们的不可能性结果直接适用。用户的rollup取款见证必须经常更改,否则几乎整个L2状态都必须写入L1。因此,今天的集合通常假设有一个数据可用性委员会(有时称为“有效性委员会”),其功能类似于“证明服务节点”,在用户准备退出时帮助他们计算新的见证。我们的研究结果表明,以太坊文档中对用户的警告——“如果无法访问交易数据,用户无法计算证明资金所有权和执行提款所需的默克尔证明。”——将永远适用。
随着区块链系统的发展,开发更有效的方法来管理区块链状态将变得更加重要。尽管我们排除无状态区块链的结果似乎是消极的,但不可能的结果对区块链设计者来说是有用的,因为它们告诉我们将研究重点放在其他地方,理想情况下可以帮助我们更快地找到可行的解决方案。
Scan QR code with WeChat