采用零知识证明最知名的技术就是匿踪币 Zcash 的 zk-SNARKs 。目前主流加密货币,不论是比特币或以太币都是匿名资讯公开,简单来说就是不会有人知道钱包的主人是谁,但是大家都知道这钱包有多少钱、做过哪些交易,这将大幅降低人们使用的意愿。请想像一下,在加密货币支付的生活下,你想瞒着你老婆买 SWITCH,虽然他不直接拥有钱包,但他却能看到你的钱包转帐金额,与转到哪个钱包,轻轻鬆鬆就能查出你做的好事。
零知识证明是一个相当有趣的验证方式,能够在不公开交易资讯的情况下,矿工还能够验证交易的有效性,以太坊创办人Vitalik Buterin 也多次公开讚赏zk-SNARK的零知识证明技术,并表示此技术有助于提升以太坊的交易速度。
零知识证明
究竟零知识证明是什么意思呢? 用一个有趣的方式跟大家解释。
小时候没有智慧型手机也没有电脑玩,唯一的乐趣就是玩 Where is Wally ,找出图片中Wally在哪裡,大家可以玩玩看,回味一下没有3C的童年时光,如果你找了十分钟还是找不到,开始怀疑我在骗你,Wally根本不在图片裡的时候,零知识证明就能太上用场了!
零知识证明的概念就是「不透漏详细资讯的情况下,证明自己知道真相」。如果我直接告诉你Wally在哪裡,那你就没办法继续玩了,所以我给了你一张Wally的截图:
透过这张图,除了能够证明Wally真的存在,而且我知道在哪裡之外,由于你不知道Wally的实际位置,你还能够继续寻找Wally,零知识证明就是这么简单的概念。
交互式零知识证明
了解零知识证明之后,我们再来介绍什么是交互式零知识证明,我们一样用童年遊戏来跟大家解释。
有一天阿菜出了一道数独的题目给阿平,阿平回家玩了三天三夜,发现根本解不出来,由于阿菜平常做人不老实,阿平怀疑阿菜的这道题目根本没有答案,只是随便填几个数字进去,于是隔天气冲冲地跑去找阿菜。
但是阿菜觉得自己秀才遇到兵,有理说不清,这道题目明明就是好不容易设计好的,于是阿菜就决定用一个方式证明给阿平看,让他知道这道题目是真的有解。
阿菜先让阿平转过身去,阿菜拿出81(9×9)张空白的卡片放在桌上,在每张纸上写上1-9中的一个数字,然后把这81张卡片按照解答顺序排列在桌上,代表谜底的卡片,数字面朝下放在桌上,公开数字的卡片,则数字面朝上放在桌上。
排好之后,阿菜叫阿平转过身,跟阿平说「现在我全部都按照顺序摆好了,但是我不会让你看答案,你可以随意选择按照行、列或按照3×3的九宫格来检验,你可以随便选一种。」
阿平不知道阿菜葫芦裡卖甚么药
「不给看答案,就能让我知道你没骗我,我看你搞甚么花样,我在 “行” 与 “列” 当中选择检验 “行”。」
于是阿菜按照顺序将每一行的牌收起来,装在麻布袋裡,并将所有的牌摇散。
「好了,你随便选一袋吧,只要袋子裡的数字是1~9就代表我的题目没有错。」
阿平把每一个袋子打开,仔细检查每一个袋子裡的牌,结果数字确实都是1~9没有重复,但是阿平很不服气。
「那又怎样,虽然”行”的数字没有重复,那也不代表”列”跟”九宫格”裡的数字没有重复阿。」
阿菜解释
「可是我事先也不知道你会按照”行”、”列”还是按照”九宫格”来检验啊。我是按照题解来放置卡片的,你选啥我都没在怕的」
阿平想了想,确实,一个数独只有真正正确的解才能保证每一行、每一列、每一个九宫格里的数字都是没有重复的1-9。阿菜如果真的在骗他,阿平也至少有1/3的概率可以抓到他在骗人。
阿平又按照同样的方式轮流将”行”、”列”和”九宫格”检验了好几遍,结果袋子裡的数字真的都没有重复。
藉由这个故事,我们发现,阿平选择”行”、”列”和”九宫格”,阿菜再将卡片收集起来交给阿平验证,像这样一来一往,不断提出证据给对放验证,就是所谓的「交互式零知识证明」。
「交互式零知识证明」需要验证方(阿平)在证明方(阿菜)放好答案后,不断的发送随机试验,是最简单的零知识证明与验证方式。
就像是我们打电话给银行客服,客服人员会询问你的出生年月日与身分证字号,来验证你是否为本人。然而,这种方式只有建立在验证方与证明方对立的情况下才能成功,一旦牵涉到第三方,验证和证明双方事先串通好,那么他们就可以在不知道真实答案的情况下作弊。因此衍生出了另一种证明与验证方式「非交互式零知识证明」。
非交互式零知识证明
后来阿平跟阿菜找了阿佑一起玩数独,阿平跟阿菜向阿佑展示了这个验整方式,阿平将”行”、”列”和”九宫格”检验了一轮后,只见阿佑沉默不语,若有所思。
隔天阿佑找来阿菜跟阿平
「你们平常最爱胡搞瞎搞,我很难信任你们,昨天你们的验证方式,如果你们两个串通好,那检验出来的答案就不值得相信,所以我做了这台机器『零知识数独非交互式证明机』。」
这台机器基本上就是把阿菜和阿平之前当面做的那套证明自动化,不再需要人为交互验证。阿菜只要把卡片放在传送带上,机器会自动选择按行,或列,或九宫格来收取卡片,放到袋子里打乱顺序,然后把袋子通过传送带再送出来。然后阿菜就可以当着大家的面拆开袋子展示裡面的卡片。
机器裡有控制面板,可以设置检验”行”、”列”和”九宫格”的检验顺序,阿佑把验证顺序设定好之后就把外壳焊死,没有任何人会知道验证顺序,阿佑就能放心的和他们俩玩数读了。
但是现在换阿菜跟阿平两人不开心了,验证的顺序只有阿佑知道,这样他不就有机会搞鬼了。于是,他们三个人集结起来,让阿佑再次把外壳打开,然后大家一起设置控制面板上的验证顺序。这个过程称为“可信任的初始设置仪式(trusted setup ceremony)”。
阿菜提议把这台机器放在一个漆黑的屋子裡,把旋钮上的指示贴纸都撕掉。三人轮流进入屋子,阿平还提议大家进房间时蒙上眼来保证随机性。这样,最后这些旋钮所代表的验证顺序他们三个人都没有办法知道,就能保证这验证结果的可信度了。
「交互式零知识证明」之所以存在风险,是因为过程中需要需要在证明方与验证方双方交互验证,但「非交互式零知识证明」则不需要这种互动,但是会额外需要一些机器或程式,并且需要一串试验序列,这个试验序列不能被任何人知道,才能维持验证的公正性。有了这么一个程序和试验序列,证明机就能自动算出一个证明,并且能防止任何一方作假。
运用在区块链的零知识证明所采用的就是「非交互式零知识证明」,将交易资讯交给程式,程式会给出一份证明给矿工验证,矿工虽然不知道交易的详细资讯,却能够透过这份证明,验证交易的有效性。最有名的例子就是 Zcash 的 zk-SNARKs 零知识证明技术。
总结
透过这些故事,我们就能知道零知识证明的本质,就是在不透漏我所知道或拥有的某样东西的前提下,向别人证明我有很大机率(这点很重要,零知识证明只是一个概率上的证明)确实知道或拥有这个东西。
将零知识证明的概念运用在区块链上,除了解决加密货币的隐私问题外,零知识证明还能够提升网路的效率。藉由 zk-SNARKs 矿工可以不用再重新执行交易的运算,而是只要对方提得出证明即可,能够将大量信息量压缩,大幅提升网路的吞吐量。