1. 引言

Mina系列博客有:

  • Mina概览
  • Mina的支付流程
  • Mina的zkApp
  • Mina中的Pasta(Pallas和Vesta)曲线
  • Mina中的Schnorr signature
  • Mina中的Pickles SNARK
  • Mina中的Kimchi SNARK
  • Mina中的Poseidon hash

Kimchi SNARK 代码实现见:

  • https://github.com/o1-labs/proof-systems(Rust语言)

在该代码库中,主要包括的模块有:

  • 1)Cairo模块:为提供proofs of computation的StarkWare 框架。可使用Cairo语言来编写程序,然后将编译的字节码传给Stark Prover。最初的 Cairo实现 采用Python编写。而在此,提供了Rust版本编写的Cairo,可使用Kimchi zk-SNARK来证明statements。将基于Cairo的证明系统称为Turshi。在代码中包含了一系列的测试用例来对比 [Rust版本的Cairo——Turshi] 与 [Cairo playground] 二者的一致性。同时,也会检查实际运行程序的constraints。
  • 2)Curves模块:为当前使用的pasta曲线。
  • 3)Groupmap模块:用于将elliptic curve element转换为field element。
  • 4)Oracle模块:实现了Poseidon hash函数。详细可参看博客Mina中的Poseidon hash。
  • 5)Hasher模块:为针对Oracle模块封装的Mina hash接口。在Oracle模块中实现了2个版本的Poseidon hash函数,分别为legacy版本和kimchi experimental版本。提供的ScalarChallenge供zk-SNARK中生成非交互式challenge使用。
  • 6)OCaml模块:提供了ocaml-gen工具来将Rust代码编译为OCaml bindings。
  • 7)Poly-commitment模块:实现了多项式承诺。
  • 8)Signer模块:实现了 Mina针对Pallas Pasta曲线的 Schnorr签名算法 接口。由于Poseidon hash函数实现了legacy版本和kimchi experimental版本,因此相应的签名机制也分为了legacy 和 experimental kimchi版本。
  • 9)Tools模块:包含了Kimchi-visu可视化工具,可帮助以HTML table的形式来展示circuit。
  • 10)Utils模块:包含了一些有用的函数和traits。
  • 11)Kimchi模块:为可证明程序正确执行的基于Plonk的通用zk-SNARK证明系统。

2. Cairo模块

Cairo模块内代码会:

  • 运行a bytecode compiled Cairo program
  • 生成相应的memory instantiation

Cairo中:

  • 用某些代码来表示Cairo指令及其分解
  • 以构成整个程序的计算步骤来表示相应的逻辑

Cairo模块中包含多个子模块:

  • 1)flags:定义了使步骤更易读的一些常量。当指向单个bit标志时,仅需要1个常量。
  • 2)helper:包含了对Cairo有用的协议field helper。
  • 3)memory:表示Cairo memory,包含了占据前几个entries的compiled Cairo program。
  • 4)runner:表示以一系列连续的执行步骤来运行一个Cairo程序,每个步骤定义了Cairo指令的运行逻辑。
  • 5)word:Cairo语言原生支持模为0x800000000001100000000000000000000000000000000001=2251+17∗2192+10x800000000001100000000000000000000000000000000001=2^{251}+17*2^{192}+10x800000000001100000000000000000000000000000000001=2251+17∗2192+1的有限域内的field element。Pallas曲线有255位,因此Cairo原生指令将适用。这意味着Rust版本的Cairo实现 比 Python版本实现 可为immediate value提供更大的域。

3. Groupmap模块

其实质为针对椭圆曲线E:y2=x3+ax+bE:y^2=x^3+ax+bE:y2=x3+ax+b over filed Fq\mathbb{F}_qFq​,将某t∈Fqt\in \mathbb{F}_qt∈Fq​映射为曲线EEE上有效点(x,y)(x,y)(x,y),其中x,y∈Fqx,y\in\mathbb{F}_qx,y∈Fq​。

Groupmap对应的OCaml实现见:

  • https://github.com/o1-labs/snarky/blob/2e9013159ad0d1df0af681735b89518befc4be11/group_map/group_map.ml#L4

实际算法实现参考的论文有:

  • SvdW06:Shallue和van de Woestijne 2006年论文《Construction of rational points on elliptic curves over finite fields》。
  • WB19:Wahby和Dan Boneh 2019年论文《Fast and simple constant-time hashing to the BLS12-381 elliptic curve》

4. Poly-commitment模块

Poly-commitment模块中包含以下子模块:

  • 1)chunked子模块。其实是根据Horner rule将p(x)=a0+a1∗x+a2∗x2+a3∗x3+a4∗x4+...+anxnp(x) = a_0 + a_1*x + a_2*x^2 + a_3*x^3 + a_4*x^4 + ...+a_nx^np(x)=a0​+a1​∗x+a2​∗x2+a3​∗x3+a4​∗x4+...+an​xn 优化为 p(x)=a0+x∗(a1+x∗(a2+x∗(a3+x∗(a4+...x∗(an−1+x∗(an+x∗0)))))p(x) = a_0 + x*(a_1 + x*(a_2 + x*(a_3 + x*(a_4 + ... x*(a_{n-1} + x*(a_n+x*0)))))p(x)=a0​+x∗(a1​+x∗(a2​+x∗(a3​+x∗(a4​+...x∗(an−1​+x∗(an​+x∗0))))),关键代码为:【要比https://github.com/lovesh/amcl_rust_wrapper中的实现优美。】
 /// Multiplies each commitment chunk of f with powers of zeta^n/// Note that it ignores the shifted part.// TODO(mimoo): better name for this functionpub fn chunk_commitment(&self, zeta_n: C::ScalarField) -> Self {let mut res = C::Projective::zero();// use Horner's to compute chunk[0] + z^n chunk[1] + z^2n chunk[2] + ...// as ( chunk[-1] * z^n + chunk[-2] ) * z^n + chunk[-3]// (https://en.wikipedia.org/wiki/Horner%27s_method)for chunk in self.unshifted.iter().rev() {res *= zeta_n;res.add_assign_mixed(chunk);}PolyComm {unshifted: vec![res.into_affine()],shifted: self.shifted,}}
  • 2)combine子模块:实现了一些批量曲线运算,如batch_add_assign_in_place等运算,支持并行曲线运算且避免了在每个算法中重新分配临时数组。借助batch inversion 算法,可将计算数组内所有元素的倒数的运算开销降为 每个元素仅需3次乘法运算。
  • 3)srs子模块:实现了Marlin structured reference string原语。其实就是non trusted setup方式来生成随机的generators G⃗,h\vec{G},hG,h以及lagrange_bases, endo_r和endo_q值。
  • 4)evaluation_proof子模块:针对srs实现相应的open和challenge函数。
  • 5)commitment子模块:实现了基于Dlog的多项式承诺机制,支持:
    • 5.1)以多项式的最大degree进行commit。
    • 5.2)在指定点进行批量open,生成batched opening proof。
    • 5.3)批量验证batched opening proofs。【即支持批量open多个不同的点。】

Mina的polynomial commitment为类似Bulletproofs类型的,结合了以下论文的算法做的实现:

  • (1)2020年 PCD论文 附录A.1中描述的多项式承诺机制。
  • (2)2019年 Halo论文 第3.1节中描述的zero-knowledge opening。

相关博客有:

  • proof-carrying data from accumulation schemes学习笔记
  • Bulletproofs: Short Proofs for Confidential Transactions and More学习笔记
  • Bulletproofs 代码解析
  • Halo: Recursive Proof Composition without a Trusted Setup 学习笔记
  • Halo代码解析

5. Kimchi-visu可视化工具

调用方法为:

kimchi_visu::visu(&index, Some(witness));

也可直接复用tools/kimchi-visu/src/main.rs中的实现,然后运行:

$ cargo run --bin kimchi-visu

Kimchi-visu可视化工具会将circuit和constraints信息以HTML的形式展示:

6. Utils模块

Utils模块中包含了一些有用的函数和traits:

  • 1)dense_polynomial:为arkworks的DensePolynomial增加了一些有用的函数。
  • 2)evaluations:为arkworks的Evaluations增加了一些有用的函数。
  • 3)field_helpers:基于field扩展出的一些函数。
  • 4)hasher:提供了CryptoDigest trait,为hash运算提供了通用接口。
  • 5)serialization:为arkworks中实现了[CanonicalSerialize] 和 [CanonicalDeserialize] 的一些类型实现了序列化和反序列化函数。
  • 6)types:定义了一些通用类型。

7. Kimchi模块

Kimchi为可证明程序正确执行的基于Plonk的通用zk-SNARK证明系统。
采用cargo criterion进行bench:

$ cargo criterion -p kimchi --bench proof_criterion


Mina Kimchi SNARK 代码解析相关推荐

  1. Mina中的Kimchi SNARK

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

  2. matrix_multiply代码解析

    matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...

  3. CornerNet代码解析——损失函数

    CornerNet代码解析--损失函数 文章目录 CornerNet代码解析--损失函数 前言 总体损失 1.Heatmap的损失 2.Embedding的损失 3.Offset的损失 前言 今天要解 ...

  4. 视觉SLAM开源算法ORB-SLAM3 原理与代码解析

    来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...

  5. java获取object属性值_java反射获取一个object属性值代码解析

    有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: privat ...

  6. python中的doc_基于Python获取docx/doc文件内容代码解析

    这篇文章主要介绍了基于Python获取docx/doc文件内容代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 整体思路: 下载文件并修改后缀 ...

  7. mongoose框架示例代码解析(一)

    mongoose框架示例代码解析(一) 参考: Mongoose Networking Library Documentation(Server) Mongoose Networking Librar ...

  8. ViBe算法原理和代码解析

    ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网:http:// ...

  9. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )

    文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...

最新文章

  1. intel的linux证书过期,rhce证书过期了可以怎么办
  2. 【云栖大会】阿里云生态 开启智能“大航海时代”
  3. pie hist plot boxplot
  4. JavaScript倒计时
  5. Qt核心知识归类及相关资料
  6. jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )...
  7. payara 创建 集群_Apache Payara:让我们加密
  8. POJ 1159 (DP)
  9. Unity3D之NGUI基础5:UISprite显示图片
  10. C:\Program Files (x86)\SogouInput\Components\程序异常结束 ,QT
  11. 国际通用计算机编码,计算机中的编码知识
  12. 【资源导航】我所用到过的工具及下载地址
  13. MAC常用java开发软件
  14. weka API,创建线性回归时出现缺少no.uib.cipr.matrix和org.netlib.blas的解决方案
  15. Win Server 2008 R2
  16. 武汉大学计算机学院朱晓薇,基于SDN的TDMA体制星间网络架构设计
  17. 写的不错的家庭关系的文章,转自天涯。《2》
  18. Android apk 腾讯云-乐固的加固及签名
  19. layui使用初步入门
  20. 12864液晶屏接口定义,16引脚的(普中科技所配)

热门文章

  1. [usOJ5529]小奇探险
  2. php验证码手册,验证码_专题_帮助文档_Thinkphp手册
  3. Solidwork仿真总结(Motion,Xpress、Simulation,Flow Simulaiton)
  4. STP-16-根防护,BPDU防护和BPDU过滤
  5. VALSE 4月12日 下午 第一会场 深度学习模型设计 会议记录
  6. [魔方]魔教秘籍4:《封王-易筋经》(概要)
  7. 上汽荣威E50 颇有想法的纯电动产品
  8. 知识小结------数据分析------Fisher‘s exact test(费希尔检测)
  9. R语言 多个变量进行 卡方检验 循环 fisher检验 chi test 循环
  10. hazelcast java_Hazelcast