在Solidity中应用ZK-SNARKs——隐私、计算优化和MEV

MarsBit
媒体专栏
热度: 12282

通过将ZK-SNARKs技术集成到Solidity,开发者能有效应对以太坊应用中的隐私、计算和MEV相关挑战,进而推动以太坊生态系统的进一步创新与发展。

原文标题:The Application of ZK-SNARKs in Solidity - Privacy Transformation, Computational Optimization, and MEV Resistance

原文作者:Mirror Tang , Shixiang Tang ,Shawn Chong

原文来源:Mirror

编译:MarsBit,MK

本文深入探讨了如何通过集成ZK-SNARKs技术到Solidity,来提升以太坊应用层的隐私保护、计算优化和抵御最大可提取价值(MEV)攻击的能力,同时展望了该领域的未来发展方向。MarsBit编全文译:

导言

以太坊是一个基于区块链的开放平台,允许开发者构建并部署智能合约。智能合约是以太坊上的可编程代码,能够支持各种应用的创建。随着以太坊的发展,出现了一些问题和挑战,包括应用中的隐私问题。DeFi应用涉及大量的地址信息和用户资金。在某些应用场景中,保护交易的隐私对用户至关重要。通过采用保护隐私的技术,交易细节只能对涉及的各方可见,而不对公众公开。通过使用ZK-SNARKs 2(零知识简洁非互动论证),我们可以对以太坊上的现有应用进行转化。这包括为以太坊上的现有项目增加私有转账、私有交易、私有订单和私有投票等功能,同时还可以优化计算并应对以太坊应用层项目中的MEV (最大可提取价值)挑战。

通过这项研究,我们的目标是促进以太坊应用层的隐私,并解决与隐私转化、计算优化(如Rollup)和以太坊上的MEV 1抵抗相关的问题。

现存问题

竞争者分析:没有隐私功能的智能合约容易受到竞争者的分析和监控。竞争者可以通过观察和分析合约的交易模式和数据,获得有关业务运营和策略的敏感信息,从而削弱竞争优势。

交易可追溯性:在没有隐私功能的情况下,合约交易是可追溯的,交易的参与者和内容都可以被追踪和识别。这暴露了某些交易,如匿名投票或敏感交易的交易意图和参与者。

数据安全性:智能合约中的数据已成为攻击者的主要目标。没有隐私功能的合约面临数据泄露、篡改或恶意攻击的风险。攻击者经常通过分析来利用和操纵合约数据,进行恶意活动,对用户和合约造成伤害。

技术障碍

EVM智能合约多线程:目前,在以太坊智能合约中直接实现多线程 2是不可能的。以太坊采用基于帐户的执行模型,每个交易都在一个单独的线程中顺序执行。这是因为以太坊的共识机制需要顺序验证和执行交易,以确保所有节点之间的共识。当处理大规模数据时,以太坊的智能合约面临性能瓶颈。要在链上运行包含零知识证明的大量智能合约,需要实现异步调用、事件驱动编程和代理分割,以实现并发执行。

可审计的零知识 (ZK):可审计的ZK指的是验证者能够提供收到的零知识证明给第三方(通常是公众),以验证其有效性,而无需再次经历整个证明过程。这意味着第三方可以验证证明的正确性,而不知道声明的具体细节。与普通的ZK实现相比,可审计的ZK需要更多的计算和存储操作,特别是在验证阶段。这可能会影响智能合约的性能和资源消耗,对Solidity和相应的ZK电路的性能优化提出更高的要求。

证明系统的可扩展性:现有的证明系统存在可扩展性问题,使其难以支持大规模的电路,如证明LLM电路。目前的潜在可扩展性解决方案包括递归证明 1 和分布式证明 1,它们有可能增强证明系统的可扩展性,并为证明大规模电路提供解决方案。

证明系统的安全风险:一些证明系统,如Groth16和Marlin,依赖于一个私下生成的受信任的设置 1 (也被称为有毒废物)。一旦被公之于众,整个证明系统的安全性都无法得到保证。

当前使用的zk-SNARKs方案

Groth16(目前由Zcash使用)

在对手仅限于线性/仿射操作的情况下,Groth基于QAP构建了一个通信成本仅为3元素的LIP。基于这个LIP,它构建了一个zk-SNARK,通信成本为3个群元素,验证者的计算成本仅为4个配对操作(称为Groth16 1)。

优点:证明大小小,当前验证速度最快。

缺点:受信任的设置绑定到电路,这意味着生成一个不同的电路的证明需要一个新的受信任的设置,并且受信任的设置不能动态更新。

Marlin

为了解决zk-SNARKs方案无法实现全局更新的问题,Groth等人基于QAP,提出了一个带有全局和可更新公共参考字符串(可更新的通用CRS)的zk-SNARK,记为GKMMM18。在此基础上,Maller等人提出了Sonic方案,利用排列论证、大产品论证和其他技术,实现了具有O(|C|)大小的全球可更新CRS,简洁的NIZKAoK,无需额外的预处理,在代数群模型下。

Marlin是Sonic的性能优化方案(Plonk也是),主要优化了SRS预处理和多项式承诺,从而减少了证明系统的证明大小和验证时间。

优点:支持全球可更新的受信任设置,在分摊意义上实现简洁验证。

缺点:在证明过程中的高复杂性,与Groth16相比,证明大小不够简洁。

Plonk

Plonk也是Sonic方案的一个优化,引入了一个不同的电路表示法,称为Plonkish,它与R1CS(秩-1约束系统)不同,并允许更多的可扩展性,如查找操作。Plonk通过“子群上的评估而不是单项式的系数”优化排列论证,并利用Lagrange基多项式。

优点:支持全球可更新的受信任设置,完全简洁的验证,以及Plonkish中更可扩展的电路表示。

缺点:在经常有大量增加输入的情况下,Marlin可能表现更好;与Groth16相比,证明大小不够简洁。

HALO2

为了减少证明复杂性和减轻证明者的负担,研究人员引入了递归证明,并提出了Halo证明系统(如Vitalik的博客1所介绍)。Halo证明系统采用了来自Sonic的多项式IOP(交互式预言证明)技术,描述了一个递归证明组合算法,并用来自Bulletproofs的内积论证技术替换了算法中的多项式承诺方案,从而消除了对受信任设置的依赖。

Halo2是Halo的进一步优化,主要是针对多项式IOP的方向。近年来,研究人员已经发现了比Sonic中使用的更高效的多项式IOP方案,如Marlin和Plonk。其中,Plonk被选中,因为它支持更灵活的电路设计。

优点:不需要受信任的设置;引入递归证明以优化证明速度。

缺点:证明大小不够简洁。

如何与Solidity集成?

对于Groth16和Marlin证明系统,已经有高级电路语言和编译器为solidity提供支持,如为Groth16和Plonk提供的circom,以及为Groth16和marlin证明系统提供的zokrate。

对于halo2证明系统,没有与solidity链接的产品或工具,这是一个缺口。可能的参考工具是:

  • halo2-snark-aggregator-solidity由scroll tech 2提供
  • plonk-verifier由PSE 1提供

使用Solidity集成ZK-SNARKs的场景演示

隐私增强

将ZK-SNARKs集成到Solidity中可以实现隐私增强,允许保护交易的细节,同时确保交易的有效性。以下是一个简单的场景,演示如何使用ZK-SNARKs在Solidity中实现隐私转化。

假设有两个用户,Alice和Bob,他们想进行一个私人交易,但不想让交易的细节向其他人公开。

首先,我们需要定义交易的数据结构。在这个例子中,我们将定义一个简单的交易结构,包括发送者、接收者和交易金额:

隐私

接下来,我们需要定义一个智能合约,来处理交易并通过ZK-SNARKs保护交易的隐私。以下是一个简单的智能合约示例:

隐私

在上述示例中,我们引入了一个名为Verifier的库,该库包含用于验证ZK-SNARK证明的相关函数。当用户创建交易时,他们需要提供有效的证明以确保他们有权执行该交易。createTransaction函数首先使用_proof.verify()验证证明的有效性,然后创建一个新的交易对象并将其存储在transactions映射中。getTransaction函数可以用来获取特定交易的详细信息。

最后,我们需要定义Verifier库,其中包含验证ZK-SNARK证明的相关函数。这里仅显示了一个简单的示例:

隐私

此场景展示了如何通过Solidity与ZK-SNARKs的集成来改造隐私。通过使用ZK-SNARKs,交易的细节得到了保护,只有持有有效证明的用户才能执行交易。

计算优化

在Solidity中集成ZK-SNARKs可用于计算优化场景,尤其是在DeFi(去中心化金融)项目中,以提高计算效率并保护用户隐私。以下是一个示例,演示了如何在Solidity中使用ZK-SNARKs为DeFi项目的计算进行优化。

假设有一个DeFi项目,用户可以进行存款和扣款操作。存款和借款操作需要一些计算,例如计算利息或验证借款人的信用。我们可以使用ZK-SNARKs在保护用户隐私的同时优化这些计算。

首先,我们需要定义一些数据结构和功能。以下是DeFi智能合约的简单示例:

隐私

在上述示例中,我们引入了一个名为Verifier的库,该库包含验证ZK-SNARK证明的相关功能。当用户申请贷款时,他们需要提供有效的证明来验证他们的申请是否符合要求。applyLoan函数首先使用_proof.verify()验证证明的有效性,然后创建一个新的贷款对象并将其存储在loans映射中。approveLoan函数由贷款方使用以批准贷款申请。getLoan函数可用于获取特定贷款的详细信息。

同样,我们需要定义包含验证ZK-SNARK证明相关功能的Verifier库。这里仅显示了一个简单的示例:

隐私

抵抗MEV攻击

在Solidity中集成ZK-SNARKs可以帮助实现对MEV(最大可提取价值)攻击的抵抗,MEV攻击是指恶意矿工为了获得额外利润而操纵区块链上交易的顺序。使用ZK-SNARKs可以隐藏交易的细节,从而减少MEV攻击的可能性。以下是一个简单的场景,演示了如何在Solidity中使用ZK-SNARKs实现抵抗MEV攻击的功能。

假设有一个去中心化交易所(DEX),用户可以在其上进行交易。为了抵抗MEV攻击,DEX可以使用ZK-SNARKs来隐藏交易的细节,使恶意矿工无法利用交易顺序获得额外利润。

首先,我们需要定义交易的数据结构。在此示例中,我们将定义一个简单的交易结构,其中包含发送者、接收者、交易金额和交易类型:

隐私

接下来,我们需要定义一个智能合约,用来处理交易并通过ZK-SNARKs保护交易的隐私。以下是一个简单的智能合约示例:

隐私

在上述示例中,我们引入了一个名为Verifier的库,其中包含验证ZK-SNARK证明的相关函数。当用户想要执行交易时,他们需要提供有效的证明以确保他们有权执行该交易。executeTransaction函数首先使用_proof.verify()验证证明的有效性,然后创建一个新的交易对象并将其存储在transactions映射中。getTransaction函数可用于检索特定交易的详细信息。

最后,我们需要定义Verifier.sol库,其中包含验证ZK-SNARK证明的函数。以下是一个简单的示例:

隐私

此场景演示了如何通过集成ZK-SNARKs在Solidity中实施反MEV措施。通过使用ZK-SNARKs,交易的细节得到了保护,使恶意矿工难以通过交易排序来获得额外的利润。

结论

从上述示例中,我们可以看到,将ZK-SNARKs技术集成到Solidity可以有效地解决隐私、计算优化和抵御Ethereum应用中的MEV(最大可提取价值)问题。ZK-SNARKs提供隐私功能,使得在现有的Ethereum项目中可以实现私有转账、私有交易、私有订单和私有投票。与此同时,ZK-SNARKs可以优化计算过程并应对Ethereum应用层项目中与MEV抵抗相关的挑战。通过利用ZK-SNARKs技术,开发者可以增强其应用的隐私性、性能和安全性。这再次证实了在Ethereum上编写ZK应用程序的可行性,并表明这是未来发展的趋势。这将为Ethereum生态系统带来更好的隐私保护、计算优化和MEV抵抗能力,推动Ethereum应用的进一步发展和创新。

可能的改进和未来工作

在Ethereum区块链上建立公共ZK验证层

这可以提供诸如隐私保护、可扩展性、灵活性和可扩展性等各种好处。这可以帮助推动ZK技术在Ethereum生态系统中的采用,并为用户和开发者提供更安全、高效和灵活的验证解决方案。

在Solidity中的ZK性能优化

考虑使用如批处理技术、优化计算和通信、并行计算、缓存和预计算以及优化验证过程等方法来提高ZK在Solidity中的调用性能。增强ZK证明的计算效率,减少通信开销,并提高ZK系统的整体性能。

建立可复用的Solidity ZK组件

这有助于代码的可维护性和可复用性,促进合作和共享,提高代码的可扩展性,并提供更好的代码质量和安全性。这些组件可以帮助开发者高效地开发Solidity应用,同时也有助于整个Solidity社区的增长和发展。

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。