当前位置: 首页 > 科技观察

当区块链遇到零知识证明

时间:2023-03-15 22:39:50 科技观察

什么是零知识证明?零知识证明的官方定义是在不给验证者任何有用信息的情况下,能够让验证者相信某个断言是正确的。这个定义有点抽象。下面举几个例子帮助读者理解这个概念。例1:房东小明有一把钥匙,有一个漂亮的女儿,一直没有结婚。有一天,房东拿起一把锁,灵光一闪。为什么不让上帝来决定我的女儿嫁给谁呢,所以他颁布了一项法令,如果谁拥有这把锁的钥匙,他就嫁给他的女儿。小明看到这把锁,心想,这不是我前两天扔掉的锁吗?钥匙我有,但他不想把钥匙拿出来给大家看,因为钥匙有不为人知的秘密。于是他找到房东,表达了自己的苦衷。楼主想了想,想到了一个好办法。他让人搬来一个密封的大木箱,将自己的贴身玉佩放在箱子里,用锁锁好,说如果第二天小明把玉佩给他,小明就可以娶他的女儿了。小明晚上偷偷用钥匙打开盒子,取出玉佩,第二天交给了房东。然后和美女幸福的生活在一起。在这个故事中,小明没有把钥匙给房东看,也没有当着房东的面开锁,但他证明自己确实有钥匙。例2:哥德巴赫猜想的证明众所周知,哥德巴赫猜想是世界级的数学难题。一天,中国大学生小明找到了证明哥德巴赫猜想的方法。但是他说我可以证明。没有人相信他,甚至没有人愿意看他的证明过程,因为他的名气太小了。这时候他想到可以找导师证明他找到了证明方法,但是他遇到了一个两难的选择:如果把证明方法给导师看,导师可能会直接说这个证明方法是自己发现的他。如果他不把证明方法拿给他的导师看,导师不会相信他能找到哥德巴赫猜想的证明方法。真的很难打破小明啊!!!!!!!!!零知识证明可以帮助小明解决他的问题。在零知识证明的世界里,小明不需要向导师展示实际的证明过程,只需要提供给导师即可。一份数据,导师拿到了这一份数据,验证了小明确实有哥德巴赫猜想的证明方法,但是导师并没有看到真正的证明过程。比特币的困境如果你对比特币有所了解,你应该知道比特币是一个共享的账本。A转一笔钱给B,就是在区块链上写一条记录“A转10元给B”,A这10元从哪里来?要求一定是之前有人C在区块链上写了一条记录,“C转10元给A”。于是比特币区块链一个一个地存储一个账本条目:C转A10元,A转B10元,B转D5元,B转E5元,E转D5元D转10元从D给A。..但是这会带来一个问题。所谓的匿名比特币系统不能真正匿名,因为账本是公开的,所以每个人都可以看到A、B、C、D、E有多少钱,什么时候拿到钱的。所谓的匿名其实是不存在的。PS:比特币的匿名性实际上意味着一般不可能将A映射到真实的交易实体。A只是一个账号,并不是像“小明”这样的真实个体。但是如果小明是A账户的主人,而小明最终可能因为操作A账户兑换人民币或者买东西而被查出是小明。所以这种匿名不是真正的匿名。ZCASH如何将零知识证明结合到区块链中为了解决比特币的非匿名性问题,ZCASH将零知识证明引入到比特币系统中。那么它是如何实现匿名的呢?让我们看看它说了什么。假设有一个大水池,里面有很多箱子,每个箱子都是锁着的,只能用一把钥匙打开,箱子里有一张纸条,内容格式如下:“这个箱子值x元”我们暂且称这个大池子为“大池子账本”。整个ZCASH交易系统就是这么一个大池子。当A要转10元给B时,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的同时,也会创建一个零知识证明receiptakill,也就是使盒子a失效。这个零知识回执击杀的神器作用是:1.所有参与者看到击杀回执就知道它对应的是大池子里的一个盒子。2.所有参与者看到killb就知道它又生成了一个盒子。,并且盒子里的注释是合法的3.除了A之外的所有参与者都不知道akill对应盒子a4.akey和akill是一一对应的。Akey不提供密钥,只提供零知识证明,在kill的情况下证明两件事。1.我有一把钥匙,可以打开大水池里的一个箱子。2.证明盒子b是合法的。这个很简单,A把b盒子给B的时候,先把akill扔进大池子里给大家看,B看到akill放到了大池子里,他就认为b盒子是合法的,他也确实是价值10元。最后一个问题是?如果A说他每次都有打开某个箱子的钥匙,一笔钱花了很多次怎么办?akill和akey是一一对应的,将akill放入bigpool中。所有参与者都可以看到,如果他下次要给C一个盒子c,用akill来证明,因为C看到akill已经在大池子里了,C是不会相信A的。PS:可能有人会疑惑另外一个问题这里。当A往大水池扔一个杀,或者B往大水池扔一个箱子,他们的身份不就暴露了吗?这里可以认为是他们偷偷扔的,对应网络的具体实现是B随机找一个网络设备将b盒子对应的数据上传到区块链。通过这个设备很难找到B,B也可以要求C上传b盒子的数据