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相关推荐

  1. Mina中的Kimchi SNARK

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

  2. Mina中的wrap snark

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

  3. Mina中的zkApp交易snark

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

  4. Mina中的支付交易snark

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

  5. Mina中的Snark Worker

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

  6. Mina中的区块证明

    1. 引言 Mina的Pickles支持2种类型的tag: Side_loaded Compiled type ('var, 'value, 'n1, 'n2) t ={ kind : kind; i ...

  7. Mina中的stake delegation

    1. 引言 为支持将某人的质押委托给另一人,增加受托人赢的几率. 质押委托的设计目标为: 从网络安全的角度来看,希望质押或委托的金额越多越好. 应不会too expensive inside the ...

  8. mina 中的IoBufer(一)

    为什么80%的码农都做不了架构师?>>>    IoBuffer 是 MINA 中的独有接口,主要继承实现的是 java NIO 中的 ByteBuffer ,所以从使用方法上来看二 ...

  9. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三)

    2019独角兽企业重金招聘Python工程师标准>>> 从Jetty.Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三) 博客分类: java 最后我们再看看NIO方面 ...

最新文章

  1. 【webpack】-- 模块热替换
  2. IsNull和IsEmpty的区别
  3. Sklearn 损失函数如何应用到_15 分钟带你入门 sklearn 与机器学习(分类算法篇)...
  4. 人脸识别技术原理与工程实践
  5. Spring学习笔记--导航
  6. linux下自己安装软件做成命令
  7. JavaScript返回上一页并刷新的多种实现方法(十八)
  8. 《Android 应用案例开发大全(第二版)》——2.3节案例的基本框架
  9. 严版快速排序Partion方法
  10. 20、自动装配-@Autowired@Qualifier@Primary
  11. 隐马尔可夫模型HMM(一)
  12. crossplaform---Nodejs in Visual Studio Code 04.Swig模版
  13. 微软的傲慢与偏见——Cortana小娜失败根源
  14. 借用传感器用计算机测速度题,传感器原理及应用试题库(已做)
  15. 浅谈2020年国内第三方支付平台安全性
  16. 网页全屏的代码实现要不要了解一下(最全)
  17. 利用matlab制作光栅动画(莫尔条纹动画)
  18. java 中“==”与“equal” 的区别
  19. mysql workbench pk_MySQL Workbench筑表时PK, NN, UQ, BIN, UN, ZF, AL的意思
  20. 外研在线:如何用云技术优化教育服务

热门文章

  1. 创客匠人产品怎么样?
  2. 移动端(微信)页面 不回弹
  3. Pixhawk精准着陆之IRLock配置
  4. Flexsim循环产生不同类型和数量的临时实体
  5. 2023年长安大学交通运输专硕上岸经验
  6. 200条装修小常识②
  7. 程序员是怎样撩到一个女朋友的?
  8. 华为Hybrid接口实现vlan间互访。Hybrid接口解析
  9. PHP 的初始安装教程
  10. 干法读书心得:第一章 7、坚持“愚直地、认真地、诚实地”工作