当前位置: 首页 > 编程日记 > 正文

当区块链遇到零知识证明

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。

在这里插入图片描述
什么是零知识证明
零知识证明的官方定义是能够在不向验证者任何有用的信息的情况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举几个例子,来帮助读者理解这个概念

例子一:小明有钥匙

地主有一个漂亮的女儿,一直没有嫁出去,有一天地主捡到一把锁,他灵光闪现,何不让老天爷来决定我闺女嫁给谁,于是乎他就发布告示,如果有谁拥有这把锁的钥匙,他就把女儿嫁给他。

小明看到那把锁,心想这不是我前两天扔的那把锁吗?我有钥匙啊,但是他又不想把钥匙拿出来让大家看到,因为钥匙上有不可告人的秘密。于是他找到地主,说出了自己的苦衷,地主略微思考了一下,想到了一个好办法。

他让人搬了一个密封的大木箱,把自己的贴身玉佩放到了箱子里,然后用锁锁起来,说如果小明第二天把玉佩交给他,那小明就可以娶到他的女儿。

小明晚上偷偷用钥匙打开了箱子,然后把玉佩取出来,第二天交到了地主手中。然后和美女幸福的生活在了一起。

这个故事中小明并没有把钥匙给地主看,也没有当着地主把锁打开,但是却证明了自己确实有钥匙。

例子二:哥德巴赫猜想的证明

众所周知,哥德巴赫猜想是一个世界级别的数学难题,有一天一个中国大学生小明找到了证明哥德巴赫猜想的方法。但是他说我能证明出来,没人相信他,甚至没人愿意看他的证明过程,因为名气太小了。这时候他就想到可以让导师出面证明他已经找出了证明方法,但是他遇到了一个两难的问题:

如果他把证明方法给导师看,导师可能直接说这个证明方法是他发现的。

如果他不把证明方法给导师看,导师也不相信他能找到哥德巴赫猜想的证明方法。

实在是难坏了小明!!!!!!!!

零知识证明可以帮助小明解决他的难题,零知识证明的世界里,小明可以不把实际的证明过程给导师看,只需要提供给导师另外一段数据,导师拿到这段数据经过验证可以知道小明真的有哥德巴赫猜想的证明方法,但是导师并没有看到真正的证明过程。

比特币的困境
假如你对比特币有了解的话应该知道,比特币就是一个共有的账本,A转给B一笔钱就是在区块链上写一条记录“A转给B 10块钱”,A的10块钱从哪儿来呢?要求必须是以前某人C在区块链上写一条记录“C转给A 10块钱”。于是比特币的区块链上就是存放了一条一条的账本条目:

C转给A 10块钱

A转给B 10块钱

B转给D 5块钱

B转给E 5块钱

E转给D 5块钱

D转给A 10块钱

……

但是这样会带来一个问题,号称匿名的比特币系统却做不到真的匿名,因为账本是公开的,所以大家都能看到A,B,C,D,E都有多少钱,并且是在什么时间得到的这笔钱的。而所谓的匿名性其实是不存在的。

PS:比特币的匿名性其实是指一般无法把A对应到真正的交易人实体,A只是一个账户标号,而不是类似“小明”这样的实际个人。但是假如小明是A账户的拥有者,而小明最终有可能因为操作账户A兑换了人民币或者购买什么东西,而被发现其实A就是小明。所以这个匿名性并不是真正的匿名性。

ZCASH怎么结合零知识证明到区块链
为了解决比特币的非匿名问题,零知识证明被ZCASH引入到比特币系统中。那么它是怎么实现匿名性的呢?且看娓娓道来。

假设有一个大池子,里面有一大堆的箱子,每一个箱子都被锁住并且只有一把钥匙可以打开,而且箱子中都有一张纸条,内容格式如下:

“这个箱子值x块钱”

我们暂且叫这个大池子为“大池子账本”。

ZCASH整个交易系统就是这样一个大池子,当A要转给B 10块钱的时候,A会填写一张字条:“这个箱子值10块钱”,然后把这个字条放到一个箱子里,锁上,把箱子和箱子对应的钥匙一起给了B,B拿到箱子和钥匙,用钥匙打开了箱子一看字条的内容是,“这个箱子值10块钱”B就知道他确实得到了10块钱,然后把箱子扔到大池子里,而钥匙他保留了下来,这样B就相当于在“大池子账本”里记录了他拥有了10块钱这个事实。

因为B有钥匙,所以他能知道自己有多少钱,并且在适当的时候花掉这笔钱,但是别人(除了A)只能看到箱子,看不到纸条的内容,并不知道箱子值多少钱,并且也不知道箱子到底属于谁(B有钥匙这件事儿他们不知道)。也就是ZCASH这个“大池子账本”系统,做到了隐藏两个比特币系统不能隐藏的事实:

1、 交易的参与者是谁

2、 交易的金额是多少

如果你想从系统中找出B有多少钱的信息,因为你打不开箱子,甚至都不知道哪些箱子是B的,所以你会一无所获

聪明的读者可能会发现这个系统有一个关键的问题没有解决,A凭啥就可以做一个箱子并且说这个箱子值10块钱?B和别的参与者凭啥相信B这个箱子真的值10块钱,这里就要靠零知识证明的强大力量了。

其实大池子中有一个箱子a是属于A的,A拥有这个箱子的钥匙akey,并且箱子里面的纸条上写着:“这个箱子值10块钱”。当A创建箱子b和对应的钥匙bkey的时候也会创建一个零知识证明的凭条akill,这个凭条的作用就是作废掉箱子a。

这个零知识凭条akill的神器功能就是:

1、所有参与者看到这个akill凭条就知道它对应到大池子里的一个箱子

2、所有参与者看到akill就知道它又生成了一个箱子b,并且箱子的纸条是合法的

3、除了A之外的所有参与者并不知道akill对应的就是a这个箱子

4、akey和akill是一一对应的关系

有点绕,简单来说,就是A在不提供钥匙akey只提供零知识证明凭条akill的情况下证明两件事

1、 自己拥有一把可以打开大池子中某个箱子的钥匙

2、 证明箱子b是合法的

这样就简单了,A把箱子b给B的时候,先把akill扔到了大池子里,让大家看,B看到了akill被放到了大池子里,他就相信b箱子是合法的,他确实值10块钱。

余下最后一个问题?如果A每次都说自己拥有打开某个箱子的钥匙,一笔钱被花了很多次怎么办?

akill和akey是一一对应的,并且akill被放到大池子里了,所有参与者都能看见,如果下次他又想给C一个箱子c并且用akill来证明,因为C看到akill已经在大池子里了,所以C就不相信A了。

PS:这里可能部分人会疑惑另外一个问题,当A扔akill到大池子里,或者B扔箱子到大池子里的时候他们的身份不就暴漏了吗?

这里可以认为他们是偷偷扔的,具体对应到网络上的实现就是B随便找了一台网络设备把箱子b对应的数据上传到区块链上。而想通过这台设备找到B很难,并且B也可以托C上传箱子b的数据。

相关文章:

从条纹边框的实现谈盒子模型(转)

类似下面这个图形&#xff0c;只使用一个标签&#xff0c;可以有多少种实现方式&#xff1a; 假设我们的单标签为 div: 1<div></div>定义如下通用 CSS: 12345div{position:relative;width: 180px;height: 180px;}这一题主要考查的是盒子模型 Box Model 与 背景 bac…

python表格筛选打印_按行名进行表格筛选:awkpythonR

引入Excel确实很强大。用Excel查找一行很容易&#xff0c;同样的事情1000次就很复杂。批量查询的需求应运而生~实验狗确实需要各种帮助&#xff0c;不然就傻傻复制啦~1.awk读取多个文件awk BEGIN{OFSFS"\t"}ARGIND1{print $0, $1;}ARGIND2{} file1 file21)awk初步提取…

SVG和canvas

1、SVG实现的圆环旋转效果 参考&#xff1a;http://www.softwhy.com/article-6472-1.html 2、SVG中的图形可以通过 transform"matrix(0,-1,1,0,0,440)"进行旋转。 3、svg代码可以单独放在一个后缀名为 .svg 的文件中保存起来。这个文件就是矢量图片文件。 这点用来制…

用零知识证明解决投票安全

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 背景 我们经常会遇到需要给别人投票的情况&#xff0c;比如有些公司会组织员工给领导做反向打分&#xff0c;但是往往员工都不敢“真心实意”的打分…

gitLab创建自己的私有库

一.创建私有库的流程简介 创建一个项目,留着后面的流程3制作私有库在可以创建私有库的地方创建一个code repository, code repository是代码仓库,我们把代码上传到这个仓库。在可以创建私有库的地方创建一个spec repository, spec repository是配置仓库,所有的配置按照包名、版…

AngularJS安装配置与基础概要整理(上)

以前整理的&#xff0c;可供参考。 安装&#xff1a; 1.首先要安装node.js和它的npm包管理系统。&#xff08;nodejs相关待整理&#xff09; 2.安装grunt .grunt是一个基于任务的Javascript工程命令行构建工具。 在dos窗口输入&#xff1a;npm install grunt-cli -g 具体模块安…

通风与防排烟工程电子书_菠菜关于防排烟系统使用软接头工程量计算注意及定额选用建议...

前言&#xff1a;前几日分享《工程建设标准强制性条文》关于安装专业相关内容&#xff0c;其余规范部分&#xff0c;建议大家自行查看&#xff0c;不再继续分享。今日继续分享《建筑防烟排烟系统技术标准》相关内容依据1&#xff1a;2.1 设于排风兼排烟系统上的软接管必须为不燃…

超级账本(Hyperledger Fabric)之权限管理浅析

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 超级账本&#xff08;Hyperledger Fabric&#xff09;之权限管理浅析 超级账本是联盟链的代表&#xff0c;而其相对于共链&#xff08;例如比特币&a…

Java通过JDBC连接MySQL数据库

代码描述&#xff1a;把前台获取的字段作为查询条件&#xff0c;返回符合条件的记录。 1 package com.imooc.dao;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.PreparedStatement;6 import java.sql.ResultSet;7 import java.sql.SQLExc…

关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

因客户需求&#xff0c;与第三方对接&#xff0c;调用非托管DLL&#xff0c;之前正常对接的程序&#xff0c;却总是报“内存已损坏的异常”&#xff0c;程序进程直接死掉&#xff0c;折腾到这个点&#xff08;2018-05-11 00:26&#xff09;&#xff0c;终于尘埃落定,直接上程序…

python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

一、内存泄漏像Java程序一样&#xff0c;虽然Python本身也有垃圾回收的功能&#xff0c;但是同样也会产生内存泄漏的问题。对于一个用 python 实现的&#xff0c;长期运行的后台服务进程来说&#xff0c;如果内存持续增长&#xff0c;那么很可能是有了“内存泄露”。1、内存泄露…

以太坊发展历史回顾

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊历史 最近历史记录&#xff0c;请查看Taylor Gerring博客发帖。 诞生 2013年末Vitalik Buterin第一次描述了以太坊&#xff0c;作为他研究比…

医学图像分类_TauMed:医学诊断领域中的图像分类测试数据扩增

南京大学智能软件工程实验室iselab.cn摘要&#xff1a;深度学习在医学分类方面取得了长足的进步。但是&#xff0c;在许多现实的环境中&#xff0c;用于训练和测试的数据不足且不平衡&#xff0c;深度学习模型将很容易过度拟合且泛化能力很差。并且由于医院和患者的状况并不总是…

仲兆鹏 160809329 第5次

---恢复内容开始--- 第一题 #include<stdio.h>//输入三个数有小到大排序 int main() {int a;int b;int c;printf("输入三个整数:");scanf("%d %d %d",&a,&b,&c);if(a>c) { ta; ac; ct; } if(b>c) { tb…

promise实现多个请求并行串行执行

早上查资料&#xff0c;偶然发现这个话题&#xff0c;发现自己并不会&#xff0c;于是乎&#xff0c;下来研究了一下。 想想之前我们用jquery写请求的时候&#xff0c;要实现请求的串行执行&#xff0c;我们可能是这么做的。 $.ajax({url: ,data: ,success: function (data) {$…

人工智能和区块链的融合

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 AI与区块链结合&#xff0c;可能性有多大&#xff1f; 人工智能和区块链是促进各行业创新和转型的主要技术&#xff0c;对这一点各行业已达成共识。…

AngularJS学习笔记(3)——通过Ajax获取JSON数据

通过Ajax获取JSON数据 以我之前写的与用户交互的动态清单列表为例&#xff0c;使用JSON前todo.html代码如下&#xff1a; <!DOCTYPE html> <html ng-app"todoApp"> <head> <meta charset"UTF-8"> <title>TO DO List</tit…

python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频

爬取哔哩哔哩小视频前言&#xff1a;想必大家都对小视频感兴趣吧&#xff0c;今天的爬虫的内容为将哔哩哔哩中的视频下载到本地&#xff0c;今天爬取的网站为URL : https://vc.bilibili.com/p/eden/all#/?tab%E5%BE%A1%E5%AE%85%E6%96%87%E5%8C%96&tagCOSPLAY1. 分析站点a…

区块链双语术语大全

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 这是一个简单而又全面的Blockchain词汇表&#xff0c;用于令人印象深刻的blockchain语言世界。 51% Attack&#xff08;51%攻击&#xff09; 当一…

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别 事务隔离级别简单的说&#xff0c;就是当激活事务时&#xff0c;控制事务内因SQL语句产生的锁定需要保留多入&#xff0c;影响范围多大&#xff0c;以防止多人访问时&#xff0c;在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。 SQL Serve…

开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库...

一&#xff1a;开篇 哈哈哈&#xff0c;感谢标题党的莅临~ 虽然标题有点夸张的感觉&#xff0c;但实际上&#xff0c;插件库确实是简洁&#xff0c;高效&#xff0c;轻量级&#xff0c;酷炫酷炫的咯。废话不多说&#xff0c;先来看个标配例子吧&#xff1a; &#xff08;codepe…

python启动appium服务_python下appium服务的自启动和关闭

最近想把前不久写的webUi框架改写成mobile_Ui,也就是 用于手机端的UI自动化框架&#xff0c;目前已经完成该框架的改写&#xff0c;记录其中一些问题&#xff0c;框架后续会单独写篇幅介绍遇到的第一个问题就是1、python怎么能够自动启动和自动关闭appium服务&#xff0c;这样每…

以太坊源码分析

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 前言&#xff1a;人类正在步入数据时代。如今&#xff0c;全球每天就产生超过500亿GB的数据&#xff0c;据IDC预测&#xff0c;到2025年这一数据将超…

yapi-docker

yapi-docker 转载于:https://www.cnblogs.com/vickey-wu/p/9026153.html

灵活性是原则性基础上的灵活

灵活性是原则性基础上的灵活&#xff0c;没有原则性的灵活是耍流氓。 原则性是质&#xff0c;灵活性是量&#xff0c;灵活性有度的要求&#xff0c;就是不能改变质。转载于:https://www.cnblogs.com/jcode/p/5961867.html

办公室自动化系统_信息化管理建设 公司办公室用自动盖章机贵吗?

办公室自动盖章机的应用我们首先要考虑到底有没有用&#xff0c;之后在考虑贵不贵的问题。自动盖章机也称智能印章&#xff0c;是企业单位建设信息化印章管理方式的一种&#xff0c;过去由于人工盖章和管章效率低&#xff0c;且风险较大&#xff0c;为了避免因印章管理不当引起…

加密货币银行是什么?它又将如何运作?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币曾经承诺&#xff0c;将帮助每个人拥有“属于自己的 银行 ”。但这里需要强调一点&#xff0c;在了解到银行实际提供的众多服务之后&#xff…

【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传

背景 前一篇博客记录的可以上传用例到testlink指定用例集的脚本&#xff0c;内部分享给了之后&#xff0c;同事希望能将testlink上原有的用例下载下来&#xff0c;用于下次修改上传&#xff0c;所有有了本文脚本。 具体实现 获取用例信息 def download_testcase():""…

Java随机字符串:随机数字字符串,工具类

Java中生成随机数&#xff0c;字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串数字等 ......... 2. 总共8种类型&#xff0c;具体看工具类中的注释。 1 import java.util.Date;2 import java.util.Random;3 i…

python怎么查看代码错误_python中的错误如何查看

python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象属性错误4.TypeError类型错误5.IOError输入输出错误6.KeyError字典键值错误具体介绍1.NameError变量名错误报错&#xff1a;>>> print aTraceback (most recent call last…