链客,专为开发者而生,有问必答!网络
此文章来自区块链技术社区,未经容许拒绝转载。区块链
什么是零知识证实
零知识证实的官方定义是可以在不向验证者任何有用的信息的状况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举几个例子,来帮助读者理解这个概念spa
例子一:小明有钥匙图片
地主有一个漂亮的女儿,一直没有嫁出去,有一天地主捡到一把锁,他灵光闪现,何不让老天爷来决定我闺女嫁给谁,因而乎他就发布告示,若是有谁拥有这把锁的钥匙,他就把女儿嫁给他。开发
小明看到那把锁,心想这不是我前两天扔的那把锁吗?我有钥匙啊,可是他又不想把钥匙拿出来让你们看到,由于钥匙上有不可告人的秘密。因而他找到地主,说出了本身的苦衷,地主略微思考了一下,想到了一个好办法。get
他让人搬了一个密封的大木箱,把本身的贴身玉佩放到了箱子里,而后用锁锁起来,说若是小明次日把玉佩交给他,那小明就能够娶到他的女儿。数学
小明晚上偷偷用钥匙打开了箱子,而后把玉佩取出来,次日交到了地主手中。而后和美女幸福的生活在了一块儿。it
这个故事中小明并无把钥匙给地主看,也没有当着地主把锁打开,可是却证实了本身确实有钥匙。社区
例子二:哥德巴赫猜测的证实class
众所周知,哥德巴赫猜测是一个世界级别的数学难题,有一天一个中国大学生小明找到了证实哥德巴赫猜测的方法。可是他说我能证实出来,没人相信他,甚至没人愿意看他的证实过程,由于名气过小了。这时候他就想到可让导师出面证实他已经找出了证实方法,可是他遇到了一个两难的问题:
若是他把证实方法给导师看,导师可能直接说这个证实方法是他发现的。
若是他不把证实方法给导师看,导师也不相信他能找到哥德巴赫猜测的证实方法。
实在是难坏了小明!!!!!!!!
零知识证实能够帮助小明解决他的难题,零知识证实的世界里,小明能够不把实际的证实过程给导师看,只须要提供给导师另一段数据,导师拿到这段数据通过验证能够知道小明真的有哥德巴赫猜测的证实方法,可是导师并无看到真正的证实过程。
比特币的困境
假如你对比特币有了解的话应该知道,比特币就是一个共有的帐本,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这个“大池子帐本”系统,作到了隐藏两个比特币系统不能隐藏的事实:
一、 交易的参与者是谁
二、 交易的金额是多少
若是你想从系统中找出B有多少钱的信息,由于你打不开箱子,甚至都不知道哪些箱子是B的,因此你会一无所得
聪明的读者可能会发现这个系统有一个关键的问题没有解决,A凭啥就能够作一个箱子而且说这个箱子值10块钱?B和别的参与者凭啥相信B这个箱子真的值10块钱,这里就要靠零知识证实的强大力量了。
其实大池子中有一个箱子a是属于A的,A拥有这个箱子的钥匙akey,而且箱子里面的纸条上写着:“这个箱子值10块钱”。当A建立箱子b和对应的钥匙bkey的时候也会建立一个零知识证实的凭条akill,这个凭条的做用就是做废掉箱子a。
这个零知识凭条akill的神器功能就是:
一、全部参与者看到这个akill凭条就知道它对应到大池子里的一个箱子
二、全部参与者看到akill就知道它又生成了一个箱子b,而且箱子的纸条是合法的
三、除了A以外的全部参与者并不知道akill对应的就是a这个箱子
四、akey和akill是一一对应的关系
有点绕,简单来讲,就是A在不提供钥匙akey只提供零知识证实凭条akill的状况下证实两件事
一、 本身拥有一把能够打开大池子中某个箱子的钥匙
二、 证实箱子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的数据。