状态证明让智能合约更聪明

状态证明是解决各个区块链数据割裂的问题的良药。

<img src="https://img.learnblockchain.cn/2023/02/27/90106.jpeg" alt="img" style="zoom:50%;" />

智能合约并不那么聪明

当有人购买了存储在区块链上的数字资产时,将其转移到不同的区块链上似乎是一个安全而简单的过程。毕竟,在传统的金融世界里,把钱或资产从一个数据库转移到另一个数据库一般是一个直接的,甚至是微不足道的过程。然而,在web3中情况并非如此。智能合约并不像许多人想象的那样智能。这是因为智能合约只能查看它们所部署的区块链的当前状态。查看另一个区块链的状态是完全不可能的。为了规避这个问题,开发者创造了各种工具,如跨链信息传递协议、预言机和桥接。这些工具是否就是今天困扰web3的问题的解决方案,它们能否让智能合约变得更聪明?

在某种程度上,是的,但今天的工具的大多数变化都依赖于链外系统和/或中心化的第三方。这就产生了一个风险,如果这些中间件有安全缺陷,对错误第三方的信任会危及区块链生态系统。我们已经一次又一次地看到这种情况。

<img src="https://img.learnblockchain.cn/2023/02/27/72836.jpeg" alt="img" style="zoom:35%;" />

随着未来生态系统逐步走向多链,以缓解可扩展性问题,我们必须创建越来越少信任的工具。有了称为“状态证明(state proofs)”的基础设施,智能合约变得更加智能,可以在任何时间点查看任何区块链的状态。我们需要状态证明来实现下一代的去中心化应用。

当前系统的问题

由于智能合约只限于从各自的区块链上访问当前的链上数据,因此已经创建了一些工具来缓解这个问题。这些工具是预言机和跨链桥。预言机作为数据桥梁,允许去中心化的应用程序访问任何链的历史数据,甚至某些链外数据。虽然用预言机可以使智能合约读取链外数据,但使用链外索引解决方案来访问链上数据可能没有意义。这是因为一个不够去中心化的预言机可以被操纵。许多应用通过使用像Chainlink这样的解决方案来缓解这一风险,Chainlink是一个具有充分去中心化(尽管是链外)架构的索引/聚合的预言机的例子。今天,Chainlink保证了大约90亿美元的TVL,显示了开发者对它的信任。虽然这个解决方案是可行的,而且对于特定的应用可能是必要的,但你可能希望你的数据不被转发到链外,因为它进一步减少了故障点。对于链上数据,使用链上解决方案查询可能更有意义,如状态证明。然而,信任最小化只是当前系统存在的许多问题之一;除了中心化风险外,区块链的互操作性仍然是一个巨大的技术挑战。

区块链社区正在寻找方法来使用他们最喜欢的去中心化的应用程序,而不需要支付离谱的Gas费,推动他们迁移到更高可扩展性的区块链上。然而,建立在多个区块链上会导致流动性在几个生态系统中被分割开来。智能合约不能原生地跨链通信,限制了智能合约对链上数据的访问。这使开发者只能信任中心化的桥运营商或在链外运行的分布式网络。而这些不是最安全的选择,正如跨链桥上看到频繁的攻击事件那样。跨链桥,在目前的实施中,带来的风险比大多数预言机者大得多。到目前为止,跨链桥黑客事件已经导致了高达25亿美元的损失,这大约是目前桥中所有TVL的一半。

<img src="https://img.learnblockchain.cn/2023/02/27/73849.jpeg!/scale/40" alt="img" style="zoom:67%;" />

这些惊人的损失和它们发生的频率表明,我们需要更强大的解决方案来跨链通信。依靠对手方可能会导致黑客攻击和利用,可能会破坏整个生态系统的稳定。状态证明有可能是许多开发者一直在寻找的解决方案,使跨链应用更加安全。

什么是状态证明?

虽然我们已经提到状态证明是一个几乎无信任的解决方案,但我们还没有描述它们是什么以及它们如何工作。状态证明是一种数字记录,为区块链的特定状态提供证据。状态证明的目标是使区块链能够以每个人都可以验证的方式对信息进行数字签名。为了正确地将状态证明纳入区块链应用,必须使用默克尔树、零知识证明和轻型客户端。介绍这些概念的最简单方法是打一个比方。

想象一下,你有一本大书,里面写了很多信息。这本书代表一个区块链。书中的每一页都被称为区块,每个区块(页)都有一个唯一的哈希值,用来识别该页。当你想在书中添加新的信息时,你把它写在新的一页上,然后把这一页添加到书的末尾。这页也包括书中前一页的哈希值,这样每个人都可以看到新的一页与书的其他部分是相连的。

img

我们假设,每个书不能“原生”地查看书的前一页,也不能查看其他书的某一页。假设你想向某人证明某条信息是写在书中的,要如何实现呢?这个问题可以通过为某本书的某一页生成一个状态证明来实现。

状态证明就像书中写有信息的那一页的图片。它包括该页的哈希值,以及该书中所有前几页的哈希值。这证明了该信息是写在书中的特定页面上的,并且与书中的所有其他页面有联系。然而,验证一本积累了多年的书会比较消耗时间。为了使图片有用,状态证明必须利用默克尔(Merkle)树。

Merkle树

如果书很大,而且有很多页,那么向别人展示所有的页并证明信息在书中,可能需要很长时间。这就是默克尔(Merkle)树发挥作用的地方。默克尔树是一种特殊的图片,可以帮助我们更快地记住书中的所有页。它的工作原理是将书页分成较小的块,称为叶子,然后通过混合成对的叶子来创建一个树状图片,并形成一个新的图片(称为节点)。树中最顶端的图片被称为根,代表整本书。要想用默克尔树向别人证明某条信息在书中,我们只需向他们展示根图片和该信息所在的特定叶子(页)的图片。然后,他们可以使用这些图片重新创建树,并确保根图片与我们给他们看的图片一致。这证明了特定的页和整本书没有被改变,因为对页的任何改变都会导出不同的根图片。

默克尔树允许对大型数据集的内容进行有效验证,如区块链,而不需要验证整个数据集。这可以大大减少验证一个状态证明所需的时间和资源。然而,有时可能希望在不透露页实际内容的情况下验证一个特定书页的内容。这时,零知识证明(ZKPs)就会有帮助。

零知识证明

如果你想向别人证明你知道写在书中的某一特定信息,但又想保密,怎么办?你可以用零知识证明(ZKP)来做到这一点。ZKP是书中写有信息的那一页的唯一图片。它包括该页的哈希值和书中所有先前页的哈希值。然而,与普通的状态证明不同,ZKP并不显示写在页面上的实际信息。它只表明证明者知道这些信息,而不透露它。ZKP就像证明你知道写在书(区块链)上的特定信息,而不透露实际信息本身。它是一个数字指纹,允许你证明你知道该信息而不透露任何其他细节。一个状态证明通常会被打包成ZKP,并被发送到目的链上。但是,这个证明到底是如何发送给别人的呢?我们需要看看什么信息传递协议能够使状态证明具有最小的信任假设。

发送 ZK-Proof 的有效载荷

到目前为止,我们假设状态证明是一个几乎无信任的解决方案,与今天的任何其他解决方案相比。这是真的;然而,这取决于ZKP如何被转发到目的地链。每种实现方式都有优点和缺点,在某些情况下,依靠具有更多信任假设的消息传递协议可能是有意义的。有三种方式来实现消息传递协议:标准消息传递、共识验证和乐观的MPC中继。让我们深入了解每一种工作方式:

标准消息传递

标准消息传递的工作方式是将消息从第2层发送到第1层,或反之亦然。然而,与第三方解决方案不同,标准消息传递是第1层和第2层区块链之间的内置消息传递协议,是Rollup的一个独特属性。这方面的一个例子是像Optimism这样的Rollup。Optimism能够在L1和L2用户或合约之间发送异步调用。基本上,L1的合约可以调用L2的合约,反之亦然。这是通过在以太坊和Optimism上部署 "桥"合约来实现的。你可以通过调用适当的操作码获得区块哈希值。不需要第三方/网络作为中间人在合约之间转账信息。虽然这种方法是充分无信任的,但如果你想从以太坊向Optimism发送消息,你需要在两条链上签署消息。这需要在多个层上进行交互,从而导致摩擦和延迟问题。这也不能轻易扩展到两个不同的第1层,所以跨链应用如何使用这种消息传递是有限制的。

共识验证

由于以太坊已经将其共识协议迁移到权益证明(PoS),验证底层共识协议终于可以做到了。在以太坊PoW(Ethash)上证明哈希函数以前几乎是不可能的,因为这个过程非常耗费内存。现在终于可以验证共识了,因为有了PoS,你只需要验证BLS签名,这就更节省内存了。然而,在智能合约中进行这种计算仍然很昂贵。在ZKP中进行共识验证所需的计算更为合理。因为这直接验证了共识,所以不存在信任假设。唯一的问题是,计算可能需要一段时间,这将导致重大的延迟问题,并限制可以用这种方法建立的应用程序。一些区块链,如Algorand,使用这种消息传递方法来支持他们的跨链应用。共识验证是为其网络的跨链桥提供支持的方法。然而,有一个要求,即网络必须是一个权益证明网络。因此,一些区块链就无法以这种方式相互传递信息。这种方法还附带一个Gas成本问题,因为你需要验证ZKP,这比仅仅消费一个消息或验证一个签名要贵得多。

乐观的MPC中继

Herodotus是一家生产软件以使开发人员更容易获得状态证明的公司,它采取了一种不同的方法。Herodotus使用一个基于多方计算(MPC)的乐观中继。MPC是一种安全计算,在这种计算中,多方(在此案例中,验证者/中继者)证明一个特定的承诺是否有效。MPC的工作原理类似于多签,更多的参与者使整个系统更加安全。但是,当你添加更多的验证者时,需要更多的人去验证每个承诺。越是去中心化,验证的成本就越高。

与发送消息相比,它的一个显著优势是,你可以使用链外调用来获得最新的区块哈希值,并将其直接转发给目的链上的智能合约,这大大降低了延迟。这里的缺点是,MPS中继需要更多的信任。然而,这并不一定是一个交易的破坏者,因为网络参与者可以对MPC验证者发送的任何数据提出异议。由于我们知道第2层可以以完全不信任的方式向第1层发送信息,这可以作为真相的一个备用来源。即使验证器组说谎,实际的第1层到第2层的消息传递也不能说谎,所以网络参与者检查验证器组是否说谎很简单,因为它只需要对链的两个RPC调用。一个调用将检查链上的实际承诺,另一个调用用来检查声称的承诺。欺诈证明窗口很短,但需要时间,因为它将花费与共识验证一样长的时间。

img

为了信任的最小化引入了不可避免的延迟。

信任最小化解决方案中存在的延迟对某些应用来说可能是一个挑战。一个对速度要求很高的应用的例子是跨链兑换。状态证明的速度将无法适应这一点。也就是说,可以使用不同的消息传递方法来优化每一种特定类型的应用。然而,一旦我们建立了生成和发送状态证明的最佳和最快的方式,我们到底要把它们发送给谁?还有,我们讨论的所有话题如何用于保障跨链桥等应用?轻型客户端是理解状态证明所涉及的工具的最后一块。

轻客户端

继续之前的比喻,轻客户端是指那些想要访问书中信息(区块链)而又不需要一直带着整本书的人。他们可以向一个完整的节点(拥有整本书副本的人)询问他们需要的具体信息,或者要求一个状态证明来验证书中某一信息的存在。这允许轻客户端与区块链交互,而不需要自己存储所有的数据,轻客户端对存储或计算能力有限的设备是有帮助的。

状态证明可以帮助轻客户以低成本和安全的方式从其他链上导入数据。桥或其他应用程序可以查询这些轻客户端,以验证两个区块链之间的活动。因此,完全不需要信任第三方。

状态证明的使用案例

开发人员可以在各种应用中实现状态证明。虽然我们知道困扰跨链桥的问题,但我们还没有解释如何利用状态证明来加强桥的安全性。

跨链桥

Algorand是一个很好的例子,说明状态证明可以加强跨链桥。如前所述,Algorand正在使用共识验证作为他们的信息传递形式。由于Algorand区块链直接验证了共识,这种方法没有额外的信任假设。在这个例子中,让我们想象一下,爱丽丝想从Algorand向以太坊发送10个 "AliceCoins"。AliceCoins非常抢手,所以他们想确保代币快速、安全地到达,而且不需要中间人的许可或信任。爱丽丝可以通过无信任桥(代码开源的),将这些代币直接发送到鲍勃的以太坊钱包。

img

应用 Algorand的状态证明的跨链桥。

该桥的工作原理是在Algorand的智能合约中 "锁定 "AliceCoins。以太坊上的伙伴智能合约会询问Algroand的轻客户端(通过状态证明保持更新),如果Alice已经锁定了这些代币。一旦得到验证,桥将在以太坊上铸造相同数量的代币到鲍勃的钱包。开发人员可以对这一过程进行反向建模,以实现从以太坊到Algorand的转账。桥运营商可以创建Algorand智能合约去让轻客户端验证以太坊交易(例如,在以太坊智能合约中存入ETH) 。两条链上的一对轻客户端将使桥能够在两个方向上工作。不需要依赖中心化的一方来维护桥,而状态证明使桥能够真正实现无信任。

账户抽象

我们的上一篇文章谈到了账户抽象将如何进化钱包。帐户抽象钱包是可编程的智能合约钱包,可以利用状态证明来增加其功能集。通过定期为钱包生成状态证明,例如每天或每周,钱包可以利用它来检测用户账户的不活跃性。如果钱包在此期间没有发生任何交易或变化,状态证明将与之前的一样。通过比较当前的状态证明和之前的状态证明,可以确定钱包是否已经不活跃。这对于检测被遗弃或休眠的钱包或识别可能已被破坏或以其他方式篡改的账户可能很有用。

这对实现新型的社会恢复功能可能很有用,当用户失去对钱包的访问时,该功能就会启动。如果钱包被状态证明认为是 "休眠 "的,社会恢复可以开始,允许用户重新进入他们的账户。

游戏

Web3游戏开发者目前面临着一个艰难的两难境地。他们想让他们的用户在一个繁荣的市场上以NFT的形式交易他们的游戏中的物品,但他们也想有便宜的Gas费,这样Gas就不会成为用户的摩擦点。社区通常会强迫开发者将他们的NFT部署到以太坊区块链上,因为以太坊上的NFT市场比其他链上的市场有更多的数量和流动性。然而,这给游戏开发者带来了一个问题,因为如果NFT在以太坊上,而开发者不希望使用桥带来新的摩擦点,那么游戏也必须部署在以太坊。

如果游戏部署在以太坊上,用户就只能支付高昂的交易费。游戏者要支付几美元的费用来与链上的游戏互动,这没有什么意义。是否有办法让开发者将他们的游戏部署到具有更便宜Gas的第一层,甚至是第二层,但仍然希望他们的游戏内物品受到追捧。

状态证明可以帮助缓解这一障碍。作为一个游戏开发者,你可以在一个链上部署你的NFT,同时将它们用于不同链上的游戏。不需要资产的桥接,也不需要把所有东西都部署到同一个链上。状态证明将允许你简单地验证玩家对以太坊上的特定游戏NFT项目的所有权,同时在更便宜的第1层或第2层进行实际的游戏互动。

治理

许多去中心化的金融应用已经接受了被部署到尽可能多的区块链的想法。虽然这对减少终端用户的费用有好处,但它会使治理变得令人头痛。这些协议中的大多数都在多个区块链上发行治理代币。通过这些代币,协议的参与者可以对协议的变化进行投票。然而,这给投票的实际治理应用程序带来了后勤方面的恶梦。这些应用程序很难在多个链上汇总用户的代币余额。如果没有状态证明,用户将不得不依赖一个可信的Oracle或将他们的代币桥接到一个主要的链(如以太坊),然后在那里投票。有了状态证明,治理应用程序可以检查用户的余额状态,并使用多个链上的代币总计数作为他们的投票权。

结束语

状态证明使跨链应用更加安全。虽然应用程序可以从使用状态证明中受益,但其对应用程序的重要性因个案而异。有些应用,如跨链桥,可以利用状态证明来更好地保护用户资金。对于其他应用,可能是你需要一个经常更新的价格反馈,尽管你可能要依靠第三方中介来解决这个问题。但是,假设每个应用都需要链外喂价是错误的想法,因为状态证明可以填补许多空白。账户抽象钱包、游戏和治理是直接的使用场景;但是,状态证明的发展相对较早,不过,我们最终会看到其他应用如何使用状态证明。web3领域的建设者应该推动使用继承了他们所建立的协议的安全和信任的解决方案。

原作者:Robert McTague ,来自 Amber 。他希望,随着状态证明的普及,我们将看到更安全的跨链应用的兴起。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO