去年夏天,Vitalik写了一篇?博文,概述了不同类型的zkEVM?。他根据性能和兼容性的权衡轴来定义它们。
这是一种非常有用的启发式方法,可以区分支持zkEVM的方法。但是,zkEVM是构建零知识应用程序的所有可能方法的一个子集。对于想要利用zk计算的独特属性的程序员来说,zkEVM可能不是最佳选择。通过布置整套开发人员工具,我希望提供一个指南,帮助您围绕适合您的应用程序的正确zk堆栈做出决策。
在过去的一两年中,zk工具取得了巨大的进步。他们正在接近普通软件开发人员可以利用zk的强大属性而无需深入了解令人生畏的底层数学和工程的地步。另一方面,为高级用户提供的工具激增,使zk专家能够极其精细地控制zk堆栈。
抽象复杂性的力量
现代软件建立在无数的抽象层之上,以最大限度地提高专家的生产力。工程中的抽象有很多优点,有些直观——Web开发人员不需要深入了解操作系统的工作原理。?
构建良好的、可重用的抽象层的关键是封装层的复杂性,然后为堆栈中的更高层提供简单但富有表现力的接口以供使用。如果处理得当,这使具有不同专业知识和知识领域的开发人员能够跨堆栈构建有用的工具。
毫不奇怪,这些相同的原则适用于zk系统,并且这些抽象层变得足够成熟,zk新手今天就可以开始使用它们并构建应用程序。
底层zk开发
Arkworks-rs
Arkworks-rs是一个Rust库生态系统,它提供zkSNARK应用程序子组件的高效和安全实现。Arkworks为开发人员提供了必要的接口来为zk应用程序定制软件堆栈,而无需重新实现与其他现有库的共性。
在Arkworks之前,创建新的zk应用程序的唯一方法是从头开始构建所有内容。Arkworks-rs相对于定制的垂直集成工具的主要优势在于灵活性水平、重复工程的减少以及审计工作的减少。Arkworks组件之间合理的接口线允许一定的升级速度,可以在zk技术创新的迅猛步伐中保持堆栈的相关性,而无需强迫团队从头开始重建一切。
观点:真正的DeFi项目可能会摆脱监管行动:8月18日消息,Brookwood律师事务所的常务董事Collins Belton认为,对于立法者来说,真正的DeFi项目与ICOs相比属于不同的法律问题,后者的集中化操作和安全类代币的发行在DeFi领域基本上没有,所以真正的DeFi项目可能会摆脱监管机构的监管。但他认为,稳定币项目可能会受到更多的监管(decrypt)[2020/8/18]
Arkworks适用于需要对整个zk软件堆栈进行精细控制,但又不想从头开始构建所有冗余部分的项目。如果你正在考虑电路DSL的自定义版本,例如,你正在制作一个新的证明系统的原型,但不确定承诺方案或相应的椭圆曲线,arkworks将允许你在具有共享接口的多个选项之间快速切换,而不是从头开始。
优点
通过模块化实现灵活性减少重复代码降低工程成本减少审计/错误表面积无需重大重构即可升级任何组件易于在快速发展的zk环境中试验新原语缺点
需要深入了解完整的软件堆栈如果没有正确理解,太多的控制会导致脚精细控制需要堆栈所有级别的专业知识Arkworks确实提供了一些合理的默认值。zk领域特定语言(DSL)
为了创建关于某些计算的证明,首先该计算必须以zkSNARK系统可以理解的形式表达。一些特定于领域的语言已经创建了允许应用程序开发人员以这种方式表达他们的计算的编程语言。其中包括AztecNoir、Starknet的Cairo、?Circom、?ZoKrates和Aleo的Leo等。底层证明系统和数学细节通常不会暴露给应用程序开发人员。
开发者体验
zkApp开发人员必须精通使用领域特定语言编写程序。其中一些语言看起来很像熟悉的编程语言,而另一些则可能很难学。让我们分解其中的一些:
Cairo——?在Starknet上构建应用程序所必需的StarkwareDSL。编译成CairozkVM可以解释的特定于Cairo的汇编语言。
ZoKrates?—ZoKrates是一个满足常见SNARK需求的工具包,包括用于编写电路的高级语言。ZoKrates在曲线、证明方案和后端方面也具有一定的灵活性,允许开发人员通过简单的CLI参数进行热交换。
观点:比特币是比黄金更好的美元对冲工具:Cointelegraph今日发表分析文章称,自黑色星期四以来,比特币(BTC)已经成为比黄金更好的对冲美元的工具。在通货膨胀的大环境下,比特币开始被传统投资者视为法币之外的一种可行的选择。此外,它较黄金也有一定的优势,如固定供应量和即时转移性等。[2020/7/30]
Circom?—Circom是一种用于构建电路的专用语言。目前,它是生产电路的实际语言。该语言不是特别符合人体工程学。该语言本身使您敏锐地意识到您正在编写电路这一事实。
Leo?——Leo被开发为Aleo区块链的语言。Leo有一些类似Rust的语法,专门用于区块链内部的状态转换。
Noir?–受Rust启发的语法。围绕IR而不是语言本身构建,这意味着它可以有一个任意的前端。?
任何想要在其应用程序中利用zk的独特属性的应用程序开发人员。其中一些语言已经过数十亿美元通过ZCash和Starknet等链在它们之间流动的实战测试。虽然我们将讨论的一些项目还没有完全准备好用于生产,但使用其中一种语言编写电路是目前最好的策略,除非您需要像Arkworks这样的工具包提供的更精细的控制。
优点
用户无需了解底层zk细节具有一定生产经验的今天可用链上可验证缺点
用户需要学习新的DSL围绕每种语言的孤立工具和支持几乎无法控制底层证明堆栈zkEVM
zkEVM的主要目标是进行以太坊状态转换并使用简洁的零知识正确性证明来证明其有效性。正如Vitalik的帖子中提到的,有许多方法可以做到这一点,但有细微的差别和相应的权衡取舍。?
所有这些之间的主要技术差异恰恰是在语言堆栈中将计算转换为可在证明系统中使用的形式的位置。在某些zkEVM中,这发生在高级语言中,而其他方法则试图证明EVM一直到操作码级别。Vitalik的帖子中深入介绍了这些方法之间的权衡,但我将用一句话总结:堆栈中发生的转换/算术化越低,性能损失就越大。
声音 | 观点:当比特币市值达到万亿美元时,基金经理才会购买:大型基金受到盈利能力和投资组合平衡规则的约束,因此它们可能被迫剥离比特币等有可能带来丰厚回报的资产。Jason Zweig在《华尔街日报》刊文称,到目前为止,选股规则以及基金经理必须在报告中显示盈利能力的这一事实意味着,大型基金已经错过了一些最大的涨幅。而且,如果他们必须投资于比特币和加密资产,一旦BTC涨至峰值,他们可能已经来迟了。加密评论员Ceteris Paribus表示,当比特币市值达到万亿美元时,他们才会购买比特币。(Bitcoinist)[2019/12/14]
为什么在zk中证明EVM操作码的成本很高?
为虚拟机创建证明的主要挑战是电路的大小与每条执行指令的所有可能指令的大小成比例增长。出现这种情况是因为电路不知道每个程序会执行什么指令,所以它需要支持所有的指令。
这在实践中意味着您为最昂贵的指令付出代价,即使您只执行最简单的指令也是如此。这导致了泛化性和性能之间的直接权衡——当你为泛化性添加更多指令时,你会为你?证明的每条?指令付出代价!
这是通用电路的一个基本问题,但随着?IVC等技术的新发展,可以通过将计算分解成更小的块来改善这种限制,每个块都有专门的、更小的子电路。
今天的zkEVM实现使用不同的策略来减轻这个问题的影响......例如,zkSync将更昂贵的操作从主要执行证明电路中剥离到单独的电路中,这些电路在通过snark递归结束。zkSync在意识到他们的大部分成本来自一些复杂的指令后采用了这种方法。
V神确认参加Polygon ZK day:12月3日消息,据Polygon Chinese发布推特称,Vitalik确认参加Polygon ZK day,V神将与Polygon的粉丝一起分享关于SNARKs,STARKs 以及关于零知识证明的应用。[2021/12/3 12:48:59]
从根本上说,证明EVM更等效的指令集成本更高的原因是EVM不是为zk计算而设计的。放弃堆栈中较早的EVM允许zkEVM在针对zk更优化的指令集上运行,因此证明成本更低。
zkEVM的理想客户是智能合约应用程序,这些应用程序需要比L1以太坊上可用的交易便宜几个数量级的交易。这些开发人员不一定具备从头开始编写zk应用程序的专业知识或带宽。因此,他们更喜欢用他们熟悉的高级语言编写应用程序,比如Solidity。?
扩展以太坊?是目前zk技术最需要的应用。
zkEVM是一种以太坊扩展解决方案,可以无摩擦地缓解限制L1dApp开发人员的拥塞问题。
zkEVM的目标是支持尽可能接近当前以太坊开发的开发人员体验。完全的Solidity支持意味着团队不必构建和维护多个代码库。完美地做到这一点有点不切实际,因为zkEVM需要权衡一些兼容性才能在合理的时间内生成合理大小的证明。
快速案例研究:zkSync与Scroll
zkSync和Scroll之间的主要区别在于它们在堆栈中的何处/何时执行算术运算——也就是说,它们从普通EVM构造转换为SNARK友好表示的位置。对于zkSync,当他们将YUL字节码转换为他们自己的自定义zk指令集时,就会发生这种情况。对于Scroll,这发生在最后,当使用实际EVM操作码生成实际执行跟踪时。
因此,对于zkSync,在生成zk字节码之前,一切都与与EVM交互相同。对于Scroll,在执行实际的字节码之前,一切都是一样的。这是一个微妙的差异,它以性能换取支持。例如,zkSync不会像开箱即用的调试器那样支持EVM字节码工具,因为它是完全不同的字节码。虽然Scroll很难从指令集中获得良好的性能,但这并不是为zk设计的。这两种策略各有利弊,最终有很多外生因素会影响它们的相对成功。
V神:ZK Rollup和Optimistic Rollup均取得巨大进展:以太坊创始人V神刚刚发推表示,Rollups(包括ZK Rollup和Optimistic Rollup)已经存在并继续取得巨大进展。虽然分片(sharding)仍在快速发展,但我们并不依赖于分片来实现1000+的链上TPS。在eth2中,分片和Rollups的缩放增益将成倍增加。[2020/5/21]
zkLLVM编译器
=nil;Foundation正在构建一个编译器,可以将任何LLVM前端语言转换为可以在SNARK中证明的中间表示。zkLLVM被设计为现有LLVM基础设施的扩展,LLVM基础设施是一个行业标准工具链,支持许多高级语言,如Rust、C、C++等。
想要证明某些计算的用户只需用C++实现该计算即可。zkLLVM采用其修改后的clang编译器支持的高级源代码,并生成电路的一些中间表示。此时,电路已准备好进行验证,但用户可能希望根据一些动态输入来验证电路。为了处理动态输入,zkLLVM有一个称为分配器的附加组件,它生成一个分配表,其中包含所有输入和见证,这些输入和见证已完全预处理并准备好与电路一起进行证明。
这两个组件是生成证明所必需的。理论上,用户可以自己生成证明,但由于这是一项有点专业化的计算任务,他们可能想花钱请拥有硬件的其他人为他们做这件事。对于这种交易对手发现机制,=nil;Foundation还建立了一个“证明市场”,证明者竞相为支付给他们的用户证明计算。这种自由市场动态将导致证明者优化最有价值的证明任务。
由于每个要证明的计算任务都是独一无二的,并且会生成不同的电路,因此证明者需要能够处理的电路数量是无限的。这种强制的通用性使得单个电路的优化变得困难。证明市场的引入允许对市场认为有价值的电路进行专业化。如果没有这个市场,由于这种自然的冷启动问题,说服验证者优化该电路将是一项挑战。
另一个权衡是经典的抽象与控制。愿意采用这种易于使用的界面的用户正在放弃对底层加密原语的控制。对于许多用户来说,这是一个非常有效的权衡,因为让密码学专家为您做出这些决定通常更好。
优点
用户可以用熟悉的高级语言编写代码所有zk内部都从用户那里抽象出来不依赖于增加额外开销的特定“VM”电路缺点
每个程序都有不同的电路。难以优化。交换/升级内部zk库非常重要AppChains问题
zkVM描述了所有zk虚拟机的超集,而zkEVM是一种特定类型的zkVM,由于其在当今的流行,值得作为一个单独的主题进行讨论。除了定制的加密VM之外,还有一些其他项目正在致力于构建基于ISA的更通用的zkVM。
系统可以证明不同的指令集架构(ISA),例如新VM中的RISC-V或WASM,而不是证明EVM。致力于这些通用zkVM的两个项目是RISCZero和zkWASM。让我们在这里深入研究一下RISC零,以演示该策略的工作原理以及它的一些优点/缺点。?
RISCZero能够证明在RISC-V架构上执行的任何计算。RISC-V是一种越来越受欢迎的开源指令集架构(ISA)标准。RISC的理念是构建一个极其简单的指令集,复杂度最低。这意味着堆栈中较高层的开发人员最终会在使用此架构实现指令时承担更大的负担,同时使硬件实现更简单。
这种理念也适用于通用计算,ARM芯片一直在利用RISC式指令集,并开始主导移动芯片市场。事实证明,更简单的指令集也具有更高的能量和裸片面积效率。
这个类比非常适合生成zk证明的效率。如前所述,在证明zk中的执行跟踪时,您需要支付跟踪中每个项目的所有指令成本的总和,因此越简单越少的总指令越好。
从开发人员的角度来看,使用RISCZero来处理zk证明很像使用AWSLambda函数来处理后端服务器架构。开发人员只需编写代码即可与RISCZero或AWSLambda交互,该服务会处理所有后端复杂性。
对于RISC零,开发人员编写Rust或C++。然后系统将编译期间生成的ELF文件用作VM电路的输入代码。开发人员只需调用prove即可返回收据对象,任何人都可以从任何地方调用“verify”。从开发人员的角度来看,无需了解zk的工作原理,底层系统会处理所有这些复杂性。
优点
便于使用。为任何程序员打开构建zk应用程序的大门证明可专用于的单电路攻击的表面积也更少,审核也更少与任何区块链兼容,您只需发布证明缺点
承担大量开销来支持这样的通用接口需要对证明生成技术进行重大改进,以实现对现有库的广泛支持zk?开发指南
正如详细讨论的那样,开发zk应用程序有无数不同的选择,所有这些都有自己独特的权衡。此图表将帮助总结此决策矩阵,以便根据您的zk专业知识水平和性能需求,您可以选择最适合该工作的工具。这不是一个完整的列表,我计划在未来添加到这个列表中,因为我意识到这个领域会出现更多的工具。
1.低级Snark库
何时使用:?
您需要对整个证明堆栈进行精细控制想要避免重建公共组件您想尝试证明方案、曲线和其他低级原语的不同组合何时不使用:
您是寻找高级证明接口的新手选项:?
Arkworks-rs2.zkDSL
何时使用:?
您可以轻松学习一门新语言想使用一些久经考验的语言需要最小的电路尺寸,愿意放弃抽象何时不使用:?
需要对证明后端进行精细控制选项:
CircomAztecNoirCairoZoKratesLeo3.zkCompilers
何时使用:?
不愿意承担通用电路的开销想用熟悉的语言编写电路?需要高度定制的电路何时不使用:?
想要控制底层加密原语需要一个已经高度优化的电路选项:
nilzkLLVM4.zkEVM
何时使用:?
你有一个已经在EVM上运行的dApp您需要为用户提供更便宜的交易?您希望将部署到新链的工作量降到最低只关心zk的简洁性何时不使用:?
您需要完美的EVM等效性你需要zk的隐私属性?您有一个非区块链用例?选项:?
zksync2.0PolygonzkEVMScrollStarknet6.预建可重复使用的电路
何时使用:?
您有一个智能合约应用程序依赖于常见的zk构建块,例如Merkleinclusion你对底层zk东西几乎没有专业知识何时不使用:
您有高度专业化的需求预建电路不支持您的用例?选项:?
MantaNetworkSemaphore结论
zk处于多项技术的前沿,构建它需要对数学、密码学、计算机科学和硬件工程有深刻的理解。然而,随着每天都有越来越多的抽象层可用,应用程序开发人员无需博士学位即可利用zk的强大功能。随着时间的推移,通过对堆栈的所有级别进行优化,证明时间的限制会逐渐解除,我们可能会看到针对普通开发人员的更简单的工具。
我希望我说服了你,好奇的软件开发人员,你今天可以开始在你的应用程序中使用zk。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。