Mina中的Pickles SNARK
1. 引言
Mina系列博客有:
- Mina概览
- Mina的支付流程
- Mina的zkApp
- Mina中的Pasta(Pallas和Vesta)曲线
- Mina中的Schnorr signature
视频可参看:
- 2020年5月 The Pickles Inductive SNARK Composition System
Pickles是一个新的证明系统和相关的工具包,它是第一个能部署的无需可信设置可递归合成的SNARK。
在Coda testnet(3.3)中,Mina团队发布了Pickles。
Pickles包含了2个要素:
- core zkSNARK
- 开发者工具包:包含大量库功能和Pickles归纳证明系统
2. Pickles core zkSNARK
Pickles的zkSNARK在许多方面显著改进了 Coda以前基于Groth16的递归SNARK:
- 1)通过从大的753位field 切换到小的255位field,提高了整个Coda的效率:
- VRF evaluation速度提升了16x
- Hash运算速度提升了8x
- 账本存储需求降低了3x
- 2)移除了可信设置。Pickles为:基于Halo的inner product argument + batch处理技术 + 定制的约束 + 大量优化。
- 3)支持定制的约束,以实现高效递归,特别是允许高效:
- Poseidon hash运算
- 椭圆曲线scaling计算、加法计算和doubling计算。
3. Pickles开发者工具包
Pickles开发者工具包中的Pickles归纳证明系统 对现有递归解决方案进行了大幅改进,将底层密码学中的各种乱七八糟的细节进行了抽象,使得所涉及的递归证明系统适于应用开发者。
4. Pickles性能比对
Pickles是唯一一个支持任意分支递归(这对扩展性至关重要)的无需可信设置的zk-SNARK。此外,其Prover证明速度很快,与基于AIR的STARKs不同,Pickles可以一个小的proof size来支持通用电路。下表概述了Pickles如何与其他系统对比:
5. Pickled zkApps展望
对于大多数可验证应用来说,仅是隔离运行是不够的,除了以上3点(即 部署路线、开发者工具 和 可扩展性),还要求:
- 4)能够在经过充分验证的生态系统中与其他应用程序进行组合式交互。
Pickles为Mina支持zkApps的基础技术。
6. 实际Pickles实现
Mina中的详细Pickles代码实现见:
- https://github.com/MinaProtocol/mina/tree/develop/src/lib/pickles
Pickles是Mina的归纳zk-SNARK合成系统。支持使用zk-SNARK构造证明,并以灵活的方式将它们结合起来,以提供增量可验证计算。
为了高效实现增量可验证计算,Pickles采用了 一对名为Pasta的友好曲线。在实际Mina源代码中,分别将这组曲线称为“tick”和“tock”:
- Tick:对应为Vesta曲线(在Pickles内部又将其称为Step),constraint domain size为2182^{18}218,用于区块证明和交易证明。
- Tock:对应为Pallas曲线(在Pickles内部又将其称为Wrap),constraint domain size为2172^{17}217,用于签名。
由于Tock Prover的工作量更少(仅运行递归验证,不运行任何其它逻辑),因此需要的constraints更少,相应具有更小的constraint domain size。
Tock用于证明 Tick证明的验证,输出为 Tick证明;
Tick用于证明 Tock证明的验证,输出为 Tock证明。
具体为:
- Provetock(Verify(Tick))=Tickproof\text{Prove}_{tock}(\text{Verify}(Tick))=Tick_{proof}Provetock(Verify(Tick))=Tickproof
- Provetick(Verify(Tock))=Tockproof\text{Prove}_{tick}(\text{Verify}(Tock))=Tock_{proof}Provetick(Verify(Tock))=Tockproof
Mina中,Tick和Tock最多可验证2个对方类型的证明,尽管,理论上来说可同时验证的数量可以更多。
当前,Mina中的情况为:
- 每个Tock中总是包裹了1个Tick证明。
- 1个Tick证明可验证2个Tock证明:
- Blockchain SNARK的输入为 前一blockchain SNARK proof + transaction proof。
- 验证2笔Tock transaction proof。
7. Mina中的Pickles模块代码解析
Mina中的Pickles模块主要包含:
- 1)backend模块:主要定义了Tick和Tock模块。
- 2)limb_vector模块:主要是将大的Field和Scalar值以u64数组表示。
- 3)one_hot_vector模块:
- 4)pseudo模块:
- 5)precomputed模块:根据gen_values/gen_values.ml,为vesta和pallas曲线生成的Lagrange pre-computations。详细值见:src/lib/crypto/kimchi_backend/pasta/precomputed.ml。
- 6)plonk_checks模块:定义了vanishing_polynomial_domain、plonk_domain、domain等类型,以及map_reduce、pow2pow、vanishing_polynomial、domain、all_but、actual_evaluation、evals_of_split_evals、scalars_env、perm_alpha0(2+15=17)、ft_eval0、derive_plonk、checked等函数。
- 7)composition_types模块:包含digest、index、spec、bulletproof_challenge、composition_types等子模块
- 8)step_branch_data模块:step_branch_data为The data obtained from “compiling” an inductive rule into a circuit,结构定义为:【其中的create函数为compile an inductive rule。】
(* The data obtained from "compiling" an inductive rule into a circuit. *)
type ( 'a_var, 'a_value, 'max_branching, 'branches, 'prev_vars, 'prev_values, 'local_widths, 'local_heights )t =| T :{ branching : 'branching Nat.t * ('prev_vars, 'branching) Hlist.Length.t; index : Types.Index.t; lte : ('branching, 'max_branching) Nat.Lte.t; domains : Domains.t; rule :( 'prev_vars, 'prev_values, 'local_widths, 'local_heights, 'a_avar, 'a_value )Inductive_rule.t; main :step_domains:(Domains.t, 'branches) Vector.t-> ( (Unfinalized.t, 'max_branching) Vector.t, Impls.Step.Field.t, (Impls.Step.Field.t, 'max_branching) Vector.t )Types.Pairing_based.Statement.t-> unit; requests :(module Requests.Step.Swith type statement = 'a_valueand type max_branching = 'max_branchingand type prev_values = 'prev_valuesand type local_signature = 'local_widthsand type local_branches = 'local_heights)}-> ( 'a_var, 'a_value, 'max_branching, 'branches, 'prev_vars, 'prev_values, 'local_widths, 'local_heights )t
- 9)step_main模块:
step_main
函数为对应the input inductive rule的SNARK函数。 - 10)wrap_main模块:
wrap_main
函数为用于包裹来源于the given set of keys的任意proof的SNARK函数。 - 11)dlog_main模块:
7.1 backend模块
Mina Pickles的backend模块中主要定义了Tick模块和Tock模块:
module Tick = structinclude Kimchi_backend.Pasta.Vesta_based_plonkmodule Inner_curve = Kimchi_backend.Pasta.Pasta.Pallas
endmodule Tock = structinclude Kimchi_backend.Pasta.Pallas_based_plonkmodule Inner_curve = Kimchi_backend.Pasta.Pasta.Vesta
end
7.2 plonk_checks模块
plonk_checks模块中包含:
- 1)scalars模块:由gen_scalars/gen_scalars.ml生成。
- 2)plonk_checks模块:定义了vanishing_polynomial_domain、plonk_domain、domain等类型,以及map_reduce、pow2pow、vanishing_polynomial、domain、all_but、actual_evaluation、evals_of_split_evals、scalars_env、perm_alpha0(2+15=17)、ft_eval0、derive_plonk、checked等函数。
7.2.1 scalars模块
scalars模块中:
- 1)gate类型有:
module Gate_type = structmodule T = structtype t = Poseidon | VarBaseMul | EndoMul | CompleteAdd | EndoMulScalar
- 2)Column类型有:
module Column = structopen Core_kernelmodule T = structtype t = Witness of int | Index of Gate_type.t | Coefficient of int
- 3)Env类型有:
module Env = structtype 'a t ={ add : 'a -> 'a -> 'a; sub : 'a -> 'a -> 'a; mul : 'a -> 'a -> 'a; pow : 'a * int -> 'a; square : 'a -> 'a; zk_polynomial : 'a; omega_to_minus_3 : 'a; zeta_to_n_minus_1 : 'a; var : Column.t * curr_or_next -> 'a; field : string -> 'a; cell : 'a -> 'a; alpha_pow : int -> 'a; double : 'a -> 'a; endo_coefficient : 'a; mds : int * int -> 'a; srs_length_log2 : int}
end
- 4)Ticke和Tock模块中包含了constant_term和index_terms约束实现:
module type S = sigval constant_term : 'a Env.t -> 'aval index_terms : 'a Env.t -> 'a Lazy.t Column.Table.t
end(* The constraints are basically the same, but the literals in them differ. *)
7.2.2 plonk_checks模块
type 'field vanishing_polynomial_domain =< vanishing_polynomial : 'field -> 'field >type 'field plonk_domain =< vanishing_polynomial : 'field -> 'field; shifts : 'field Dlog_plonk_types.Shifts.t; generator : 'field; size : 'field >type 'field domain = < size : 'field ; vanishing_polynomial : 'field -> 'field >
7.3 composition_types模块
composition_types模块包含:
- 1)digest模块:主要包含field的bit与limb_vector表示之间的相互转换。
- 2)index模块:主要包含field的char与bit表示之间的相互转换。
- 3)spec模块:主要定义了Basic结构类型——分为Index、Field、Bool、Digest、Challenge、Bulletproof_challenge等子类型。以及rec T、rec typ、rec pack、rec etyp等递归变量,以及pack_basic、pack、typ_basic、typ、packed_typ_basic、packed_typ等函数。
- 4)bulletproof_challenge模块:主要定义了bulletproof_challenge结构 及 相应的pack、unpack和typ函数。
module Stable = structmodule V1 = structtype 'challenge t = { prechallenge : 'challenge }module Stable = structmodule V2 = structtype 'f t = 'f Kimchi.Protocol.scalar_challenge = { inner : 'f }
- 5)composition_types模块:定义了index_to_field_elements变量。包含了Dlog_based、Nvector、Wrap_bp_vec、Step_bp_vec和Challenges_vector模块。
其中:- 5.1)Challenges_vector模块中定义了变量和值的vector表示:
module Challenges_vector = structtype 'n t =(Backend.Tock.Field.t Snarky_backendless.Cvar.t Wrap_bp_vec.t, 'n) Vector.tmodule Constant = structtype 'n t = (Backend.Tock.Field.t Wrap_bp_vec.t, 'n) Vector.tend end
7.3.1 composition_types模块中的Dlog_based模块
Dlog_based模块中包含:
- 1)Proof_state模块
- 2)Pass_through模块:Pass_through结构定义为:
type ('g, 's, 'sg, 'bulletproof_challenges) t ={ app_state : 's; dlog_plonk_index : 'g Plonk_verification_key_evals.t; sg : 'sg; old_bulletproof_challenges : 'bulletproof_challenges}
(* Plonk_verification_key_evals.t结构为: *)
type 'comm t ={ sigma_comm : 'comm Dlog_plonk_types.Permuts_vec.Stable.V1.t; coefficients_comm : 'comm Dlog_plonk_types.Columns_vec.Stable.V1.t; generic_comm : 'comm; psm_comm : 'comm; complete_add_comm : 'comm; mul_comm : 'comm; emul_comm : 'comm; endomul_scalar_comm : 'comm}
- 3)Statement模块:Statement结构定义为:
type ( 'plonk, 'scalar_challenge, 'fp, 'fq, 'me_only, 'digest, 'pass_through, 'bp_chals, 'index )t ={ proof_state :( 'plonk, 'scalar_challenge, 'fp, 'fq, 'me_only, 'digest, 'bp_chals, 'index )Proof_state.Stable.V1.t; pass_through : 'pass_through}
7.3.1.1 Proof_state模块
Proof_state结构定义为:
module Stable = structmodule V1 = structtype ( 'plonk, 'scalar_challenge, 'fp, 'fq, 'me_only, 'digest, 'bp_chals, 'index )t ={ deferred_values :( 'plonk, 'scalar_challenge, 'fp, 'fq, 'bp_chals, 'index )Deferred_values.Stable.V1.t; sponge_digest_before_evaluations : 'digest(* Not needed by other proof system *); me_only : 'me_only}
Proof_state模块中包含了:
- 1.1)Deferred_values模块:
(* Defered_values结构定义为: *) module Stable = struct[@@@no_toplevel_latest_type]module V1 = structtype ( 'plonk, 'scalar_challenge, 'fp, 'fq, 'bulletproof_challenges, 'index )t ={ plonk : 'plonk; combined_inner_product : 'fp; b : 'fp; xi : 'scalar_challenge; bulletproof_challenges : 'bulletproof_challenges; which_branch : 'index} (*Defered_values.Plonk.Minimal结构定义为:*) module V1 = structtype ('challenge, 'scalar_challenge) t ={ alpha : 'scalar_challenge; beta : 'challenge; gamma : 'challenge; zeta : 'scalar_challenge} (* Defered_values.Plonk.In_circuit定义为: *) type ('challenge, 'scalar_challenge, 'fp) t ={ alpha : 'scalar_challenge; beta : 'challenge; gamma : 'challenge; zeta : 'scalar_challenge(* TODO: zeta_to_srs_length is kind of unnecessary.Try to get rid of it when you can.*); zeta_to_srs_length : 'fp; zeta_to_domain_size : 'fp; poseidon_selector : 'fp; vbmul : 'fp; complete_add : 'fp; endomul : 'fp; endomul_scalar : 'fp; perm : 'fp; generic : 'fp Generic_coeffs_vec.t}
- 1.2)Me_only模块:
(* Me_only结构定义为: *) type ('g1, 'bulletproof_challenges) t ={ sg : 'g1; old_bulletproof_challenges : 'bulletproof_challenges }
- 1.3)Minimal模块
- 1.4)In_circuit模块:定义了变量spec:
let spec =let open Spec inStruct[ Vector (B Field, Nat.N15.n); Vector (B Challenge, Nat.N2.n); Vector (Scalar Challenge, Nat.N3.n); Vector (B Digest, Nat.N3.n); Vector (B Bulletproof_challenge, Backend.Tick.Rounds.n); Vector (B Index, Nat.N1.n)]
参考资料
[1] Mina protocol手册之Pickles
[2] Mina官方2020年8月博客 Meet Pickles SNARK: Enabling Smart Contracts on Coda Protocol
Mina中的Pickles SNARK相关推荐
- Mina中的Kimchi SNARK
1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...
- Mina中的wrap snark
1. 引言 前序博客有: Mina技术白皮书 所谓wrap snark,是将Tick snark(Mina代码中称为step proof)包裹为Tock snark(Mina代码中称为wrap pro ...
- Mina中的zkApp交易snark
1. 引言 前序博客有: Mina中的支付交易snark(针对Payment交易) Mina的zkApp Mina中的树结构 --账号树 Mina中的user_command交易目前有: 1)Sign ...
- Mina中的支付交易snark
1. 引言 前序博客有: Mina的支付流程 Mina中目前的交易类型主要有: Coinbase交易:给产块者激励和手续费的交易,为内部交易. Fee_transfer交易:给snark worker ...
- Mina中的Snark Worker
1. 引言 Mina系列博客有: Mina概览 Mina的支付流程 Mina的zkApp Mina中的Pasta(Pallas和Vesta)曲线 Mina中的Schnorr signature Min ...
- Mina中的区块证明
1. 引言 Mina的Pickles支持2种类型的tag: Side_loaded Compiled type ('var, 'value, 'n1, 'n2) t ={ kind : kind; i ...
- Mina中的stake delegation
1. 引言 为支持将某人的质押委托给另一人,增加受托人赢的几率. 质押委托的设计目标为: 从网络安全的角度来看,希望质押或委托的金额越多越好. 应不会too expensive inside the ...
- mina 中的IoBufer(一)
为什么80%的码农都做不了架构师?>>> IoBuffer 是 MINA 中的独有接口,主要继承实现的是 java NIO 中的 ByteBuffer ,所以从使用方法上来看二 ...
- 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三)
2019独角兽企业重金招聘Python工程师标准>>> 从Jetty.Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三) 博客分类: java 最后我们再看看NIO方面 ...
最新文章
- 【webpack】-- 模块热替换
- IsNull和IsEmpty的区别
- Sklearn 损失函数如何应用到_15 分钟带你入门 sklearn 与机器学习(分类算法篇)...
- 人脸识别技术原理与工程实践
- Spring学习笔记--导航
- linux下自己安装软件做成命令
- JavaScript返回上一页并刷新的多种实现方法(十八)
- 《Android 应用案例开发大全(第二版)》——2.3节案例的基本框架
- 严版快速排序Partion方法
- 20、自动装配-@Autowired@Qualifier@Primary
- 隐马尔可夫模型HMM(一)
- crossplaform---Nodejs in Visual Studio Code 04.Swig模版
- 微软的傲慢与偏见——Cortana小娜失败根源
- 借用传感器用计算机测速度题,传感器原理及应用试题库(已做)
- 浅谈2020年国内第三方支付平台安全性
- 网页全屏的代码实现要不要了解一下(最全)
- 利用matlab制作光栅动画(莫尔条纹动画)
- java 中“==”与“equal” 的区别
- mysql workbench pk_MySQL Workbench筑表时PK, NN, UQ, BIN, UN, ZF, AL的意思
- 外研在线:如何用云技术优化教育服务