当然,这也是有代价的:一个证明的大小将从 288 字节(b)上升到几百 千字节(kb)。尽管在某些情况下,这些代价可能并不十分划得来,不过在另一些场景下,尤其对于需要高度的信任最小化的区块链应用,它可能是物有所值。而一旦椭圆曲线被破解,或者量子计算机真的到来的话,那么它必然是非常值得的。
那么,这种新的零知识证明到底是如何工作的呢?在这之前,先让我们来回顾一下,简洁通用的零知识证明做的是什么事情。假设你现在有一个(公开,public)函数f,一个(私有,private)输入x,和一个(公开,public)输入y。在不透露 x 是什么的情况下,你想要证明你知道有一个 x能够使得f(x) = y(译者注:比如有一个保险箱,你要在不透漏密码具体是什么的情况下,证明你确实知道这个保险箱的密码)。此外,为了这个证明具有一定的简洁性,相比于通过计算f 本身,你希望它能够通过一种更快的方式进行验证。
让我们来讨论几个案例:
f是一个计算,它需要在一台普通计算机上运行两周,但是一个数据中心只需要两小时即可完成。你可以把计算任务(也就是运行f的代码)发送给数据中心,数据中心执行计算,然后返回答案,也就是y 证明。在几毫秒之内你就可以完成验证,并且可以确信y就是真实的答案。
你有一笔经过加密的交易,形式为 “X1 是我旧的余额。X2 是你旧的余额。X3 是我新的余额。X4 是你新的余额”。你想要构建一个证明,证明这笔交易是有效的(具体来说,证明旧的和新的余额都是非负的,并且我的余额减少量刚好是你的余额增加量)。x 可能是一对加密密钥,f可能是一个函数,这个函数包含了一个内置公开输入的交易,输入密钥,解密交易,执行检查,如果通过的话返回 1,否则返回 0。y 必然是 1 了。
你有一个像以太坊一样的区块链,并下载了最新的块。你想要构造一个证明,证明这个块是有效的,并且它是链上最新的块,同时这个链里面的每个块都是有效的。你向一个已知的全节点询问来提供这样一个证明。x 是整个(全部?或者是部分)的区块链,f 是一个按块处理它的函数,验证有效性并输出上一个块的哈希,而 y就是你刚刚下载的块哈希。