区块链中的零知识证明应用
在区块链上的交易中,如比特币和以太坊网络网络,除了使用地址来替换交易双方的真实身份,使得交易具有部分匿名性以外,发送、接收地址和金额都是已知的,别人有可能通过网络上的各种信息、和现实世界发生的交互记录等将比特币地址和真实身份对应起来,也因此具有隐私暴露的隐患。Zerocoin设计了一种全新的思路,无法通过交易历史分析来获得用户真实身份。Zerocoin里需要消耗一定价值的要交易的货币,以生成具有独特序列号的一枚零币。零知识证明可以在不透露花费了具体哪个货币的基础上,验证出你的确花了这笔钱。为了将这笔钱转给他人,逻辑上需要我们使得这枚零币不能再被别人花费,零币的办法是大家共同维护一个作废列表,存着所有已经花费的零币的序列号。矿工在验证这笔花费交易时运用零知识证明的方法,不需要知道具体花掉哪一个零币,也可以验证零币的序列号是否在作废列表里。由于花费交易并没有输入地址和签名的信息,整个交易过程中,矿工也并不知道这个零币的来源,因此也就难以对交易历史进行分析而获取用户身份。
在零币里,交易的金额是可以知道的,而采用zkSNARKs技术的Zerocash连交易金额都可以隐密,账本唯一公开记录的唯一内容就是交易的存在性。可以证明对于NP中的所有问题存在zkSNARKs。它引入了多项创新技术,使它们可以在区块链中使用。最重要的是,zkSNARKs减少了证明的大小和验证它们所需的计算量。它的过程可以简述为。
1. 将要验证的程序拆解成一个个逻辑上的验证步骤,将这些逻辑上的步骤拆解成由加减乘除构成的算数电路。
2. 通过一系列的变换将需要验证的程序转换成验证多项式乘积是相等的,如证明t(x)h(x)= w(x)v(x)。
3. 为了使得证明更加简洁,验证者预先随机选择几个检查点s,检查在这几个点上的等式是否成立。
4. 通过同态编码/加密的方式使得验证者在计算等式时不知道实际的输入数值,但是仍能进行验证。
5. 在等式左右两边可以同时乘上一个不为0的保密的数值k,那么在验证(t(s)h(s)k)等于(w(s)v(s)k)时,就无法知道具体的t(s)、h(s)、w(s)、v(s),因此可以使得信息得到保护。
不同于Zerocoin的密码学原语RSA累加器,zkSNARKs技术较新,未经广泛验证,存在风险,同时由于更强的匿名性,Zerocash的漏洞也更难发现,和Zerocoin相比,Zerocash由于交易金额信息也是未知的,所以如果有攻击者无限制地发行零钞,这样的情况是无法检测的。
除此以外Zerocoin 和Zerocash均需要提前内置生成参数,用户在使用这些网络的时候必须信任这些参数没有被泄露,但是一旦这些参数被泄露,整个网络将面临毁灭性打击。复杂的信任设置使得Zerocash存在争议,即使他们设计了一套“仪式”(例如录下砸坏存有密钥电脑的过程)来证明自己。
可能的解决办法包括利用像英特尔SGX和ARM TrustZone这样的现代“可信执行环境”。就英特尔的SGX技术而言,即使应用程序、操作系统、BIOS或VMM遭到了破坏,私钥也是安全的。除此以外,最新提出的zkSTARKs技术不需要进行信任设置。
根据zkSTARKs白皮书中所述,zkSTARKs是首次实现既可以不依赖任何信任设置来完成区块链验证,同时计算速度随着计算数据量的增加而指数级加速的系统。它不依赖公钥密码系统,更简单的假设使得它理论上更安全,因为它唯一的加密假设是散列函数(如SHA2)是不可预测的(这一假设也是比特币挖掘稳定性的基础),因此也使其具有抗量子性。作为一种新颖的技术,和zkSTARKs一样,它也需要经过时间的检验。