零知识证明 Learn by Coding:libsnark 入门篇

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文作者:p0n1@安比实验室

libsnark 是目前实现 zk-SNARKs 电路最重要的框架,在众多私密交易或隐私计算相关项目间广泛应用,其中最著名当然要数 Zcash。Zcash 在 Sapling 版本升级前一直使用 libsnark 来实现电路(之后才替换为 bellman)。毫不夸张地说,libsnark 支撑并促进了 zk-SNARKs 技术的首次大规模应用,填补了零知识证明技术从最新理论到工程实现间的空缺。

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

1. zk-SNARKs 和 libsnark 背景简介

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

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

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

  • https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649
  • https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627
  • https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6

或者阅读向程@HUST写的「深入浅出零知识证明之zk-SNARKs」,还有东泽写的「浅谈零知识证明之二:简短无交互证明(SNARK)」。

当然也欢迎关注安比实验室「探索零知识证明」系列和「从零开始学习 zk-SNARK」系列,以及从安比实验室维护的「零知识证明学习资源汇总」中查找更多资料。

本文主角 libsnark 是用于开发 zk-SNARKs 应用的 C++ 代码库,由 SCIPR Lab 开发并维护。libsnark 工程实现背后的理论基础是近年来(尤其是 2013 年以来)零知识证明特别是 zk-SNARKs 方向的一系列重要论文。如以下最著名的数篇:

  • [GGPR13] Quadratic span programs and succinct NIZKs without PCPs , Rosario Gennaro, Craig Gentry, Bryan Parno, Mariana Raykova, EUROCRYPT 2013
  • [PGHR13] Pinocchio: Nearly Practical Verifiable Computation , Bryan Parno, Craig Gentry, Jon Howell, Mariana Raykova, IEEE Symposium on Security and Privacy (Oakland) 2013
  • [BCGTV13] SNARKs for C: Verifying Program Executions Succinctly and in Zero Knowledge , Eli Ben-Sasson, Alessandro Chiesa, Daniel Genkin, Eran Tromer, Madars Virza, CRYPTO 2013
  • [BCIOP13] Succinct non-interactive arguments via linear interactive Proofs , Nir Bitansky, Alessandro Chiesa, Yuval Ishai, Rafail Ostrovsky, Omer Paneth, Theory of Cryptography Conference 2013
  • [BCTV14a] Succinct non-interactive zero knowledge for a von Neumann architecture , Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, USENIX Security 2014
  • [BCTV14b] Scalable succinct non-interactive arguments via cycles of elliptic curves , Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, CRYPTO 2014
  • [Groth16] On the Size of Pairing-based Non-interactive Arguments , Jens Groth, EUROCRYPT 2016

libsnark 的开发者们亦是这个领域内顶尖的学者或研究牛人,如 Eran Tromer 更是以上多篇论文的共同作者。

在这里插入图片描述
扎实的理论基础和工程能力,让 libsnark 的作者们能够化繁为简,将形如下图的高深理论和复杂公式逐一实现,高度工程化地抽象出简洁的接口供广大开发者方便地调用。向这些将非凡的理论研究推广至更大规模应用的先锋们致敬。

在这里插入图片描述
下图是 libsnark 的模块总览图,摘自 libsnark 代码贡献量第一作者 Madars Virza 在 MIT 的博士论文。

在这里插入图片描述)

libsnark 框架提供了多个通用证明系统的实现,其中使用较多的是 BCTV14a 和 Groth16。

查看 libsnark/libsnark/zk_proof_systems 路径,就能发现 libsnark 对各种证明系统的具体实现,并且均按不同类别进行了分类,还附上了实现依照的具体论文。

其中:

  • zk_proof_systems/ppzksnark/r1cs_ppzksnark 对应的是 BCTV14a
  • zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark 对应的是 Groth16

如果想研究这两个协议的实现细节可直接从这两个目录入手。ppzksnark 是指 preprocessing zkSNARK。这里的 pp/preprocessing 其实就是指我们常说的 trusted setup,即在证明生成和验证之前,需要通过一个生成算法来创建相关的公共参数(proving key 和 verification key)。我们也把这个提前生成的参数称为 「公共参考串」(Common Reference String),或简称为 CRS。

2. 基本原理与步骤

利用 libsnark 库开发 zk-SNARKs 应用从原理上可简要概括为以下四个步骤:

  1. 将待证明的命题表达为 R1CS (Rank One Constraint System)
  2. 使用生成算法(G)为该命题生成公共参数
  3. 使用证明算法(P)生成 R1CS 可满足性的证明
  4. 使用验证算法(V)来验证证明

不妨用一个十分简短(简化)的例子,来对照上面四个步骤。该例子模仿自这篇文章。

有这样一个函数 C(x, out),用于判断秘密 x 是否满足等式 x^3 + x + 5 == out,若满足则返回 true。

function C(x, out) {
  return ( x^3 + x + 5 == out );
}

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

第二步,对应下面的 Generator 函数(G),lambda 为随机产生,也就是常说的 trusted setup 过程中产生的 “toxic waste”。人们喜欢称它为“有毒废物”,是因为它必须被妥善处理(如必须销毁,不能让任何人知道),否则会影响证明协议安全。

lambda <- random()

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

最终生成 proving key (pk) 和 verification key (vk)。

第三步,对应使用 Prove 函数(P)生成证明。这里想证明的是 prove

深入浅出零知识证明(二):zkSNARKs基本原理 前言 本文开始对零知识证明应用最广泛的技术——zkSNARKs进行介绍,本文主要介绍其原理与流程,其中应用到的密码学知识和工具很多,本人能力有限,尽量做到阐述清晰,如有错误欢迎讨论。 零知识证明学习起来难度就很大,是数论、密码学、抽象代数的综合应用,它引入的概念、符号会让人眼花缭乱。V神在一篇介绍零知识证明的文章中就提醒读者看不懂也不要怀疑自己的智商,因为“它实在是太难了!” 因此,能坚持搞懂的,一定是意(固)志(执)力有异常人。所以在学习过程中要保持耐心,慢慢来。 ... 阅读详情

相关推荐

Proof of Replication 翻译

Proof of Replication 复制证明技术报告July 27, 2017翻译:elninowang 抽象 我们引入了复制证明(PoRep),这是一种新的存储验证,可用于证明某些数据D已被复制到其自己独特的专用物理存储中。执行唯一的物理副本使审查者能够检查证明者是否不将D的多个副本重复数据删除到同一个存储空间中。这种结构在云计算和分散式存储网络中特别有用,它们必须是透明的,可以抵御女巫攻...

老王构架师专区 1354

libsnark-tutorial:zkSNARK教程和开发环境

libsnark教程 在这个中,我们将使用创建一个简单的zkSNARK应用程序,这是一个用于zkSNARK证明的C ++。 zkSNARKs使证明者可以简洁地说服任何验证者对给定语句的有效性,而无需透露除语句有效性以外的任何信息。 这项技术已经为诸如协议奠定了基础, 是一种为用户及其交易提供匿名的加密货币。 本教程将指导您安装libsnark ,设置开发环境以及构建简单的zkSNARK应用程序。 可以扩展该以支持测试框架,性能分析基础结构等。 目录 介绍 Shafi Goldwasser,Silvio Micali和Charles Rackoff首次引入了零知识证明零知识证明可以使一方(证明方)说服另一方(检验方)给定的陈述是真实的,而不会透露陈述本身的有效性以外的任何信息。 zkSNARK是零知识证明的一种变体,它使证明者可以简洁地说服任何验证者给定语句的有效性,并实现计算零

亚瑟王的「随机」挑战:从交互到非交互式零知识证明——探索零知识证明系列(四)

本文作者:郭宇 本文已更新至Github https://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/4/zkp-rom.md “Challenges are at times an indication of Lord's trust in you.” 挑战,有时是上天信任你的一种表现。― D. Todd Christ...

SECBIT区块链安全实验室 4424

零知识证明-libsnark学习:Protoboard

typedef libff::Fr<default_r1cs_ppzksnark_pp> FieldT; default_r1cs_ppzksnark_pp::init_public_params(); 定义有限域,初始化椭圆曲线参数

qq_32953791的博客 829

libsnark-tutorial: 零知识证明zkSNARK快速入门教程

libsnark-tutorial: 零知识证明zkSNARK快速入门教程 本指南将引导您学习如何使用howardwu/libsnark-tutorial创建一个简单的零知识 Succinct Non-Interactive Argument of Knowledge (zkSNARK) 应用程序。该基于libsnark,一个用于构建zkSNARK证明的C++。下面是关键组件的详细介绍。 1...

gitblog_00032的博客 577

Subvector Commitments with Application to Succinct Arguments学习笔记

1. 背景知识 Russell W. F. Lai 和 Giulio Malavolta 在Crypto 2019上发表的论文《Subvector Commitments with Application to Succinct Arguments》中主要关注的是subvector commitment (SVC): SVC允许open a committed vector at a set of positions,且opening size与vector的size以及要open的位置数均无关。 sub

mutourend2010@gmail.com 1397

零知识证明学习笔记:背景与起源

副标题:斯坦福学霸的零知识证明学习笔记(一) 本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程《CS 251: Cryptocurrencies and blockchain technologies》上的学习笔记,该课程授课老师是密码学大拿 Dan Boneh。 上个学期在斯坦福跟着Dan Boneh学习了区块链和数字货币相关的...

SECBIT区块链安全实验室 1319

白话零知识证明(二)

hi 欢迎来到小秘课堂第三期,今天我们来讲讲白话零知识证明(二)的那些事儿,欢迎主讲人马宇峰 讲师:马宇峰 编辑:Leo 前言 本文是建立在Vitalik的博客《Quadratic Arithmetic Programs: from Zero to Hero》基础之上...

chixiao5404的博客 1728

以太坊颠覆了以太坊:引入密码学实现2.0性能突破

致谢:郭宇 撰文:李画,安比实验室特约研究员 导言:2020年,市场似乎如旧,然而区块链技术却在悄然进行一场颠覆性的升级。 性能是阻碍公链发展的瓶颈,提升性能则是绝大多数希望超越以太坊的公链的主要设计目标,但当我们站在今天回望时,会发现这些公链选择的方法大多是通过机制的设计来增强一个分布式系统的性能,但受困于分布式系统CAP定理(不可能三角),改善性能是要付出代价的,当这个分布式系统的用途是账本时,这些代价甚至可能是难以被接受的。 以太坊也一直在尝试各种方法以提升性能,在2.0被推出的前夜,它「试」出了密码

SECBIT区块链安全实验室 780

从世界杯小组赛消极比赛,到矿工博弈及共识算法,博弈论解释了一切

博弈论被认为是20世纪经济学最伟大的成果之一,其思想被广泛的应用到经济学,政治学,计算机科学,生物学,运筹学等学科。通过分析博弈各方的收益情况而对参与者的行为进行预测,博弈论已经被应用于处理国际关系、研究军事战略、制定公司经营策略等领域。诺贝尔经济学奖获得者约翰.纳什(John F. Nash)在他的博士论文中提出的“纳什均衡”概念,完全颠覆了传统经济学家的固有观念,因此“纳什均衡”对经济学的影响...

SECBIT区块链安全实验室 876

零知识证明 SNARKs C++libsnark教程

gadgetlib2的使用以及如何整合ppzkSNARK的教程和范例。这分文档专为小零件(gadget)写的,推荐从上至下作为教程来阅读。 1. 面包板(protoboard)的使用和范例 这个测试给出构造系统限制(constraint)的第一个范例。我们将时不时交替使用 ‘系统限制’(Constraint) 和 ‘电路’(Circuit) 两个术语. 用输入和输出形象化一个电路非常容易。每...

跨链技术践行者 1万+

浅谈零知识证明

零知识证明是实现隐私保护的密码学方案。曾被称为密码学领域的一颗皇冠,用于在不泄露具体秘密情况下对问题一种正确证明方法。尤其是在金融领域实现数据隐私保护方面的创新业务场景里实现落地应用。 我们今天就从零知识证明的基本概念、研究进展、实现原理方面做一些简单阐述。 一、零知识证明概述 零知识证明(Zero-Knowledge Proof, ZKP)是现代密码学中的一类经典协议,用于在不泄露关于某个命题任何信息的情况下证明该命题的正确性。近年来,随着区块链等新兴技术的发展以及隐私计算需求的兴起,零知识证明技术再次成

jambeau的博客 2万+

零知识证明平台libsnark的搭建过程(超详细,失败了十几次最终成功)

由于论文需要使用零知识证明,经过从网上查找资料,感觉libsnark现在比较流行,所以进行搭建,但是本人比较菜,搭建 了差不多一周左右,前后搭建了十几次,ubuntu系统安装了5个,反正各种的问题,其实过程是简单的,但是就是会遇到问题,最终搭建好了,我把详细的过程说一下,有图讲解,直接复制,按照步骤来肯定可以,如果大家又什么问题,欢迎留言。 本人之间参照博客上的其它几篇文章,结果老是出错,最终还是完成了。 @TOC **首先的配置信息:** 电脑 我用的虚拟机,且win10,这个...

weixin_44565944的博客 4631

零知识证明 - zkSNARK入门

网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识。 比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子: 阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距...

StarLi2020的博客 1950

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

libsnark源代码,建议想深入零知识证明的小伙伴都读一读。Bellman主要围绕Groth16算法,libsnark给出了SNARK相关算法的全貌,各种Relation,Language,Proof System。为了更好的生成R1CS电路,libsnark抽象出protoboard和gadget,方便开发者快速搭建电路。 本文中使用的libsnark源代码的最后一个commit如下: commit 477c9dfd07b280e42369f82f89c08416319e24ae Author: Ma

StarLi2020的博客 2803

zk-snark的算法详解

前言 了解零知识证明的读者,可能都拜读过V神的文章,整个系列由浅入深,很有条理,相对其他文章更容易理解一下。其实V神讲解的算法是PGHR13算法的整体步骤,此算法也被应用于知名项目Zcash中,现在,就让我们去一起探究,在实际项目中,PGHR13算法是具体的什么步骤呢? PGHR13 在Zcash的Sapling版本升级之前,其采用的零知识证明算法的主体就是PGHR13,并因为效率和安全问题,做了...

weixin_43179764的博客 2914

零知识证明学习资源汇总

摘要:本文收集整理了关于零知识证明的一些学习资料,希望能对大家有所帮助。

SECBIT区块链安全实验室 3691

开源libsnark的安装

https://github.com/scipr-lab/libsnark/ 最好的文档永远是官方文档(提醒我自己= =,不要想那些有的没的) 构建说明 在开始使用libsnark之前,先苦哈哈的安装依赖的各种吧 cmake git 就不说了 libgmp3-dev:大整数运算 sudo apt-get install libgmp3-dev libprocps4-dev ...

m0_37257009的博客 2706

零知识证明(zero knowledge validation)

零知识证明(zero knowledge validation)证明者在不向验证者提供任何有用的信息的前提下,使验证者相信某个论断是正确的。例如,A 向 B 证明自己有一个物品,但 B 无法拿到这个物品,无法用 A 的证明去向别人证明 自己也拥有这个物品。证明举例1、A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法:①A把钥匙出示给B,B用这把...

微风的博客 3099
上一篇: 浅谈零知识证明之二:简短无交互证明(SNARK)
下一篇: 云中「秘密」:构建非交互式零知识证明---探索零知识证明系列(五)
安比实验室SECBIT
博客等级 码龄8年 169粉丝 40原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值