zk-SNARKs在Solidity中的使用_ARKS:TOPDOG Vault (NFTX)

本文章主要讲述了如何在 Solidity 中使用 zk-SNARKs,以及如何使用 ZoKrates 编译器来生成证明和验证合约。

这文章不会过于深入 zk-SNARKs 的技术原理,这文章目的是为让读者能够理解 sk-SNARKs 的技术能在 EVM 中达到什么效果,如何使用,并且能在代码中运用。

关于 zk-SNARKs 的简短描述为,我们需要在 zk 电路中编写一段代码,这段代码的输入是一些公开的数据,输出是一些私有的数据。zk-SNARKs 的验证算法可以验证这段代码的输出是否正确,但是验证算法不会泄露任何私有数据。而 Solidity 合约的主要目的是验证 zk-SNARKs 的验证算法的结果,如果验证算法的结果正确,那么合约会执行一些操作。

也就是说,在 EVM 上,只是进行了结果的验证,并没有进行一些复杂的计算,这些计算都是在 zk 电路中进行的。而这部分 zk 电路,则是在链下进行的,然后将结果提交到链上。

首先,我们需要知道 zk-SNARKs 可以完成什么功能,其实很简单,我们可以简单的认为,zk-SNARKs 可以完成对一个函数运算结果的校验,比如说,我们有一个函数,输入是三个数字,输出是一个数字,我们可以使用 zk-SNARKs 来校验这个函数的输出是否正确。但是我们并不需要知道输入的三个数字是什么,只需要知道这个函数的输出即可,也就是说,在一个函数完成计算时,我们可以知道确实是有这么三个数他能符合这个函数的输入,并且能输出正确结果,但是我们并不知道这三个数是什么。

欧易OKX通过zk-STARK技术升级POR系统:据公告显示,欧易OKX正式升级储备金证明POR系统,成为行业内首个将zk-STARK (零知识可扩展的透明知识论证)加密证明技术用在储备金证明系统的交易平台,并同步将系统开源。该技术由V神的理论发展而来,旨在通过区块链确保计算的完整性和隐私。OKX在其中加入了余额总和约束、非负约束、包含性约束3项条件,以保证证明平台持有的用户资产数据的准确有效,持续引领行业透明度的标准。

同时,欧易OKX今日正式发布第六次储备金证明(PoR),BTC、ETH、USDT储备金率均超过100%,分别为103%、103%、103%,总计价值达104亿美元,自 2023 年 1 月以来增长了 39%。除原有的BTC、ETH、USDT外,欧易OKX将公示币种数量从3个增至21个,新增USDC、XRP、DOGE、SOL、OKB、APT、DASH、DOT、ELF、EOS、ETC、FIL、LINK、OKT、PEOPLE、TON、TRX、UNI,21个币种的储备金率均超过100%。[2023/4/28 14:33:21]

在 Solidity 中,我们可以使用 zk-SNARKs 来完成对一个函数的校验,但是我们需要知道这个函数的输入和输出,然后我们可以使用 ZoKrates 编译器来生成 zk 电路,然后将 zk 电路的代码放到 Solidity 合约中,然后在合约中完成对 zk 电路的验证。

Scroll在Goerli测试网推出以太坊L2网络zk-EVM的测试网版本:金色财经报道,Scroll在Goerli测试网上发布了其以太坊L2网络的测试网版本,这是将zk-EVM从pre-alpha转移到alpha的测试阶段。到目前为止,Scroll可以在基于该项目的以太坊克隆的测试网上进行试用。测试网的代码将是开源的,这意味着该网络可以开始建立弹性。此外,Goerli测试网和Scroll之间已经建立了一个桥梁来转移资产。

据悉,Zk-EVM是建立在以太坊上的第2层网络,它使用零知识证明来实现可扩展性。[2023/2/28 12:32:53]

安装 ZoKrates

curl -LSfs get.zokrat.es | sh也可以选择其他安装方式,具体选择查看他们的 Github 页面。

从上一章节我们浅显的知道,一个 zk-SNARKs 电路需要的最基本的东西为:

一个函数 - 我们需要有一个函数对数据进行运算,也就是程序 C

RareLink联合创始人:ZK-Rollups短期依然不是Layer1的救星:金色财经报道,3月17日举办的“New Paradigm”系列活动第一期《Web3.0的下一代基础设施是什么?》主题分享中,RareLink联合创始人Kai-Tai Chang分享到,ZK-Rollups是一种在链下运行计算并通过有效性证明将它们提交到链上的缩放形式,ZK-Rollups可能是唯一能够使加密技术扩展到数十亿用户的解决方案,它提供了唯一的隐私保障机构可能需要参与公共、可互操作的区块链,以便充分保护专有客户数据。一些早期采用者可能会快速推动生态系统的发展,但我们不能指望他们的成功会快速引来ZK-Rollups的热潮,它们不完全兼容EVM,需要一定的修改及调整才能完成在Layer1和其他Layer2之间的来回跳转。尽管Optimistic和ZK-Rollups之间的可编程性差距正在不断缩小,但今天我们仍需要在简单性,兼容性和结算速度中权衡。[2022/3/17 14:02:58]

lambda - 所谓的“有废料”,其实就是一个 root key,我们需要通过它来生成 pk 和 vk

有了这两个基础条件,用户就可以通过 pk,目标值,输入值来生成证明 w。随后,我们的验证程序通过 vk,目标值,证明 w 来验证证明的正确性。

币赢Defi专区Miniswap成为首个基于可编程 ZK-Rollups 技术的 layer-2 去中心化平台:据官方消息,币赢Defi专区Miniswap首家开发针对DeFi的“Derivative”智能合约语言并将其将引入支持ZK-rollup的 Layer2网络。据悉,此项Layer2技术可除了实现0 Gas费,解决DEX交易拥堵,降低DEX交易成本,提高DEX交易效率之外,其“Derivative”智能合约语言还能够方便开发者进行二次开发,增强其生态可拓展性。

币赢MINI当前报价0.0789U,24小时涨幅15.56%[2021/1/6 16:33:24]

我们先假设有这么一个第三方,他可以安全的生成 lambda,然后安全的将程序和 lambda 进行运算生成 vk 和 pk。

那么现在有两个新的角色,user 和 project。user 是用户,他确确实实拥有着一些数据,project 是项目合约,他需要验证用户的数据是否正确。

我们首先需要一个函数,但是我并不打算举一些简单例子,因为我觉得这样做非常没有意义,因为 zk-SNARKs 的主要目的是为了验证一些复杂的函数,而不是一些简单的函数。

ETH 2.0项目负责人称阶段0预计很快推出 V神明确反对zk-STARKS应用:ETH 2.0项目负责人Danny Ryan近日在reddit上解答ETH 2.0有关进展和功能时表示,ETH 2.0的开发当前集中在“信标链”的构建上,这是ETH 2.0的基础。但是阶段1的开发正在逐步进行,该阶段引入了用于与信标链连接的“分片”的分片链,并且阶段0发布预计将很快推出。此外,Ryan还表示,团队的目标是让整个以太坊社区参与进来,并与尽可能多的客户建立联系。

而针对有人提出的量子保护隐私保护技术“ zk-STARKS”的“ Etherium 3.0”的想法,Vitalik Buterin本人在reddit上明确表示不支持。V神称,目前,希望以太坊的基本结构在ETH 2.0发布后不会改变。(注:zk-STARKS是一种区块链隐私解决方案,该方案能够将大量信息压缩成名为starks的小样本并使用零知识来保护信息的隐私。)(Coinpost)[2020/6/1]

比如,我们现在需要生成一个存款凭证,有这个凭证,我们可以在任何地方取出这笔钱,但是我们并不知道这笔钱是谁的,我们只知道这笔钱是谁存的,存了多少,以及存款的时间。

首先我们需要一个存款函数,这个函数的输入为存款的金额,和一个随机数,然后输出为一个存款凭证。任何拥有这个凭证的人都可以取出这笔资金。所以,实际上,我们只需要编写验证知道这个凭证的验证函数即可。

关于 Zok 的语法和用法这里不过多描述,具体可以参考官网,这里简单解释一下,这个函数的输入为两个数字,一个是存款金额,一个是随机数,然后输出为一个 u32,实际上就是 uint256.同时我们注意一下,参数中 deposit_amount 没有 private 关键词,说明这个参数是公开数据。

这部分内容在 zokrates 中有讲述方式为

运行完成后会生成一堆文件,我们需要的是 proof.json, proving.key, verification.key, verifier.sol, out。

大部分其实都是模版文件生成文件可能不一样的地方在于 Verifier 合约中 verifyingKey,当然,我们阅读这个文件其实意义也不大,因为这里面全是一大堆数字和运算。实际上我们需要看的内容就是这些 ∑

可以看到,我们需要两个参数,proof 和 input。至于这两个参数是干嘛的,我们暂时不过多深究。不过我们需要注意的是,在 inputs 中,所有的共有参数都会被加入到这个数组中,在数字最开头部分被推入。

比如,自动生成的 proof.json 文件就是一个有效的数据。

至此,我们可以写一个简单合约。

要注意的是 Verifier 合约中会出现两个pragma solidity,记得删掉中间那一个,保留最上面的那个,否则编译无法通过。

首先我们需要明白一下标准流程,我们需要先进行 compile,setup,然后再进行 compute-witness,然后再进行 generate-proof,最后再进行 export-verifier。

但是这套流程并不是每次都必须的,因为这个是一个完整流程。我们需要进行一下区分。

compile - 编译 zk 电路 - 只需要执行一次 这个功能会生成 out 文件和 abi.json 文件,这两个是编译后的程序。

setup - 生成 zk 电路的 pk 和 vk - 只需要执行一次 这个功能会生成 proving.key 和 verification.key 文件,这两个文件是 zk 电路的公钥和私钥。实际上在进行 setup 的时候会产生 lambda,但是这些过程我们不需要太过于关心。

compute-witness - 生成证明 - 这个功能会生成 witness 文件,这个文件是一个中间文件。

generate-proof - 生成证明的 Proof - 这个功能会生成 proof.json 文件,这个文件是证明需要提交的内容,一般来说里面的内容就是我们需要提交到链上的参数。

export-verifier - 生成 verifier.sol - 这个功能会生成 verifier.sol 文件,这个文件是一个合约,我们需要将这个合约部署到链上,然后在我们的合约中调用这个合约来验证证明的正确性。

verify - 本地验证 - 这个功能会验证证明的正确性,但是这个功能并不会生成任何文件。

根据上面内容,我们可以写出一些用于测试的单元测试逻辑。

项目的基础文件都放在: https://github.com/nishuzumi/blog/tree/main/sources/zk 中,欢迎 Star。

登链社区

个人专栏

阅读更多

白话区块链

神译局

Gryphsis Academy

CertiK中文社区

新浪科技

元宇宙之心

金色早8点

Web3小律

MarsBit

ForesightNews

吴说区块链

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:15ms0-4:306ms