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

本文的内容来自于V神的博客文章,再加上一些自己的理解。验证代码在https://github.com/ethereum/research/blob/master/zksnark/

零知识的证明逻辑需要花很多篇幅仔细介绍,涉及到QAP,KCA,Groth16,同态隐藏,双线性映射等。这篇文章主要介绍quadratic arithmetic program(QAP)。

ZK-snark不能直接拿来应用,我们必须把原始数据转换成适合ZK-snark处理的方式。以如下的3次方等式为例:

x**3 + x + 5 == 35 (答案是 3)

编程Python程序如下:

def qeval(x):

y = x**3

return x + y + 5

扁平化展开

上面的2元3次方程可以展开为:【1】

sym_1 = x * x

y = sym_1 * x

sym_2 = y + x

~out = sym_2 + 5

R1CS转换

rank-1 constraint system (R1CS) 是一个(a.b.c)的3个向量,R1CS的解答是一个向量S,满足s . a * s . b - s . c = 0, 此处 . 代表相应位置的乘法,然后再将乘法的结果相加,随后,对b 和s ,以及 c 和 s做同样的操作。

S.a=(1×5 +3×0 +35×0 + 9×0 + 27 ×0 + 30 ×1) =35

S.b=(1×1 + 3×0 +35×0+9×0+27×0+30×0)=1

S.c=(1×0 +3×0 + 35×1 + 9×0+27×0+30×0)=35

显然上面的S向量(1,3,35,9,27,30)就是上述二元3次方程的一个解

为了规范化,我们加了一个哑元'~one',以及中间变量'sym_1',  'sym_2',向量变成下面这样:

'~one', 'x', '~out', 'sym_1', 'y', 'sym_2'

第一个门:

a = [0, 1, 0, 0, 0, 0]

b = [0, 1, 0, 0, 0, 0]

c = [0, 0, 0, 1, 0, 0]

上面的(a,b,c)矢量组表示下面的语句:s.a*s.b-s.c=0

sym_1 = x * x

同理:

a = [0, 0, 0, 1, 0, 0]

b = [0, 1, 0, 0, 0, 0]

c = [0, 0, 0, 0, 1, 0]

代表:

sym_1 * x = y

上面的语句来自【1】

sym_1 = x * x

y = sym_1 * x

sym_2 = y + x

~out = sym_2 + 5

上面语句的完整的R1CS如下:【2】

A

[0, 1, 0, 0, 0, 0]

[0, 0, 0, 1, 0, 0]

[0, 1, 0, 0, 1, 0]

[5, 0, 0, 0, 0, 1]

B

[0, 1, 0, 0, 0, 0]

[0, 1, 0, 0, 0, 0]

[1, 0, 0, 0, 0, 0]

[1, 0, 0, 0, 0, 0]

C

[0, 0, 0, 1, 0, 0]

[0, 0, 0, 0, 1, 0]

[0, 0, 0, 0, 0, 1]

[0, 0, 1, 0, 0, 0]

下面利用拉格朗日插值来把R1CS编成QAP

拉格朗日插值

学过数值分析的应该很容易理解,对于一列坐标:(x0,y0),(x1,y1)...(xi,yi),可以通过拉格朗日插值,找到一个多项式,它通过这个坐标序列里的每一个点。具体的方法是:

对于(x0,y0), 我们找到一个多项式,在x1,x2....xi处,y1,y2,..yi均为零。这样的多项式很容易找,比如,下面就是一个例子:

y= (x-x1)(x-x2)...(x-xi)

举个例子,比如有3个点:(1, 3), (2, 2) 和(3, 4)。

- 首先我们找到通过(1, 3), (2, 0)和 (3, 0)的多项式。

- 其次我们找到通过(1, 0), (2, 2)和 (3, 0)的多项式。

- 再次我们找到通过(1, 0), (2, 0)和 (3, 4)的多项式。

- 最后,我们把上面得到的多项式加起来就是通过这三个点的多项式

我们用拉格朗日插值来变换上面的【2】

程序如下

#Assumes vec[0] = p(1), vec[1] = p(2), etc, tries to find p,

#expresses result as [deg 0 coeff, deg 1 coeff...]

def lagrange_interp(vec):

o=[]

for i in range (len(vec)):

o=add_polys(o, mk_singleton(i+1, vec[i],len(vec)))

for i in range(len(vec)):

assert abs(eval_poly(o, i+1)-vec[i]<10**-10), (o, eval_poly(o, i+1), i+1)

return o

def transpose(matrix):

return list(map(list,zip(*matrix)))

#A, B, C = matrices of m vectors of length n, where for each

#0 <= i < m, we want to satisfy A[i] * B[i] - C[i] = 0

def r1cs_to_qap(A,B,C):

A, B, C=transpose(A), transpose(B), transpose(C)

new_A=[lagrange_interp(a) for a in A]

new_B=[lagrange_interp(b) for b in B]

new_C=[lagrange_interp(c) for c in C]

Z=[1]

for i in range(1,len(A[0])+1):

Z=multiply_polys(Z, [-i,1])

return(new_A, new_B, new_C, Z)

結果如下

A 多项式

[-5.0, 9.166, -5.0, 0.833]

[8.0, -11.333, 5.0, -0.666]

[0.0, 0.0, 0.0, 0.0]

[-6.0, 9.5, -4.0, 0.5]

[4.0, -7.0, 3.5, -0.5]

[-1.0, 1.833, -1.0, 0.166]

B 多项式

[3.0, -5.166, 2.5, -0.333]

[-2.0, 5.166, -2.5, 0.333]

[0.0, 0.0, 0.0, 0.0]

[0.0, 0.0, 0.0, 0.0]

[0.0, 0.0, 0.0, 0.0]

[0.0, 0.0, 0.0, 0.0]

C 多项式

[0.0, 0.0, 0.0, 0.0]

[0.0, 0.0, 0.0, 0.0]

[-1.0, 1.833, -1.0, 0.166]

[4.0, -4.333, 1.5, -0.166]

[-6.0, 9.5, -4.0, 0.5]

[4.0, -7.0, 3.5, -0.5]

附录

拉格朗日的定义和证明可以参看这里和这里

转载于:https://my.oschina.net/gavinzheng731/blog/3032170

Zero Knowledge Proof 解密 QAP相关推荐

  1. 零知识证明(Zero—Knowledge Proof)

    零知识证明概念 零知识证明(Zero-Knowledge Proof),是由S.Goldwasser.S.Micali及C.Rackoff在20世纪80年代初提出的.它指的是证明者能够在不向验证者提供 ...

  2. 零知识证明(Zero Knowledge Proof,ZKP)

    零知识证明(Zero Knowledge Proof,ZKP)并非新鲜事物,其概念初见于1985年的论文<互动证明系统的知识复杂性>.ZKP是一种密码学技术,允许两方(证明者和验证者)来证 ...

  3. 学习笔记:公钥私钥 签名验签 加密解密 CA 证书

    重点: 1.区分加密解密和签名验签(在非对称加密情景下) 加密解密:#A给B发消息# A用B的公钥进行运算(加密),B收到后用B自己的私钥进行逆向运算(解密) 签名验签:#A给B发消息# A用A自己的 ...

  4. 隐私保护和数据安全:区块链的隐私问题、零钞:基于zkSNARK的完美混币池、Hawk:保护合约数据私密性、Coco框架、Baby Zoe

    第十章 文章目录 第十章 一.区块链的隐私问题 1.化名和匿名 2.去匿名攻击:交易表分析 二.零钞:基于zkSNARK的完美混币池 1.零知识证明 2.零钞的运行原理 三.Hawk:保护合约数据私密 ...

  5. 零知识证明学习资源汇总

    本文将继续会持续进行更新,更新后的版本将在 Github 和知乎上发布,欢迎关注. Github 地址:https://github.com/sec-bit/learning-zkp/blob/mas ...

  6. 记录我看的密码学方案中的技术,Shamir秘密共享,Schnorr零知识证明,EIGamal密码体制

    记录我看的论文中基于的技术,对他们进行大概介绍 Shamir 秘密共享方案 零知识证明 EIGamal密码体制 Shamir 秘密共享方案 1979年,Shamir提出的一个基于拉格朗日插值的(k,n ...

  7. 区块链学习者终极指南

    什么是加密经济学(cryptoeconomics)?以太坊社区开发者Vlad Zamfir解释道: "这是一门独立的学科,旨在研究去中心化数字经济学中的协议,这些协议被用于管理商品及服务的生 ...

  8. 密码学的100个基本概念

    密码学的100个基本概念 一.密码学历史 二.密码学基础 三.分组密码 四.序列密码 五.哈希函数 六.公钥密码 七.数字签名 八.密码协议 九.密钥管理 十.量子密码 2022年主要完成了密码学专栏 ...

  9. 零知识证明经典文献大汇总(可收藏)

    从去年的DAO经典到更早的NFT经典(以及在此之前是最初的加密经典). 本文, 为那些寻求理解.深入和构建零知识的人挑选了一组资源:强大的基础技术,这些基础技术掌握着区块链可扩展性的关键,代表着隐私应 ...

最新文章

  1. java条件操作_关于java:条件为true时,从头开始执行各种操作的顺序
  2. SAP freelancer如何找到一个不苦逼的项目?
  3. java 数组 题_(第22讲)java数组的一些编程题
  4. Java的synchronized关键字:同步机制总结
  5. python输出格式化及函数format
  6. windows下实现c++版faster-rcnn
  7. django不修改数据库创外键_Django——model(建表,增删改查,外键,多对多)
  8. 蓝桥杯基础模块4_3:矩阵按键
  9. Linux——软件包简单学习笔记
  10. liferay search container的两种实现方式
  11. java游戏贪吃蛇_Java实现贪吃蛇游戏
  12. assets和res/raw的用法
  13. centso7.5 安装minconda3和创建项目所需python3环境
  14. 学生选课系统,第二版
  15. 浙大计算机学院 数字媒体处理与企业智能计算实验室在哪个校区,浙大计算机学院各大实验室介绍.pdf...
  16. 计算机维护工作周报,运维周报怎么写呀,这一周没什么事做
  17. TS流基本知识【HI3798 AVPLAY播放TS流】
  18. Log Parser Lizard的安装
  19. 根据特征图画热图_heatmap
  20. dell服务器设置bios设置u盘启动不了系统,戴尔台式机bios设置图解教程|dell bios设置u盘启动...

热门文章

  1. 根据先序序列和中序,后序和中序序列创建二叉树
  2. 拼多多618手机品牌官旗销量同比增长124%,4000+高价位手机同比增长156%
  3. Nodejs+vue网上鲜花店销售信息系统express+mysql
  4. 2021 考研英语题难度如何?英语一英语二有哪些亮点和槽点?
  5. 室内场馆360全景拍摄的注意事项
  6. 淘宝权重及其大数据分析
  7. Qt读取/写入Excel数据--QAxObject
  8. 飞鱼CRM是什么?巨量引擎线索如何自动同步至CRM系统
  9. 【C语言详解】——文件操作(建议收藏)
  10. python reset_index()_python 问题 reset_index(drop=True