零知识证明 - libsnark源代码分析

libsnark源代码,建议想深入零知识证明的小伙伴都读一读。Bellman库主要围绕Groth16算法,libsnark给出了SNARK相关算法的全貌,各种Relation,Language,Proof System。为了更好的生成R1CS电路,libsnark抽象出protoboard和gadget,方便开发者快速搭建电路。

本文中使用的libsnark源代码的最后一个commit如下:

commit 477c9dfd07b280e42369f82f89c08416319e24ae
Author: Madars Virza <madars@mit.edu>
Date:   Tue Jun 18 18:43:12 2019 -0400

    Document that we also implement the Groth16 proof system.

1. 源代码目录

源代码在libsnark目录下:

在这里插入图片描述

common - 定义和实现了一些通用的数据结构,例如默克尔树,稀疏向量等等。

relations - relation描述了“约束”关系。除了我们通常说的R1CS外,还有很多其他约束的描述语言。

reductions - 各种不同描述语言之间的转化。

knowledge_commit - 在multiexp的基础上,引入pair的概念,两个基点一个系数,计算结果称为一个pair。

zk_proof_systems - 零知识证明中的各种证明系统(包括Groth16,GM17等等)。

gadgetlib1/gadgetlib2 - 为了更方便的构建R1CS,libsnark抽象出一层gadget。已有的gadget,可以方便地整合搭建出新的电路。

2. Relation

需要零知识证明的问题都是NP问题。NP问题中有一类问题NPC(NP-complete)问题。所有的NP问题都可以转化为一个NPC问题。只要有一个NPC问题能多项式时间内解决,所有的NP问题都能多项式时间内解决。描述一个NPC问题,有多种方式。描述NPC问题的方式,称为“language”。Relation指的是一个NPC问题和该问题的解的关系。

libsnark库总结了几种描述语言:

  • constraint satisfaction problem类

    • R1CS - Rank-1 Constraint System
    • USCS - Unitary-Square Constraint System
  • circuit satisfaction problem类

    • BACS - Bilinear Arithmetic Circuit Satisfiability
    • TBCS - Two-input Boolean Circuit Satisfiability
  • ram computation类

    RAM是Random Access Machine的缩写。libsnark总结了两种RAM计算框架:

    • tinyRAM
    • fooRAM
  • arithmetic program类

    • QAP - Quadratic Arithmetic Program(GGPR13)
    • SQP - Square Arithmetic Program(GM17)
    • SSP - Square Span Program (DFGK14)

先介绍实现各种语言中需要的“variable” (variable.hpp/variable.tcc),再详细介绍R1CS以及QAP语言。

2.1 variable

 template<typename FieldT>
 class variable {
 public:
     var_index_t index;
     ...
 };

varible的定义非常简单,描述一个variable,只需要记录一个varible对应的标号就行了。比如对应编号为index的variable,表示的是x_{index}变量。

2.2 linear_term

linear_term描述了一个线性组合中的一项。线性组合中的一项由变量以及对应的系数组成:

template<typename FieldT>
 class linear_term {
 public:
     var_index_t index;
     FieldT coeff;
     ...
 };

2.3 linear_combination
linear_combination描述了一个完整的线性组合。一个linear combination由多个linear term组成:

 template<typename FieldT>
 class linear_combination {
 public:
     std::vector<linear_term<FieldT> > terms;
     ...
 };

2.4 R1CS

R1CS定义在constraint_satisfaction_problems/r1cs/r1cs.hpp。R1CS约束就是满足以下形式的一个表达式:

< A , X > * < B , X > = < C , X >

X是所有变量组合的向量,A/B/C是和X等长的向量。<,>代表的是点乘。一个R1CS系统由多个R1CS约束组成。

R1CS约束定义为:

 template<typename FieldT>
 class r1cs_constraint {
 public:
     linear_combination<FieldT> a, b, c;
     ...
 };

一个R1CS约束,可以由a/b/c三个linear_combination表示。
一个R1CS系统中的所有变量的赋值,又分成两部分:primary input和auxiliary input。primary就是"statement", auxiliary就是“witness”。

 template<typename FieldT>
 using r1cs_primary_input = std::vector<FieldT>;
 template<typename FieldT>
 using r1cs_auxiliary_input = std::vector<FieldT>;

一个R1CS系统,包括多个R1CS约束。当然,每个约束的向量的长度是固定的(primary input size + auxiliary input size + 1)。

 template<typename FieldT>
 class r1cs_constraint_system {
 public:
     size_t primary_input_size;
     size_t auxiliary_input_size;
     std::vector<r1cs_constraint<FieldT> > constraints;
     ...
}

2.5 QAP
QAP定义在arithmetic_programs/qap/qap.hpp。libsnark采用的QAP的公式是:A*B-C=H*Z。

 template<typename FieldT>
 class qap_instance {
 private:
     size_t num_variables_;
     size_t degree_;
     size_t num_inputs_;
 public:
     std::shared_ptr<libfqfft::evaluation_domain<FieldT> > domain;
     std::vector<std::map<size_t, FieldT> > A_in_Lagrange_basis;
     std::vector<std::map<size_t, FieldT> > B_in_Lagrange_basis;
     std::vector<std::map<size_t, FieldT> > C_in_Lagrange_basis;
}

num_variables_表示QAP电路的变量的个数。num_inputs_表示QAP电路的"statement"对应变量的个数。degree_表示A/B/C中每个多项式的阶的个数(和电路的门的个数相关)。

domain是计算傅立叶变换/反傅立叶变换的引擎,由libfqfft库实现。

何为Lagrange basis?
在这里插入图片描述
给定一系列的x和y的对应关系,通过拉格朗日插值的方式,可以确定多项式:
p(x) = y_0l_0(x) + y_1l_1(x) + … + y_nl_n(x)
其中l_0(x), l_1(x), … l_n(x)就称为拉格朗日basis。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
libsnark的安装可以按照以下步骤进行: 1. 首先,在你想要建立libsnark文件夹的位置,比如在Desktop上,使用命令行进入该位置并创建文件夹。例如,使用命令`cd Desktop`进入Desktop文件夹,然后使用命令`mkdir libsnark`创建libsnark文件夹。\[1\] 2. 进入libsnark文件夹,使用命令`cd libsnark`。\[1\] 3. 根据你的Ubuntu版本执行相应的命令来安装所需的依赖项。如果你的版本是18.04-20.04,执行命令`sudo apt install build-essential cmake git libgmp3-dev libprocps-dev python3-markdown libboost-program-options-dev libssl-dev python3 pkg-config`。如果你的版本是16.04,执行命令`sudo apt-get install build-essential cmake git libgmp3-dev libprocps4-dev python-markdown libboost-all-dev libssl-dev`。如果你的版本是14.04,执行命令`sudo apt-get install build-essential cmake git libgmp3-dev libprocps3-dev python-markdown libboost-all-dev libssl-dev`。\[3\] 4. 安装子模块ate-pairing,可以参考官方文档或博客中的指南。\[2\] 5. 搭建build环境,具体步骤可以参考官方文档或博客中的指南。\[2\] 请注意,根据你的具体情况和Ubuntu版本,可能需要进行一些调整。确保在安装过程中遵循指南中的步骤,并根据需要进行必要的更改。 #### 引用[.reference_title] - *1* *2* [零知识证明C++库libsnark的安装经验](https://blog.csdn.net/matlabdd1/article/details/123637302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [零知识证明平台libsnark的搭建过程(超详细,失败了十几次最终成功)](https://blog.csdn.net/weixin_44565944/article/details/112250664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值