相较于比特币,Zcash (ZEC)更注重交易资料的隐私。在Zcash的交易网路上,所有的传送人、接收人、交易量的资料都是被加密的,经由一个叫「零知识证明(Zero-knowledge Proof)」的技术来做交易验证。我看了很多文章后(其中也有误导的),才慢慢了解零知识证明的原理,本文先以改版「阿里巴巴与四十大盗」的故事简单说明其箇中奥妙,而后更多深入的研究,则待续。
http://archives.lib.ntnu.edu.tw/
比特币的公开交易内容
比特币是一种加密货币(Cryptocurrency),它利用密码学中的杂凑(Hash)、公开金钥密码(Public-Key cryptography) 和数位签章(Digital signature) 等技术,把钱包地址加密,把货币的使用权加密,可是却没有加密交易资料的内容:付钱的地址、收钱的地址和交易金额。
比特币设计将交易记录公开,我认为技术上的理由是为了让挖矿者(Miner) 快速验证交易中的来源款项是不是合法的UTXO 和付款人。
钱包地址是一串字码,我不知道这个钱包属于谁,就算知道这个钱包拥有多少比特币,也没有侵犯隐私的问题。
这个说法对个人钱包也许行得通,但对一家商店可能就会伤及商业隐私。商店的进出货如果都用比特币来做交易,其实很容易用软体在区块链上找出这家商店的钱包地址的所有资料,算出这家商店的营业所得。在这种需要隐私的应用情境下,比特币的公开交易纪录显得不适用。
Zcash就是解决公开区块链上的资料隐私问题。
Zcash的加密交易内容
Alice 和Bob 使用Zcash 钱包做交易:Alice 转1 ZEC 给Bob。Alice 将交易内容加密后送到Miner 做验证,但问题来了,当Miner 收到这笔交易,因为不能解密交易内容,导致无法验证交易是否合法,进一步定义是:
- 无法验证1 ZEC 是可花用的(ie unspending)
- 无法验证1 ZEC 是属于Alice
关于第一点,Zcash使用「备注作废」的方法来解决。至于第二点,Zcash运用「零知识证明」的方法来验证,它的概念是:Alice不需要提供交易的数位签章给Miner,即可验证1 ZEC是属于Alice。
零知识证明
「零知识证明」讲的是:证明者(prover) 要说服验证者(verifier) 某些事实是真的时候,不需要透露事实里的资讯,即可证明事实是真的。
先举一个常用来说明的例子:「阿里巴巴与四十大盗」。
四十大盗抓住了阿里巴巴!
但盗贼们不确定阿里巴巴知道打开宝藏洞穴石门的咒语?
而阿里巴巴确实知道咒语,却又不想让四十大盗们得到。
所以他们协议好,双方站定间隔一段距离,当盗贼举起右手,阿里巴巴就念咒语开门,当举起左手,就念咒语关门。
如果失败,盗贼会把阿里巴巴杀死。
经过一番的验证,盗贼们确定阿里巴巴会咒语以外,也没有让盗贼知道咒语。
这个故事中有几个元素:
- Assertion: 阿里巴巴知道咒语
- Challenge: 盗贼举手命令
- Commitment: 开门/关门
- Secret: 咒语
对比到Zcash 的加密交易验证:
- Assertion: Alice 拥有1 ZEC
- Challenge: 请提出验证字符串π
- Commitment: 验证字符串π
- Secret: 数位签章(私钥)
想要了解验证字符串π是什么,需要更深入研究零知识证明的相关理论,条件允许的话,我是希望再写一篇专文来说明。