Zcash series C: 如何证明“你妈是你妈”

碎碎念

本来我只是想发扬J.K.罗琳“标题不起眼,内容很精彩”的精神,做个安心写系列的小编。但是昨天看到学弟的爆款文连中科院物理所的公众号都转发了,深受触动,结果忍不住搞个标题党试水一下。

在《series A: Zcash是如何交易的》里即便我很卖力地用了各种比喻,但想必读者们依然被整个复杂的交易过程搞晕。Zcash之所以设计得那么复杂,又是Z币池又是委托又是销毁口令的,无非就是为了隐私性而服务。只不过在比特币的世界里,一切都摆在台面上,交易的合法性不证自明。但是在Zcash的世界里,交易的信息都被伪装得很好,为了让大家都认可交易双方没有在任何一个环节弄虚作假,就不得不请出零知识证明了。就好像中本聪(比特币创始人,大众至今未确定其庐山真面目)在网络上把自己隐藏得那么好,突然一个人跳出来自称自己是中本聪,总得拿出一些证据吧。

我提到过Pour交易支持不多于两个Z币的销毁和不多于两个Z币的生成,不失一般性,假定销毁了两个Alice的Z币,那么首先就得证明Alice确实拥有这两个Z币吧。但是正如现实生活中你手中的钞票得确保是从银行取出的新币或者曾经与他人合法交易所得,而不是你伪造出来的,Alice也必须证明她的两个Z币都确实是在以前的挖矿(Mint交易)中所得,或者某次Pour交易的输出。还有就是要证明销毁的Z币金额与生成的Z币金额相等,这个道理大家都懂。

可是……这怎么听起来和证明“你妈是你妈”一样难啊

别慌,听我逐条分析

1. Alice的两个Z币是过去某次Pour交易的输出

你可能会问不是说还有可能是Mint交易所得嘛,但是我说过Mint交易其实就是Pour交易在输入为0时候的情形。

Alice的两枚Z币以委托(coin commitment)的形式存在于Z币池内。还记得我提过的可以将随机种子、金额和接收者的支付公钥隐藏在委托里的魔法嘛,魔法其实就是委托函数(commitment scheme),既然这是个函数,就意味着证明者Alice掌握着函数的输入(当时Alice通过解密通信的密文得知了随机种子和金额的信息,而支付公钥本来就是公开的,是发起者输入到Pour交易里的),验证者们掌握着函数的输出。这个函数是个one-way function,意味着由输入得到输出很容易,但由输出推断输入却很难。那么Alice只要展示随机种子、金额和支付公钥喂给commitment scheme后吐出来的值,验证者们拿来与被销毁的委托(本质上就是个值)比较是否相等就好啦

2. 被销毁的Z币确实属于Alice

还记得我在series A提过的串行编号/销毁口令吧,随着这两枚Z币的销毁而被公诸于众。当初Alice可是用解密收到的随机种子和自己的支付私钥通过伪随机函数造出销毁口令的,类似地,只要Alice展示的随机种子和支付私钥喂给伪随机函数后吐出后的值和广播出去的销毁口令一致即可。如果Z币不是属于Alice的,支付私钥就对不上号,那就说明她无法广播正确的销毁口令。

3. 销毁的Z币金额与生成的Z币金额相等

你可能会问,不是说金额完全不公开嘛,那么怎么给验证者们验证呢,当然不是赤裸裸地拿出来比较呀,这就需要我们以后会介绍的同态隐藏。

费了这么多口舌,只是为了说明一件事,看起来和证明“你妈是你妈”一样难的交易流程,其实就是小学就学过的两个数的加法和比大小!大道至简,有没有很震惊呢