1. 引言

前序博客有:

  • Mina概览
  • Mina的支付流程

2021年12月,由Mina基金会和Mina生态合作伙伴O(1) Labs 与 ZK Hack 联合举办了 ZK Hack zkApps Workshop 和 zkApps Bootcamp。在这2个活动中,Mina社区可学习用SnarkyJS——为TypeScript库,用于编写Mina 零知识智能合约。

相关视频介绍有:

  • ZK HACK #7 - Introduction to SnarkyJS and Snapps with Mina
  • Snapps Bootcamp Intro
  • Snapps Bootcamp Wrap-Up
  • Zero Knowledge Smart Contracts, Snapps | Mina Protocol
  • Real World Use Cases that Mina Will Enable With ZK Technology | Mina Protocol

2. zkApps工作原理

zkApps为Mina的零知识智能合约。zkApps采用链下执行和大部分链下状态模型,支持隐私计算以及隐私状态或公开状态。在链下,zkApps可执行任意复杂的计算,仅需要支付固定费用即可将结果的零知识证明发送给链上以验证该计算,而其他区块链则是在链上运行计算并采用动态gas费用模型。

zkApps采用Mina zkApp CLI以TypeScript编写。zkApps当前支持在最新版的Chrome、Firefox、Edge和Brave浏览器上运行,未来将支持Safari浏览器。

一个zkApp中包含2个部分:

  • 1)一个智能合约:Mina的智能合约是以SnarkyJS编写的。
  • 2)一个UI供用户交互

2.1 基于零知识的智能合约

由于zkApps是基于零知识证明(zk-SNARKs)的,因此zkApp开发者编写的为“circuit”——基于此可派生出Prover函数和相应的Verifier函数。

  • Prover函数:会执行智能合约的自定义逻辑。Prover函数作为zkApp的一部分,运行在用户的web浏览器内。当与zkApp UI交互时,用户将输入任何数据(如,“以yyy价格购买ABC”)作为Prover函数的输入,该Prover函数会生成一个零知识证明。

    在用户的web浏览器中,需要为Prover函数所需的private输入和public输入数据:

    • private输入:提供给Prover函数之后,将不再需要。
    • public输入:提供给Prover函数,也需要提供给Verifier函数。对于你想保密的数据,永远不要将其作为public输入。
  • Verifier函数:验证所提供的零知识证明通过了Prover函数中定义的所有约束。无论Prover函数有多复杂,Verifier函数的验证通常很快效率很高。

2.2 Mina的Prover函数和Verification Key

当zkApp开发者编写完智能合约,运行npm run build,会编译输出smart_contract.js。然后,可运行Prover函数 或 生成一个Verification Key,这些在运行 或 部署智能合约时正好需要。
Prover函数运行在用户的web浏览器之内。
指定zkApp账号的Verification Key位于链上,Mina网络会使用链上的Verification Key来验证所提供的零知识证明是否能满足Prover函数中定义的所有约束。在创建zkApp账号时,需要用到Verification Key。

2.3 部署智能合约


开发者可使用Mina zkApp CLI来将智能合约部署到Mina网络中。部署过程是发送一笔包含了Verification Key的交易到Mina链上某地址。当Mina上的该地址包含了某Verification Key时,该地址就可作为zkApp账号。常规的Mina账号可接收任何交易,而zkApp账号仅可成功接收包含了满足Verifier函数的proof的交易。任何无法通过Verifier函数验证的交易都会被Mina网络拒绝。

当你部署一个新的Mina地址时,Mina protocol将为该账号创建收取1 MINA的手续费。这与zkApps无关,可防止女巫或DOS攻击。

2.4 部署zkApp UI


开发者通常会提供UI界面供用户与智能合约交互。UI通常为开发者部署在自定义的服务器上的静态网站。推荐web服务器可提供全局CDN以保证最佳的用户体验。该网站中需要包含之前编译智能合约所生成的smart_contract.js文件,

2.5 用户如何与zkApp交互?

为与zkApp交互,用户必须安装 Auro钱包for Google Chrome。未来将增加更多支持zkApps的钱包。

Auro为当前唯一支持zkApp交易的钱包。将zkApp部署到主机(例如mycolzkapp.com)后,用户可以与之交互:

  • 1)用户访问mycoolzkapp.com。
  • 2)用户与zkApp交互,输入所需的任意数据。(如,对于自动做市商,用户可指定“以yyy价格买xxx个ABC”).
  • 3)zkApp的Prover函数根据用户输入的数据在本地生成一个零知识证明。该数据可为保密的(不想在链上可见)或 公开的(可在链上或链下存储),具体取决于开发者的设定以及特定的应用场景。此外,随proof一起,还会生成该交易所将产生的状态更新列表。(Mina将这些状态更新列表称为“events”。)
  • 4)用户点击zkApp UI中的“submit to chain”,其钱包(如浏览器扩展钱包)将弹框确认是否发送该交易。钱包对包含了proof和相应所需更新的状态说明的交易 进行签名,并将签名后的交易发送的Mina链上。
  • 5)当Mina网络收到该交易,将验证proof是否成功通过了zkApp账号中的Verifier函数,若proof验证通过且相应的状态变更有效,网络将接受该交易并更新相应的zkApp状态。

由于用户交互发生在其本地web浏览器内部(客户端采用JavaScript),因此可保护用户的隐私。

2.6 链上状态如何更新?

链上的zkApp账号状态是如何更新的?
当web浏览器中运行Prover函数时,智能合约会输出一个proof和某些称为“events”的关联数据。这些输出会作为交易的一部分发送到zkApp地址。这些events为以JSON形式的明文描述——描述了如何更新zkApp账号的状态。

为保证这些events的整体性,这些events的hash值会作为智能合约的public输入,以保证当传输给Mina链上的Verifier函数时确保其不会被篡改。这样,Mina网络可确认proof和events的完整性,据此来更新zkApp账号的状态。

2.7 zkApp状态

Mina有2种状态类型:

  • 1)链上状态:在Mina链上的状态。每个zkApp账号有8个32字节的字段,每个字段具有任意存储空间,只要大小合适,在字段内可存放任何东西。如果你预计你的状态会比这个更大,或者如果你的zkApp对每个用户累积了状态,那么你会希望使用链外状态。
  • 2)链下状态:存储在其它地方,如IPFS的状态。【即将支持。】对于更大的数据,可考虑在zkApp的链上空间中存储Merkle tree root,该root会指向链下存储的状态。当在用户web浏览器中运行zkApp时,可向外部存储插入状态,如IPFS。当将该交易发送到Mina链上时,若接受该zkApp交易(即该proof&sate都是有效的),则zkApp交易将更新链上存储的Merkle tree root。

3. 如何编写zkApp?

Mina zkApp CLI为目前最易上手的编写zkApp智能合约工具,其可提供项目脚手架,包括SnarkyJS、测试框架(Jest)、代码自动格式化(Prettier)、linting(ES-Lint)等依赖项。

详细的编写合约流程可参看:

  • How to write a zkApp?
  • https://github.com/o1-labs/zkapp-cli/

4. zkApps项目亮点

在zkApps训练营中,O(1) Labs的工程师介绍了zkApps的高层架构、如何使用SanrkyJS编写智能合约,并要求开发者使用SnarkyJS编写一个游戏。

在4天的zkApps训练营中,有一些有趣的项目:

  • Mina Snapp: Stir with JarOfPickles
  • Sealed Bid Auction PoC with SnarkyJS
  • Mina Snapp: BullsAndCows
  • SNAPP DogNet
  • Mina Snapp: Snapp Hangman

由Mina社区开发的zkApps合集见:

  • zkApps for Mina

5. Mina规划

PROJECT DESCRIPTION ESTIMATED COMPLETION DATE
zkApps Bootcamp Formerly zkApps Hackathon. Engaged with developers and educated them to build with zkApps. Q4 2021 – Completed
NEW Kimchi SNARK New SNARK to bring faster verification and prover time than the original PLONK SNARK. Q4 2021 – Completed (to be incorporated in an upcoming hard fork)
Improve Node Stability Make node operation more stable. (Example project: BitSwap) Ongoing
NEW zkApps Builders Program A program to educate, support, and work with developers who are building zkApps, and enlist their help to improve zkApps and SnarkyJS. Q2 2022
NEW Document Mina’s crypto libraries and curve points Package Mina’s proof system to be easily adopted by other ZKP-enabled products. Q2 2022
zkApps Testing Formerly zkApps Testnet. This is now a series of phases to test the stability of zkApps on a network. Q2 2022
zkApps Software Development Kit (SDK) Provide the toolkit that the developers need to build on Mina: SnarkyJS & zkApp CLI. Q2 2022
Bridge to Ethereum: One Way Mina -> Ethereum Enable Ethereum developers to access the Mina state on EVM. Q2 2022
NEW Enable 3rd-party, off-chain usage of Mina’s proof system Enable zero-knowledge (ZK) enthusiasts to adopt Mina’s proof system without having to use the Mina chain. Q3 2022
NEW Non-Native Token Support Enable creation of non-native tokens on Mina (similar to ERC20). Q3 2022
Easy zkApps Programmability on Mainnet Enable easy programmability and basic use cases of zkApps on Mina Mainnet. Q3 2022
Multi-Environment Setup Upgrade infrastructure to support more networks running in parallel for Mina. Enable community to run their own networks. Q3 2022
Non-Consensus Nodes Direct access to the Mina network for web and mobile nodes, without needing to run a consensus node. Q3 2022
ZK Oracles Formerly WebzkApps. This is to ship the Minimally Viable Product (MVP) to connect real world data to blockchain in the most trustless way possible, using HTTPS. Q4 2022
NEW ZK Rollup on Mina Increase transaction throughput on Mina using ZK Rollup. TBD

zkApps的测试流程为:
Initial Testing (started Q4 2021) → Public QANet (targeting Q1 2022) → Testnet ‘Berkeley’ (targeting Q2 2022)

参考资料

[1] Mina Protocol Product Priorities – Q1 2022 Update
[2] zkApps Workshop & Bootcamp Retro
[3] What are zkApps?
[4] zkApps开发者文档
[5] Mina: Using Zero-Knowledge To Make Web3 Useful for Everyone

Mina的zkApp相关推荐

  1. Mina中的zkApp交易snark

    1. 引言 前序博客有: Mina中的支付交易snark(针对Payment交易) Mina的zkApp Mina中的树结构 --账号树 Mina中的user_command交易目前有: 1)Sign ...

  2. Mina Berkeley QANet测试网zkApp初体验

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...

  3. Mina中的支付交易snark

    1. 引言 前序博客有: Mina的支付流程 Mina中目前的交易类型主要有: Coinbase交易:给产块者激励和手续费的交易,为内部交易. Fee_transfer交易:给snark worker ...

  4. Mina中的Snark Worker

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...

  5. Mina Kimchi SNARK 代码解析

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...

  6. Mina中的Kimchi SNARK

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...

  7. Mina中的Pasta(Pallas和Vesta)曲线

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina采用Zcash团队发明的Pallas curve和Vesta curve(统称为Pasta曲线).其中 ...

  8. Mina中的wrap snark

    1. 引言 前序博客有: Mina技术白皮书 所谓wrap snark,是将Tick snark(Mina代码中称为step proof)包裹为Tock snark(Mina代码中称为wrap pro ...

  9. Mina中的Pickles SNARK

    1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature 视频可 ...

最新文章

  1. 不幸的是MyApp已停止。 我该如何解决?
  2. python编程入门指南磁力下载-使用python 将bt转磁力链接
  3. stm32无法进入串口接收中断
  4. 14种东西帮你治疗口腔溃疡 - 生活至上,美容至尚!
  5. java 构造函数抛出异常,构造函数抛出异常;嵌套异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext...
  6. 重庆邮电大学java试题_Java程序设计
  7. 【Python】可视化的离散傅里叶变换+快速傅里叶变换后时域信号的频域分析
  8. dede image.class.php,DEDE模板下载织梦DEDE 核心类TypeLink.class.php功能剖析
  9. TensorFlow DCNN
  10. arcgis 4.x graphicslayer点击事件_ArcGis中X、Y值的巧用方法小记
  11. 雅酷帮微信公众平台操作手册
  12. 兴趣爱好-常用的10种算法
  13. 在VMware上用深度技术安装windows xp
  14. Android7.0 头像 拍照、照片裁剪
  15. Android 之AS项目,无法编译,Make Project(小锤子)、Rebuild Project、Clean Project都无效
  16. Dell居然用EMS给我寄发票
  17. hibernate之@FilterDef @Filter注解的使用
  18. BiliBili系列(二):个人历史数据爬取与分析
  19. 日本IT巨头富士通完成区块链电力共享项目测试
  20. 常见命令之 head与tail

热门文章

  1. Python3利用VirusTotal的vt库通过API上传样本
  2. HDMI协议介绍(六)--EDID
  3. Android 自带的返回键功能
  4. vue项目created()被调用多次的坑
  5. c++第七课 加法算数运算
  6. 苹果闭门造车6年了!是否已经“翻车”?
  7. 一文教你如何使用miniconda
  8. 怎样用计算机算屋面的坡度,坡屋顶的坡度怎么计算
  9. 什么是Web1.0、2.0、3.0?
  10. Nim问题和阶梯Nim(staircase nim)