轻松看懂「零知识证明」,看不懂我撅着屁股让你打
科技界的大佬都是积极拥抱区块链。 Google联合创始人谢尔盖.布林月前也曾公开自爆自己是一名以太坊矿工,自己跟儿子一块儿在挖以太坊。 谢尔盖.布林还提到说「零知识证明」这个概念“实在令人难以置信”。这让大家开始好奇零知识证明究竟是什么黑科技,为什么会让Google创始人发出这样的惊叹?
在区块链领域内,零知识证明(zero-knowledge proofs)是很有名的技术词汇。但是,多数人讨论到它就像讨论到量子计算差不多,会纷纷点头表示听过,并尴尬地表示自己懂得不多。
零知识证明是区块链领域公认困难的技术,这个技术才刚出来不久,现在开始了解应该是门槛最低的时候。但相对的,它也有还有很多有待改善的地方。今天我们先从区块链跟零知识证明有什么关系开始看起。
区块链的两难:隐私、可查验
业内曾经用分布式帐本比喻过区块链,负责记帐的人叫做矿工。
矿工在记帐的时候,会先确定转出地址(或帐户)里余额还充足,且这些钱随时可动支,还没有被预定要花在其他地方。基于矿工的核查需求,目前许多区块链的设计,是在网上公开每个地址的交易明细,矿工电脑运行的软件才有办法逐一检查地址里面的余额剩多少。
反面来说,因为交易明细都被迫公开在网上接受矿工核查,导致大家只要知道对方的地址,就可以光明正大地查到他所有的交易纪录,毫无隐私性可言。
用银行帐户来想,会更容易理解这件事可怕在哪。
这就像是别人只要知道我的汇款帐号,他就可以光明正大的上网查询我银行帐户的收支纪录。只不过现在可查询的,是多数人比较少用的加密货币收支记录而已。
那为什么我们现在用的银行转帐服务,不需要公开自己的帐户余额,就能正确记帐呢?
银行的转帐服务是把个人帐户资料完全对银行公开,换句话说银行完全知道你帐户的收支纪录,只不过银行受到严格监管,不能对外公开这些资料。但是区块链上并没有银行负责记帐,而是由全球运行挖矿软件的矿工负责,所以区块链的原始设计,才会是强迫大家都得公开帐户资料。
因此,区块链的发展面临两难困境:用户想保有隐私,但是矿工记帐又必须知道用户的交易纪录才行。比特币区块链的「匿名公开」设计,其实正好与现实需求的「实名秘密」完全相反。
在过去几个月,我们已经看到全球许多国家,都开始要求交易所将「实名认证」加入帐号的注册流程中,这是为了防范犯罪。另外,今天我们也可以理解用户未来会更重视加密货币的交易隐私性,不希望像现在这样完全公开在网上。
但是,如果交易纪录没有公开,矿工就不能查核交易。这该怎么办呢?
零知识证明就是用在这个地方。
保持秘密,但可验证
零知识证明(zero-knowledge proofs)的效果,等同于你不需要让矿工知道你帐户里面确切余额有多少,但是矿工仍然可以知道你的帐户里的钱,够不够钱支付这一笔消费。
我引用MIT多媒体实验室对零知识证明的解释:
你手上有两颗撞球,分别是绿色和红色,除了颜色之外这两颗撞球一模一样。假设我是红绿色盲,因此,就我看来你手上拿的是两颗一模一样的撞球。
问题来了,请问你是否能在不提到任何颜色资讯的前提下,说服我这个色盲相信这两颗球的颜色,确实不同?
当然可以!
你只要把两颗球交给我这个色盲,然后要我拿到背后去随意变换左右顺序之后,再拿出来让你「猜」原本在左手的球,现在换到了哪一手。
对你来说,你一眼就可以判断本来左手拿的是绿色,现在绿色跑到右手去,根本不用猜,很轻易就能指出球换位置了。但是,这对色盲来说简直惊讶!因为就我看来,这是完全相同的两颗球,你肯定只是运气好猜中的。
不过,只要重复做个几次测试,我很快就会相信你说的,这两颗球肯定有哪里不同,只是我看不出来。而且,你也完全没有透露任何关于颜色的资讯。
这就叫做零知识证明。
我们之间的互动中,完全没有提到颜色资讯。换句话说,双方对颜色这项资讯是「零知识」的情况下,你仍然能够用其他方法,说服色盲相信两颗球在颜色上的差异。
对看得到颜色的人来说,当然一眼就看出两者颜色不同,但是对色盲又想知道两颗球哪里不同的人来说,就得用零知识证明的方法说服他。
你发现了吗?
这里的色盲就好像区块链上的矿工,假如现在大家都没有把交易明细公开在网上,那用户就得使用零知识证明这套方法,来说服查核的矿工,自己真的有这笔钱可以花,只是他看不到而已。
当然,用零知识证明来说服矿工自己有足够多的钱,复杂度远比说服色盲高得多,电脑的运算量会非常大。撞球只是方便理解的简化举例,但是两者的逻辑完全相同。
很反直觉吧!所以,谷歌的创始人才会说这是个不可思议的技术。
现在我们再回过头来看零知识证明对区块链的重要性,就会清楚许多。通过零知识证明,可以让原本在区块链上看似零和游戏两个角色(使用者、矿工),现在可以同时兼顾各自的隐私性及核查需求。
那么,真的有人在用零知识证明吗?
有的,最早使用零知识证明技巧的区块链叫做 Zcash,实际的作法叫做zk-SNARKs,这是许多零知识证明的做法之一,也是最有名的一个。
Zcash可以将交易纪录上的汇款者、收款者和金额都经过加密隐藏起来,因此矿工无从得知这些交易上的细节,但仍然可以验证交易。不过,目前多数使用者在Zcash上的交易,还是选择未经加密的作法。
为什么?因为花费的成本比较高,下一段我们马上会讨论。
另外,以太坊(Ethereum)上的智能合约目前也已经可以运用zk-SNARKs 这套零知识证明的作法。但以太坊不完全是从隐私的角度切入,而是从节省运算成本的角度应用零知识证明。
透过zk-SNARKs,以太坊矿工可以不用再重新执行交易的运算,而是只要对方提得出证明即可。大概就像我不需要真的知道你会高一到高三的数学,而只要看到高中毕业证就能确定你懂高中数学。不过,这只有在制作证明的成本,远低于实际运算成本的情况下才划算。
简单来说,零知识证明是一套可以兼顾用户隐私性、矿工核查需求的新作法。但是如同一开始我们所提,零知识证明才刚出现不久,还有许多弱点有待研究、改进。
技术值得期待
即便软件开发者现在已经可以将zk-SNARKs 应用在以太坊的智能合约上,但实际上使用的人并不多。最主要的考量点,是zk-SNARKs 所耗费的运算时间太长、运算量太大。
运算时间太长很好理解,就是原本矿工只要1 秒以内就能完成核查的事,现在要花上7 秒甚至长达40 秒,这会拖慢整体区块链的运作效率。
如果你了解以太坊,以太坊上矿工费的计算方式是单价(gas price)与运算量(gas limit)相乘。因此,将zk-SNARKs 应用在智能合约上,智能合约的使用者就得付出高额的矿工费。如果又因为急件而提高单价的话,矿工费就更贵。
除此之外,目前以太坊的每个区块的gas值限制为670万。如果每次执行智能合约就得花掉上百万个gas,那么其他交易没有空间写入区块,就只能等下一个区块再写,这等同于进一步拖慢了区块链的运作速度。
在目前各种区块链都以提升运作效率、解决规模化(scalability)问题为首要目标的情况下,采用零知识证明的优先序反而没有那么高。因此,距离区块链广泛采用zk-SNARKs 应该还有几年的时间要走,不需要过度惊慌。对研发人员来说,现在或许是个投入研究的好时机。
最后,我们再从监管的角度来看。
越注重隐私性的技术,犯罪者也越喜欢。原本警察可以根据比特币区块链公开在网上的交易纪录,清楚地追查交易流向,虽然不知道这些交易地址的背后操控者是谁,但只要搭配其他的信息(例如IP地址)就有机会找到操控者。
但是,如果未来区块链采用零知识证明,就会让政府监管的难度变得更高。所以,未来政府会如何在用户隐私与监管之间拿捏尺度,是很值得期待的部分。又或者从技术的角度来看,说不定几年之后就又有新技术可以同时满足两者需求,就像是零知识证明同时满足隐私、核查需求一样。
————————
想要深入了解区块链和加密经济,长按下面二维码关注“加密笔记”