本文和其他博客文章的区别:

现今存在很多讲解零知识证明的文章,但是它们都是只涉及到很浅层的概念理解和直观感受上面,没有深入到零知识证明的细节,导致读者只知道什么是零知识证明,而不清楚怎么构造一个零知识证明。本教程结合具体的例子和python代码实现,让大家更加具体和详细地理解它。

本教程从零开始讲解零知识证明,总共分为三个部分,这里是第一部分。

这部分教程不会涉及很“高深”的计算机技术。

1 从一个故事开始

A向B证明一个命题,比如A有两个不同颜色的足球,经过他们俩之间的一系列信息交流之后,

  • B能够肯定A的命题正确的概率是99.9999999%。
  • B无法在这一系列交流中得到任何新的信息。

上面的故事便是一个零知识证明的过程。一句话概括便是,A向B证明一个东西,在B能够信服的条件下不向B暴露任何关于这个东西的信息。

2 从一个例子出发 - 一个分割问题

我们有一个数组 l, 如果另一个数组m满足下面三个条件,那么我们说m满足本任务。

  1. len(m) == len(l)
  2. m中所有的元素是1或者-1
  3. l和m的点积的结果为0。

如果验证者生成数组l证明者生成数组m。证明者要向验证者证明它的m能满足本任务,它可以把m给验证者来证明m满足本任务。但是这暴露了m中的内容,不符合零知识证明的要求。

于是,我们做如下变换,验证者从数组 l 和m中生成一个“见证”p,每一次只对验证者暴露p的一部分信息,从而避免暴露m。这里p充当中间桥梁的作用。下面我们根据例子来构造这个p。

假设数组l = [4, 11, 8, 1], m = [1, -1, 1, -1],根据l和m计算出另一个数组 p = [0, 4, -7, 1, 0],p的长度比m多一个。
计算方法是 pi=∑0<=k<il[k].m[k]p_i = \sum_{0<=k<i}l[k] . m[k]pi​=∑0<=k<i​l[k].m[k]。公式中的点表示点积,注意求和公式。具体计算过程为:
一开始p[0] = 0。
p[1] = l[0] . m[0] = p[0] + l[0] . m[0] = 0 + 41 = 4
p[2] = l[0].m[0] + l[1]+m[1] = p[1] + l[1].m[1] = 4 + 11
-1 = -7
p[3] = p[2] + l[2].m[2] = -7 + 81 = 1
p[4] = p[3] + l[3].m[3] = 1 + 1
(-1) = 0

如果m满足本任务,那么p具有下面两个性质:

  1. 第一个和最后一个元素是0
  2. 0 <= i < n, 有|l[i]| = |p[i + 1] - p[i]|

上面数组p便是我们的见证(witness)。

3 零知识证明过程

现在我们的零知识证明过程为:

信息掌握情况

  • 证明者:知道数组 l 和m和p
  • 验证者:只知道数组 l。

具体过程:

验证者从0 <= i <= n中随机选择一个随机整数,

  1. 如果i = n,证明者向验证者揭露p[0]和p[n]的值。
  2. 否者,证明者向验证者揭露p[i]和p[i+1]的值。
  3. 验证者检查 |l[i]| =? |p[i + 1] - p[i]|,如果等式成立,则表示该轮验证通过。(数组 l 由验证者生成的。)

这两个人可以进行很多轮这样的验证过程。

上面的例子的当前版本存在的问题有:

  • 证明者可能撒谎,比如它可能向验证者揭露的p[0]不是实际的值。
  • 如果上面的过程只进行一个轮回,并不能证明m满足本任务。
  • 严格来讲,这个例子不是“零知识”,因为验证者通过多轮该验证操作,能够通过p知道m的内容。

上面前两个问题会在后面两部分文章中讲解,下面讲解第三个问题的解决方法。

如果一个人无法从某些消息获取到新的信息,那么我们可以认为这些消息是随机的,或者更加准确来讲,这些消息在某一个数据域中均匀分布。因此,为了避免验证者通过数组p知道数组m的内容,我们使用随机数进行如下两步操作:

  1. 对于数组m,以丢硬币的方式,生成随机数1或者-1,如果是1,保持m不变;如果是-1,将m中的所有元素分别乘以-1.也就是m中的元素,-1变成1,1变成-1. m这样的改变并不会改变它和数组l点积的结果。
  2. 随机生成一个随机数r,分别加到数组p的元素中。这个操作不会影响p的第一个性质,但是这时候p的首尾两个元素不为零,但是相等。

下面的代码是这两部操作的实现,也就是如何通过数组l和m获取p,同时对p做上面所示的变化。

import randomdef get_witness(problem, assignment):"""Given an instance of a partition problem via a list of numbers (the problem) and a list of(-1, 1), we say that the assignment satisfies the problem if their dot product is 0."""sum = 0mx = 0    side_obfuscator = 1 - 2 * random.randint(0, 1) # 丢硬币,产生随机的-1或者1witness = [sum] # witness便是passert len(problem) == len(assignment)for num, side in zip(problem, assignment):assert side == 1 or side == -1sum += side * num * side_obfuscator # 计算p的元素witness += [sum]mx = max(mx, num)# make sure that it is a satisfying assignmentassert sum == 0shift = random.randint(0, mx)witness = [x + shift for x in witness] # 将随机数r分别加到p的每个元素中return witness

上面便是零知识证明实践教程的第一部分的内容。

第二部分文章

第三部分文章

转载请注明出处

零知识证明实践教程,第一部分相关推荐

  1. 零知识证明实践教程,第三部分

    本文是零知识证明简单实践教程的第三部分, 第一部分见:零知识证明第一部分, 第二部分见:零知识证明第二部分. 下面这个图片是我们在第二部分所使用的merkle树来构造prover的承诺.同时我们也提出 ...

  2. 零知识证明实践教程,第二部分

    本文是零知识证明简单实践教程的第二部分, 第一部分见:零知识证明第一部分 第三部分见:零知识证明第三部分 现在一个问题是,prover(证明者)可能撒谎,比如原本它应该向verifier(验证者)揭露 ...

  3. 在 BSV 上创建你的第一个零知识证明程序

    ZoKrates 是 zkSNARKs 的工具箱,隐藏了零知识证明 (ZKP) 固有的显着复杂性.它为开发人员提供了一种类似于 python 的高级语言来编写他们想要证明的计算问题. 我们扩展了它,使 ...

  4. 操作系统形式化验证实践教程(11) - 结构化证明语言Isar(转载)

    操作系统形式化验证实践教程(11) - 结构化证明语言Isar 结构化证明语言Isar基本语法 apply方法和by方法虽然可以完成功能,但是看起来更像是命令式语言.使用Isar语言,还可以写得更加形 ...

  5. 操作系统形式化验证实践教程(11) - 结构化证明语言Isar

    操作系统形式化验证实践教程(11) - 结构化证明语言Isar 结构化证明语言Isar基本语法 apply方法和by方法虽然可以完成功能,但是看起来更像是命令式语言.使用Isar语言,还可以写得更加形 ...

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

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

  7. 零知识证明之zk-snark 应用案例(零知识证明实战渔业监控【zksnark】)

    文章目录 零知识证明实战渔业监控 1.需求分析 2.circom电路实现 3.circom电路编译 4.zksnark的可信设置 5.计算ziksarnk电路信号的见证(witness) 6. 创建z ...

  8. 浅谈零知识证明之二:简短无交互证明(SNARK)

    本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程<CS 251: Cryptocurrencies and blockchai ...

  9. 操作系统形式化验证实践教程(7) - C代码的自动验证

    操作系统形式化验证实践教程(7) - C代码的自动验证 上一节教程不知道大家看晕了没有,其实虽然细节很多还没有讲清楚,但是从结构上大家可以看到,其实是很模式化的工作. 那么能不能让这个模式化的工作自动 ...

最新文章

  1. 实验三 JSP应用开发进阶
  2. 领域驱动应对业务复杂度
  3. 科普丨莫拉维克悖论(人工智能中最重要的发现之一)
  4. linux下环境变量PS1设置
  5. linux lvm snapshot lvm 快照 逻辑卷 快照
  6. pandas实战教学电子书上线啦
  7. 用模版实现简单的内存池
  8. 作业3(学习进度表)【第四周】
  9. go-callvis:Go调用关系图(call graph)
  10. apache tomcat (catalina)查版本(solaris/unix)
  11. corelab mysql_ALinq 让Mysql变得如此简单_MySQL
  12. Java Web(1)高并发业务
  13. Java9 新特性 详解
  14. 新建iOS工程如何给所有类名添加前缀
  15. 《Python核心编程》第二版第八章练习题答案 第三部分
  16. java实现代码在线编译器-从零开发(一)简单本地编译+运行测试
  17. 数字图像处理之引言基础
  18. CF-Educational Codeforces Round 44 (Rated for Div. 2)-A-Chess Placing
  19. 安卓的SoundPool(音效池)播放声音(及具体参数解析)
  20. 化工厂人员定位的实施,新导化工厂人员定位带来的效果

热门文章

  1. oracle数据库导出灰色_oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)...
  2. 如何用excle制作黑人拉馆_家居DIY带你学习如何用塑料勺制作壁挂!
  3. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue
  4. pythonos模块使用方法_Python OS模块常用方法总结
  5. 使用 Gatsby.js 搭建静态博客 EX 使用语雀发布到博客
  6. html5常用模板下载网站
  7. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  8. CocoaPod出现“target overrides the `OTHER_LDFLAGS`……的解决方案
  9. _id 和 ObjectId
  10. Guidance Package Manager button doesn’t appear in the VS menu