零知识证明 - zkSNARK入门

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

网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识。

比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子:

阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。

这个整个过程就是零知识证明,证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。

技术人除了通俗的理解零知识证明外,还需要对零知识的理论和推导过程深入理解运用。以太坊的一篇blog,比较适合想深入理解零知识证明的小伙伴。

https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

这篇文章也是这篇blog的翻译和我自己的理解。通过这篇文章,能快速建立零知识证明的逻辑框架。虽然这篇文章有些推导公式,但是相对简单,小伙伴可以耐心阅读。

先给出零知识证明的逻辑框架:

在这里插入图片描述

0 - 零知识证明的基本概念

零知识证明,zkSNARKzero-knowledge Succint Non-interactive ARguments of Knowledge的简称:

  • Succinct:证明的数据量比较小
  • Non-interactive:没有或者只有很少交互。
  • ARguments:验证者只对计算能力有限的证明者有效。拥有足够计算能力的证明者可以伪造证明。这也叫“计算可靠性"(相对的还有”完美可靠性")。
  • of Knowledge:对于证明者来说在不知道证据(Witness,比如一个哈希函数的输入或者一个确定 Merkle-tree 节点的路径)的情况下,构造出一组参数和证明是不可能的。

零知识证明大体由四部分组成:

  • 多项式问题的转化 - 需要证明的问题转化为多项式问题 t(x)h(x) = w(x)v(x),证明者提交证明让验证者确认多项式成立。
  • 随机挑选验证 - 随机选择验证的数值s,验证t(s)h(s) = w(s)v(s)。相对于验证多项式相等t(x)h(x) = w(x)v(x),随机挑选验证,简单,验证数据少。随机挑选验证,安全性肯定不及多项式等式验证,但如果确实足够随机,安全性还是相当高的。
  • 同态隐藏 - 同态隐藏指的是函数的一种特性。输入的计算和输出的计算保持“同态”。以加法同态为例,满足如下的三个条件的函数E(x),称为加法同态:1. 给定 E(x),很难推导出x. 2. 不同的输入,对应不同输出 3. E(x+y) 可以由 E(x),E(y)计算出来。乘法同态类似。
  • 零知识 - 证明者和验证者之间除了“问题证明与否”知识外,不知道其他任何知识(不知道随机挑选值,不知道挑选值的多项式计算结果等等)。

在了解零知识的基础概念上,慢慢推导整个零知识证明过程,先从NP问题说起。

1- NP问题以及约化

解决一个问题需要花费时间。如果解决问题需要的时间与问题的规模之间是多项式关系,则可以称该问题具有多项式复杂度。一般问题可分成两类:P问题NP问题。P问题指的是在多项式时间内可解的问题。 NP问题(Non-Deterministic Polynomial Problem,非确定性多项式问题),指不能在多项式内可解,但是可以在多项式时间内验证的问题。

很显然,P问题也是NP问题,但是是否NP问题是P问题,NP=P?,目前为止还没有人能证明。一般认为,NP问题不等于P问题,也就是说,NP问题不存在多项式解法。

约化(Reduction),可以理解成问题的转化。对任意一个程序A的输入,都能按某种法则变换成程序B的输入,使两程序的输出相同,那么,可以说,问题A可约化为问题B。

NPC问题,是一个NP问题,并且,其他所有的NP问题都能归约到它。简单的说,NP问题之间可以相互归约,一个NP问题求解,其他NP问题一样能求解。

举例说明,NP问题以及NP问题的归约。

布尔公式满足性问题(SAT问题,boolean formula satisfiability) 就是一个NP问题。布尔公式定义如下:

  • 假设变量x1x_1x1, x2x_2x2, x3x_3x3, … 是布尔公式

  • 假设f是布尔公式,¬f\lnot f¬f也是布尔公式(取反)

  • 假设f和g是布尔公式,f∧gf \land gfgf∨gf \lor gfg也是布尔公式(与和或)

一个布尔公式可满足,指输入是0/1的情况下,存在输出为真。SAT问题指,找出所有可满足的布尔公式。SAT问题看上去,除了枚举一个个可能的布尔公式外,没有更好的办法,也就是多项式时间内不可解。如果知道一个可满足的布尔公式,验证非常方便(输入是0/1的情况下,看看输出是否为真)。SAT问题是NP问题。

再看看另外一个NP问题:PolyZero问题。PolyZero问题指某个多项式满足:多项式输入是0或1的情况下,多项式输出为0。

PolyZero(f):=1PolyZero(f) := 1PolyZero(f):=1

f满足输入是0/1的情况下,多项式输出为0。

一个布尔表达式f可以通过如下的归约函数r,转化为多项式:

  • r(xi):=(1−xi)r(x_i) := (1-x_i)r(xi):=(1xi)
  • r(¬f):=(1−r(f))r(\lnot f) := (1-r(f))r(¬f):=(1r(f))
  • r(f∧g):=(1−(1−r(f))(1−r(g)))r(f \land g) := (1- (1 - r(f))(1 - r(g)))r(fg):=(1(1r(f))(1r(g)))
  • r(f∨g):=r(f)r(g)r(f \lor g) := r(f)r(g)r(fg):=r(f)r(g)

也就是说,一个SAT问题,通过归约函数r,可以归约为一个PolyZero问题:f是可满足的,当且仅当r(f)输出为0。

SAT(f)=PolyZero(r(f))SAT(f) = PolyZero(r(f))SAT(f)=PolyZero(r(f))

总结一下,NP问题是在多项式时间内无解,但是可以多项式时间验证的问题。NP问题可以相互归约。

2 - QSP问题

需要证明的问题,肯定是NP问题,如果是P问题,不存在问题解的”寻找“,也就不存在证明。简单的说,zkSNARK问题处理的都是NP问题。既然NP问题相互可以归约,首先需要确定一个NP问题,其他NP问题都可以归约到这个NP问题,再进行证明。也就是,证明了一个NP问题,就可以证明所有NP问题。

QSP问题是个NP问题,也特别适合zkSNARK。为啥特别适合,目前还不需要深究。有相关的论文论证:https://eprint.iacr.org/2012/215.pdf。

QSP问题是这样一个NP问题:给定一系列的多项式,以及给定一个目标多项式,找出多项式的组合能整除目标多项式。输入为nnn位的QSP问题定义如下:

  • 给定多个多项式:v0,...,vm,w0,...,wmv_0, ... , v_m, w_0, ... , w_mv0,...,vm,w0,...,wm
  • 目标多项式:ttt
  • 映射函数:f:{ (i,j)∣1≤i≤n,j∈0,1}→{ 1,...m}f: \left\{(i, j) |1\leq i \leq n, j\in{0,1} \right\} \to \left\{1, ... m\right\}f:{ (i,j)1in,j0,1}{ 1,...m}

给定一个证据(Witness)u,满足如下条件,即可验证u是QSP问题的解:

  • ak,bk=1  如果k=f(i,u[i])a_k, b_k = 1\ \ 如果 k = f(i, u[i])ak,bk=1  k=f(i,u[i])

  • ak,bk=0  如果k=f(i,1−u[i])a_k, b_k = 0\ \ 如果 k = f(i, 1- u[i])ak,bk=0  k=f(i,1u[i])

  • vawb能整除 t,其中va=v0+a1v1+...+amvm,wb=w0+b1w1+...+bmwmv_aw_b能整除\ t,其中v_a = v_0 + a_1v_1 + ... + a_mv_m, w_b = w_0 + b_1w_1+ ... + b_mw_mvawb tva=v0+a1v1+...+amvm,wb=w0+b1w1+...+bmwm

对一个证据u,对每一位进行两次映射计算(u[i]u[i]u[i]以及1−u[i]1-u[i]1u[i]),确定多项式之间的系数。因为针对证据u的每一位,计算两次,确定多项式之间的系数,如果2n<m2n < m2n<m,多项式的选择还是有很大的灵活性。

如果证明者知道QSP问题的解,需要提供证据(也就是u)。验证者在获知证据u的情况下,按照上述的规则恢复出多项式的系数,验证vavbv_av_bvavb是否能整除tttth=vawbth=v_aw_bth=vawb。为了方便验证者验证,证明者可以同时提供hhh。在多项式维度比较大的情况下,多项式的乘法还是比较复杂的。

有个简单的想法,与其验证者验证整个多项式是否相等,不如随机挑选数值进行验证。假设验证者随机挑选验证数值s,验证者只需要验证t(s)h(s)=va(s)wb(s)t(s)h(s)=v_a(s)w_b(s)t(s)h(s)=va(s)wb(s)

以上是基础知识,下面开始介绍zkSNARK的证明过程。在继续深入一个QSP问题证明细节之前,先看看一个多项式问题的证明过程。

3 - 多项式问题的证明过程

假设一个多项式f(x)=a0+a1x+a2x2+...+ad−1xd−1+adxdf(x)=a_0+a_1x+a_2x^2+ ... + a_{d-1}x^{d-1}+a_dx^df(x)=a0+a1x+a2x2+

ZoKrates+Remix在线实现zkSNARK零知识证明 引言:在之前的里,我介绍了利用circom和snarkjs实现zkSNARK零知识证明,包含了snarkjs的使用步骤,并且我的毕业论文也全部采用snarkjs实现zkSNARK算法。不过snarkjs里的signal信号的概念和高级语言变量之间的差别有点大,很多运算操作都不能直接进行,而且在执行circom库里的SHA256哈希算法也显示电脑不支持这种复杂的杂凑算法,只能采用snark友好的MiMC哈希算法。于是我开始探索其他zkSNARK工具。 阅读详情

相关推荐

零知识证明zkSNARK

最近接触学习零知识证明,很是头疼,没有一些背景知识,只能硬看了,而且也没有别的好方法。 为什么要学习零知识证明 因为区块链的去中心化,导致信息都是公开透明的,比特币、以太坊、EOS等目前绝大部分项目区块链上的交易都是公开的:发送者的地址、金额、接收者的地址等,虽然这个还是匿名的,但是除了匿名之外,其他的信息都是可以被跟踪的,无法达到隐私的目的,如果有人知道了你的地址,那么你的交易记录和资产就完...

csds319的博客 906

Python零知识证明三色图

Python零知识证明三色图

零知识证明入门必看

MasterMind https://github.com/weijiekoh/zkmm Zero-knowledge proofs, a board game, and leaky abstractions: how I learned zk-SNARKs from scratch https://medium.com/@weijiek/how-i-learned-zk-snarks-from-scratch-177a01c5514e @郭宇:零知识证明技术将会区块链的 must-have。不过这个黑科技

西京刀客 1706

基于零知识证明的身份认证机制

本文提出了一种全新的基于零知识证明的身份认证机制

零知识证明zkSNARK

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33768481的博客 759

零知识证明 一文看懂 zkSNARK

一、零知识证明(Zero—Knowledge Proof) 1. 又叫最小暴露证明。 2. 零知识证明的定义为:证明者(prover)能够在不向验证者(verifier)提供任何有用的信息的情况下,使验证者(verifier)相信某个论断是正确的。 二、应用场景举例理解: 1. 非对称加密做身份认证 场景:小A想验证小B是否具有某个私钥sk,但是小B不想让小A看到私钥 小A使用该私钥对应的公钥pk加密一段只有小A自己知道的数据d,得到密文sd; 小A将密文sd发送给小B; 小B使用私钥.

软件工程小施同学 的专栏 3759

区块链零知识证明zk-SNARK从小白到明白)

零知识证明:从小白到明白 如今,知识快餐业发达,区块链这么火的领域自然不会落下。经过一轮轮扫盲,共识、工作量证明、闪电网络等等概念对普罗大众已不再陌生,甚至各种解构、比喻、引申,将术语炒得比本义还玄乎。然而,如果不理解甚至没听说过零知识证明,那你基本还属于区块链小白。 之所以这么说,原因有二。其一, 零知识证明是代数数论、抽象代数等数学理论的综合应用,与闪电网络一类的精巧设计不同,属于硬技术。...

跨链技术践行者 2万+

密码学系列 - 零知识证明(ZKP) - Schnorr协议

椭圆曲线参数: 一个素数ppp,定义有限域FpFp​。生成元: 一个生成元GGG。公钥PxGP = xGPxG,其中xxx是私钥。Schnorr 零知识证明协议是一种简单且高效的协议,能够在不泄露秘密信息的情况下,证明某人拥有该信息。它的主要应用包括密码学、区块链和身份验证等领域。通过以上步骤和示例代码,展示了如何实现并验证 Schnorr ZKP 协议。Fiat-Shamir变换消除了交互需求,生成一个可公开验证的证明。

搬砖魁首的博客 1509

Pylint代码重复检测终极指南:使用symilar工具快速发现和消除重复代码

在软件开发过程中,重复代码是影响项目质量和可维护性的常见问题。Pylint作为Python生态中最受欢迎的代码分析工具之一,不仅能检测代码风格问题,还通过内置的symilar工具提供了强大的代码重复检测能力。本文将详细介绍如何使用symilar工具快速识别、分析和消除Python项目中的重复代码,帮助开发者提升代码质量和开发效率。 ## 为什么需要检测重复代码? 重复代码会导致多个问题:增加维

gitblog_00603的博客 458

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

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

gitblog_00032的博客 577

入门到精通零知识证明zkSNARK

最近以太坊启动了“大都会”硬分叉,很重要的一个功能就是整合了ZCash的零知识证明技术zkSNARK。我们一起来看一下zkSNARK这个拗口的技术到底是什么鬼。 零知识证明 要了解zkSNARK,必须先理解什么是零知识证明。 关于零知识证明,概念并不难理解,我们以一个老掉牙的故事作为例子。 阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想...

跨链技术践行者 1万+

零知识证明系列之三——入门zkSNARK

前文回顾 回顾一下一套完善的零知识证明体系需要以下的条件: (1)完备性(Completeness)如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。 (2)合理性(Soundness) 没有人能够假冒证明方,使这个证明成功。 (3)零知识性(Zero-knowledge)证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。 接下来就是我们的重头戏zksanrk了。

weixin_55760491的博客 4578

如何快速上手libsnark:10分钟搭建第一个零知识证明应用 [特殊字符]

**libsnark**是一个强大的C++零知识证明库,专为构建**zkSNARKs**(零知识简洁非交互式知识证明)应用而设计。无论你是区块链开发者、密码学研究者,还是对隐私保护技术感兴趣的程序员,这个终极指南将帮助你快速掌握libsnark的核心概念,并在10分钟内搭建你的第一个零知识证明应用!🔐 ## 📦 什么是libsnark? **libsnark**是一个C++库,实现了多种*

gitblog_00031的博客 895

比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs

本文分为两部分,第一部分说明零知识能干什么,为什么它这么强大,在区块链中这么火;第二部分比较零知识证明的算法zkSNARK, zkSTARKs, zkBoo, Sonic和BulletProofs的特性。 本文首发在本人知乎专栏中,更多区块链论文阅读,请关注本人知乎哦 第一部分 使用零知识算法能干什么? 设定一个场景,现有一个公共的函数f和一个函数的输出值y,Alice对Bob说她知道x值,但是Bob不信。x可能是Alice花费了很多资源才得来的,为了向Bob证明她知道x同时又不泄露x给Bo

ChainingBlocks 5469

革命性zkSNARK技术平台libsnark:零知识证明的终极指南

libsnark是一个强大的C++库,专为实现零知识证明zkSNARKs)而设计,它为开发者提供了构建隐私保护应用的核心工具。作为零知识证明领域的关键基础设施,libsnark支持多种高效的zkSNARK协议实现,包括R1CS-gg-ppzksnark、R1CS-ppzksnark等主流方案,广泛应用于区块链、隐私计算和安全验证等领域。 ## 什么是zkSNARK?为什么它如此重要? 零知识

gitblog_00199的博客 1075

我的隐私计算学习——零知识证明

安全保护技术(五)

weixin_47695607的博客 2954

零知识证明 - zkSNARK的Nullifier攻击

早上很多朋友@我,安比实验室公众号发表了一篇文章zkSNARK的“输入假名”的攻击。迅速看了看,很赞。这个攻击原理其实比较简单,但是,不深入理解zkSNARK以及使用场景的朋友确实很难发现和理解。本文讲讲我对这个攻击的分析和理解。 源于三天前 这种攻击方式一直潜伏着,没被发现。直到三天前: 俄罗斯开发者poma,在项目semaphore提交了一个issue,公开了这个攻击方法。poma同时也在kovan测试网络验证了这种攻击方式。 先从semaphore项目的代码开始: 话说,semaphore是个很有

StarLi2020的博客 861

zksnark--零知识证明

零知识证明要了解zkSNARK,必须先理解什么是零知识证明。关于零知识证明,概念并不难理解,我们以一个老掉牙的故事作为例子。阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。这个整个过程...

code_segment的博客 3596
上一篇: 零知识证明 - 椭圆曲线基础
下一篇: 零知识证明 - 基于多项式构造零知识证明
StarLi_2020
博客等级 码龄7年 130粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值