链资讯 链资讯
Ctrl+D收藏链资讯

ONS:技术干货 | 零知识证明Learn by Coding:libsnark 入门篇_NCL

作者:

时间:

libsnark是目前实现zk-SNARKs电路最重要的框架,在众多私密交易或隐私计算相关项目间广泛应用,其中最著名当然要数Zcash。Zcash在Sapling版本升级前一直使用libsnark来实现电路。毫不夸张地说,libsnark支撑并促进了zk-SNARKs技术的

首次大规模应用,填补了零知识证明技术从最新理论到工程实现间的空缺。

希望通过本系列文章,所有开发者都能亲自上手实践,在短时间内迅速入门libsnark,一步步了解libsnark的基本概念,学会如何开发zk-SNARKs电路,完成证明的生成和验证,最终将零知识证明应用到真实业务中去。

1、zk-SNARKs和libsnark背景简介

零知识证明,可能是目前最具应用前景和想象力的密码学黑科技。而zk-SNARKs正是一类零知识证明方案的简称,全称为Zero-KnowledgeSuccinctNon-interactiveArgumentsofKnowledge。这一名字几乎包含了其所有技术特征,即可以在不泄露任何其他信息的前提下证明一个命题的正确性,并且最终生成的证明具有简洁性,也就是说最终生成的证明足够小,并且与计算量大小无关,是一个常数。用白话说就是,你理论上可以在不暴露任何隐私的情况下向其他所有人证明某件事,并且生成的证明体积很小,校验成本很低,与需要证明的内容计算量无关。听起来简直太美好了!

zk-SNARKs能应用到很多场景,比如隐私保护、区块链扩容、可验证计算等。本文不介绍zk-SNARKS和零知识证明的理论细节,不熟悉或想深入了解的同学可阅读其他文章或论文。

如Vitalik写的关于zk-SNARKs著名的三篇博文。

https://medium.com/

第一步,我们需要将函数?C(x,out)?在libsnark中进行表达。此处先省略,后面介绍详细过程。

第二步,对应下面的Generator函数(

G),lambda?为随机产生,也就是常说的trustedsetup过程中产生的"toxicwaste"。人们喜欢称它为“有废物”,是因为它必须被妥善处理,否则会影响证明协议安全。

lambda<-random()

(pk,vk)=G(C,lambda)

最终生成provingkey(pk)和verificationkey(vk)。

第三步,对应使用Prove函数(

P)生成证明。这里想证明的是prover知道一个秘密值?x?和计算结果?out?可使等式满足。因此将?x、out?还有?pk?作为输入一起传给?

P,最终生成证明?proof。

proof=P(pk,out,x)

第四步,对应使用Verify函数(

V)验证证明,将?proof、out?还有?vk?传给?

G,即可在不暴露秘密的情况下证明存在一个秘密值可使等式满足。

Next.ID公布2023年路线图,将优化DID验证、个性化声誉和自托管技术等:金色财经报道,Mask Network生态去中心化身份聚合协议Next.ID公布2023年路线图,将重点推进三项服务:证明服务(包括更顺畅的DID验证和管理)、关系服务(开放身份图以建立个性化声誉)、核心服务(用于扩展DID用例的自托管技术栈,允许用户自行托管DID和数据网络)。[2023/2/13 12:03:48]

V(vk,out,proof)?=true

开发者主要工作量就集中在第一步,需要按照libsnark的接口规则手写C++电路代码来描述命题,由代码构造R1CS约束。整个过程也即对应下图的Computation->ArithmeticCircuit->R1CS。

3、搭建zk-SNARKs应用开发环境

下面进入动手环节,快速上手libsnark,跑通例子。

先下载本文对应的libsnark最小可用例子代码库?libsnark_abc。

gitclonehttps://github.com/sec-bit/libsnark_abc.git

通过gitsubmodule拉取libsnark代码。

cdlibsnark_abc

gitsubmoduleupdate--init--recursive

参考libsnark?项目文档完成相关依赖安装。以Ubuntu16.04LTS为例,需安装以下组件:

sudoapt-getinstallbuild-essentialcmakegitlibgmp3-devlibprocps4-devpython-markdownlibboost-all-devlibssl-dev

初始化?build?文件夹。

mkdirbuild&&cdbuild&&cmake..

这步在macOS系统可能会遇到问题,参考这个issue?处理。或尝试使用以下命令:

mkdirbuild&&cdbuild&&CPPFLAGS=-I/usr/local/opt/openssl/includeLDFLAGS=-L/usr/local/opt/openssl/libPKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfigcmake-DWITH_PROCPS=OFF-DWITH_SUPERCOP=OFF..

成功后,依旧在?build?目录进行编译。

腾讯电子签小程序上线“小借条”功能,用户可通过区块链技术开出具备法律效力的借条:7月28日,腾讯电子签上线“小借条”功能。用户通过腾讯电子签微信小程序,即可开出具备法律效力的借条,旨在为个人间借款活动提供具有法律效益的电子合同服务。[2021/7/28 1:21:06]

make

编译成功后,在?build/src?目录中可看到3个二进制文件。

main

range

test

到这儿,你就以及完成示例项目的编译啦。尝试运行示例代码吧。

./src/main

最终出现如下日志,则说明一切正常。你已顺利拥有了zkSNARK应用开发环境,并成功跑了第一个zk-SNARKs的demo。

4、理解示例代码

下面我们一起来仔细瞅瞅代码。示例项目包含了3份代码。

不妨先看看?src/main.cpp。这个例子来自HowardWu的?libsnark_tutorial,他也是libsnark作者之一哦。本文?libsnark_abc?的项目结构就是依照他的?libsnark_tutorial?搭建,属于“官方推荐风格”,请放心食用。

只有区区几十行代码,其中?run_r1cs_gg_ppzksnark()?是主要部分。很容易发现,真正起作用的实质代码只有下面5行。

r1cs_gg_ppzksnark_keypair<ppT>keypair=r1cs_gg_ppzksnark_generator<ppT>(example.constraint_system);

r1cs_gg_ppzksnark_processed_verification_key<ppT>pvk=r1cs_gg_ppzksnark_verifier_process_vk<ppT>(keypair.vk);

r1cs_gg_ppzksnark_proof<ppT>proof=r1cs_gg_ppzksnark_prover<ppT>(keypair.pk,example.primary_input,example.auxiliary_input);

constboolans=r1cs_gg_ppzksnark_verifier_strong_IC<ppT>(keypair.vk,example.primary_input,proof);

constboolans2=r1cs_gg_ppzksnark_online_verifier_strong_IC<ppT>(pvk,example.primary_input,proof);

仅从“超长”的函数名就能看出来每步是在做什么,但是却看不到如何构造电路的细节。实际上这里仅仅是调用了自带的?r1cs_example,隐去了实现细节。

洛阳市:将推进区块链等技术与实体经济融合:《洛阳市推进制造业高质量发展行动方案》提出,将实施融合攻坚行动,大力发展数字经济,推进区块链、互联网、大数据、5G技术与实体经济融合,促进先进制造业与现代服务业深度融合,加大金融对实体经济支持力度,进一步为洛阳制造业高质量发展奠定基础、提供支撑。(河南人民政府)[2020/4/20]

既然如此,那让我们通过一个更直观的例子来学习电路细节。研究?src/test.cpp,这个例子改编自ChristianLundkvist的?libsnark-tutorial(https://github.com/christianlundkvist/libsnark-tutorial)。

代码开头仅引用了三个头文件,分别是:

#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>

#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>

#include<libsnark/gadgetlib1/pb_variable.hpp>

前面提到?r1cs_gg_ppzksnark?对应的是Groth16方案。这里加了?gg?是为了区别?r1cs_ppzksnark,表示GenericGroupModel。Groth16安全性证明依赖GenericGroupModel,以更强的安全假设换得了更好的性能和更短的证明。

第一个头文件是为了引入?default_r1cs_gg_ppzksnark_pp?类型,第二个则为了引入证明相关的各个接口。pb_variable?则是用来定义电路相关的变量。

下面需要进行一些初始化,定义使用的有限域,并初始化曲线参数。这是相当于每次的准备工作。

typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;

default_r1cs_gg_ppzksnark_pp::init_public_params();

接下来就需要明确「待证命题」是什么。这里不妨沿用之前的例子,证明秘密?x?满足等式?x^3+x+5==out。这实际也是Vitalik博文?"QuadraticArithmeticPrograms:fromZerotoHero"(https://medium.com/

template<typenameppT>

voidtest_r1cs_gg_ppzksnark(size_tnum_constraints,size_tinput_size)

{

??r1cs_example<libff::Fr<ppT>>example=generate_r1cs_example_with_binary_input<libff::Fr<ppT>>(num_constraints,input_size);

润和软件:综合区块链等新兴技术,为金融机构及中小企业搭建基础设施与平台:润和软件(300339)在深交所-互动易上回答投资者提问时表示,公司主要以区块链技术和平台为依托,形成基于金融同业与银企信贷的金融链以及基于供应链与贸易融资的产业链。综合区块链、人工智能、大数据、匹配引擎等新兴技术,打通资产端与资金端,实现双链的无缝对接,为金融机构、实体中小企业搭建一个基础设施与平台。[2020/4/14]

??constboolbit=run_r1cs_gg_ppzksnark<ppT>(example);

??assert(bit);

}

intmain(){

??default_r1cs_gg_ppzksnark_pp::init_public_params();

??test_r1cs_gg_ppzksnark<default_r1cs_gg_ppzksnark_pp>(1000,100);

??return0;

}

test.cpp

第二个例子?test.cpp。这个例子具体展示了如何利用libsnark构建一个最简单的电路。

#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>

#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>

#include<libsnark/gadgetlib1/pb_variable.hpp>

usingnamespacelibsnark;

usingnamespacestd;

intmain(){

??typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;

??//Initializethecurveparameters

??default_r1cs_gg_ppzksnark_pp::init_public_params();

??//Createprotoboard

??protoboard<FieldT>pb;

??//Definevariables

??pb_variable<FieldT>x;

??pb_variable<FieldT>sym_1;

??pb_variable<FieldT>y;

??pb_variable<FieldT>sym_2;

动态 | 湾区互联网航运创新联盟广州成立,加快区块链等技术在港口航运产业应用:金色财经报道,2019大湾区“互联网+航运”黄埔大会28日在广州举行,湾区互联网航运创新联盟在会上成立。联盟将促进相关主体之间的交流和合作,推进粤港澳大湾区互联网航运经济产业健康发展,加快大数据、云计算、区块链等技术在港口航运产业应用,推进国际贸易“单一窗口”建设和公共信息资源开放,建设国际一流智慧港口和“数字口岸”。[2019/11/30]

??pb_variable<FieldT>out;

??//Allocatevariablestoprotoboard

??//Thestrings(like"x")areonlyfordebuggingpurposes??

??out.allocate(pb,"out");

??x.allocate(pb,"x");

??sym_1.allocate(pb,"sym_1");

??y.allocate(pb,"y");

??sym_2.allocate(pb,"sym_2");

??//Thissetsuptheprotoboardvariables

??//sothatthefirstone(out)representsthepublic

??//inputandtherestisprivateinput

??pb.set_input_sizes(1);

??//AddR1CSconstraintstoprotoboard

??//x*x=sym_1

??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(x,x,sym_1));

??//sym_1*x=y

??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(sym_1,x,y));

??//y+x=sym_2

??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(y+x,1,sym_2));

??//sym_2+5=~out

??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(sym_2+5,1,out));

??

??constr1cs_constraint_system<FieldT>constraint_system=pb.get_constraint_system();

??//generatekeypair

??constr1cs_gg_ppzksnark_keypair<default_r1cs_gg_ppzksnark_pp>keypair=r1cs_gg_ppzksnark_generator<default_r1cs_gg_ppzksnark_pp>(constraint_system);

??//Addpublicinputandwitnessvalues

??pb.val(out)=35;

??pb.val(x)=3;

??pb.val(sym_1)=9;

??pb.val(y)=27;

??pb.val(sym_2)=30;

??//generateproof

??constr1cs_gg_ppzksnark_proof<default_r1cs_gg_ppzksnark_pp>proof=r1cs_gg_ppzksnark_prover<default_r1cs_gg_ppzksnark_pp>(keypair.pk,pb.primary_input(),pb.auxiliary_input());

??//verify

??boolverified=r1cs_gg_ppzksnark_verifier_strong_IC<default_r1cs_gg_ppzksnark_pp>(keypair.vk,pb.primary_input(),proof);

??cout<<"NumberofR1CSconstraints:"<<constraint_system.num_constraints()<<endl;

??cout<<"Primary(public)input:"<<pb.primary_input()<<endl;

??cout<<"Auxiliary(private)input:"<<pb.auxiliary_input()<<endl;

??cout<<"Verificationstatus:"<<verified<<endl;

}

range.cpp

第三个例子?range.cpp。该例子利用了libsnark自带的?comparison_gadget?来实现取值范围证明。

#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>

#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>

#include<libsnark/gadgetlib1/pb_variable.hpp>

#include<libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>

usingnamespacelibsnark;

usingnamespacestd;

intmain(){

??typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;

??//Initializethecurveparameters

??default_r1cs_gg_ppzksnark_pp::init_public_params();

??//Createprotoboard

??protoboard<FieldT>pb;

??pb_variable<FieldT>x,max;

??pb_variable<FieldT>less,less_or_eq;

??x.allocate(pb,"x");

??max.allocate(pb,"max");

??

??pb.val(max)=60;

??comparison_gadget<FieldT>cmp(pb,10,x,max,less,less_or_eq,"cmp");

??cmp.generate_r1cs_constraints();

??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(less,1,FieldT::one()));

??constr1cs_constraint_system<FieldT>constraint_system=pb.get_constraint_system();

??//generatekeypair

??constr1cs_gg_ppzksnark_keypair<default_r1cs_gg_ppzksnark_pp>keypair=r1cs_gg_ppzksnark_generator<default_r1cs_gg_ppzksnark_pp>(constraint_system);

??//Addwitnessvalues

??pb.val(x)=18;//secret

??cmp.generate_r1cs_witness();

??//generateproof

??constr1cs_gg_ppzksnark_proof<default_r1cs_gg_ppzksnark_pp>proof=r1cs_gg_ppzksnark_prover<default_r1cs_gg_ppzksnark_pp>(keypair.pk,pb.primary_input(),pb.auxiliary_input());

??//verify

??boolverified=r1cs_gg_ppzksnark_verifier_strong_IC<default_r1cs_gg_ppzksnark_pp>(keypair.vk,pb.primary_input(),proof);

??cout<<"NumberofR1CSconstraints:"<<constraint_system.num_constraints()<<endl;

??cout<<"Primary(public)input:"<<pb.primary_input()<<endl;

??cout<<"Auxiliary(private)input:"<<pb.auxiliary_input()<<endl;

??cout<<"Verificationstatus:"<<verified<<endl;

}

标签:ONSRIFINCLARKSMoonshield FinanceRIFI价格TokenClubSPARKS

比特币行情热门资讯
TET:研究显示:DeFi领域去年实现了超250%的回报率_DeFiHorse

在刚刚过去的2019年中,尽管对大多数加密资产来说总体上看跌,但去中心化金融却在不断壮大。最近的研究发现,在过去的一年中,对DeFi的一小笔投资可能比比特币产生更多的收益.

EFI:巴比特专栏 | 可授信的闪电网络:或解决比特币转账贵与慢的问题_DAO

作者:舒国柱。本文节选自《第三种货币形态》。编者注:原标题为《可授信的闪电网络》闪电网络中需要冻结比特币,导致两个问题:支付成本高,技术改进慢.

数字货币:IMF首席经济学家:国家数字货币很迷人,但短期内不可能替代美元_数字货币交易所开发安全技术与成本费用

国际货币基金组织首席经济学家吉塔·戈皮纳斯表示,过去几年来,数字货币的地位日益突出,尽管这种选择不会使美元从其地位上退缩.

ARK:4张图看懂Dapp在2019年的表现及其未来趋势_STR

随着区块链技术的发展,去中心化应用程序成为了新的潮流,而以太坊作为首屈一指的平台,为此类应用程序的扩展提供了基础.

KKT:世界那么乱,Bitcoin 不焦虑,20年代是它的黄金年代_数字货币怎么开户

很多朋友看过我在Twitter上的科普,无国界奶比特币是我核心使命之一。除此之外,我的全职就是做与加密数字货币相关的投资,在国外是个正儿八经的投资工作,和一般风险投资一样工作就是寻找尚处于早期的.

区块链:新京报评论:挤压虚拟货币交易所泡沫,监管要从快从重_区块链是局吗

作者:楚天 来源:新京报 编者注:原标题为《挤压虚拟货币交易所泡沫,监管要从快从重》虚拟货币交易所的建设成本极低,只要有一部分用户受其蛊惑而入局,割韭菜游戏就可以进行,从中获取暴利.