区块链应用开发指南:业务场景剖析与实战
上QQ阅读APP看书,第一时间看更新

3.1.2 简述零知识证明在区块链中的应用

在区块链上,假设存在一个中转地址,记为AddrExchange,所有人都把Token转到这个地址(AddrExchange),然后,再从AddrExchange转出Token。中转地址被使用之后,有心人就可以通过交易金额等信息,慢慢核对并反推对应关系来找到交易对象。通过技术手段使得转入的交易记录和转出的交易记录无法一一对应,也就真正实现了交易的匿名。零知识证明首先在隐藏对应关系的环节就可以起作用。

现在,让我们把整个区块链系统想象成一个大的中转地址,所有人都往这个地址里转Token,所有人都从这个地址里把Token转走。所有参与交易的人之间不需要合作,转账随时可以进行,不需要等待其他交易。如果在整个系统中,历史上所有的交易都被混合在一起,交易越频繁,交易数量越多,其匿名性也就越高(逆向复杂度高,时间长)。

那么,零知识证明是怎样实现Token转入和转出的分离,并且同时保持可以被验证呢?

假设:每个人在转入Token的时候,都会生成一个数字(不告诉别人),转账的时候在Token上附带一个用这个数字生成的哈希值Alpha,写入区块链账本系统。在转出Token的时候,只需要向系统证明:

交易者知道一个数字,这个数字生成的哈希值是Alpha。

大家经过区块链上的共识,确认这个证明有效之后,就允许交易者把Token转走。因为哈希值Alpha在区块链上,说明转入的Token是确实存在的,而一旦有人知道哈希值Alpha背后的数字,说明其真的是转入Token的交易者。

而零知识证明保证了在交易者整个操作过程中,没有人知道交易者的数字是什么,也就无法伪装成交易者把Token转走。

问题来了,上面的这个证明其实并没有实现转入交易和转出交易的隔离。因为交易者在转出的时候暴露了哈希值Alpha,其他人通过哈希值Alpha就可以找到转入的那笔交易,从而存在把两笔交易关联起来的可能性。

所以,我们有必要把证明过程再升级一下。因为系统中所有的转入交易都会附带一个哈希值,成了一个哈希值的列表。交易者的哈希值Alpha也在这个列表中。如果可以证明:

交易者知道一个数字,这个数字生成的哈希值在系统的哈希值列表中。

那么交易者的哈希值Alpha没有暴露,也就没人能把交易者的转入交易和转出交易关联起来。

上面加粗的两句话,就是零知识证明可以做到的事情。当然零知识证明不仅仅可以用作匿名交易,为了更好地帮助读者理解和掌握,我们用具体的实例,通过一些适用的场景来进一步探讨零知识证明。

如果对工程实现有兴趣,现有匿名交易的实现主要有三类,使用环签名的比如门罗(Monero),使用零知识证明的Zcash,还有使用Mimblewimble协议的Grin等。读者也可以思考一下,相对于环签名,零知识证明带来了哪些收益。后续章节我们也会进一步探讨以太坊的运用。