0x00 前言算法
距离上次发博客有一两个月了,这段时间里潜(ku)心(bi)的看区块链的论文,通过好多好多论文及材料的学习,我发现如今区块链发展的一个颇有意义的方向就是匿名性,早的有匿名交易如ZeroCash和monero,晚点的有以太访为了匿名的zk-SNARK不惜进行硬分叉,如今对于匿名合约的研究更是大热。然鹅,做为我天朝区块链项目的执牛耳者,NEO竟然咩有匿名相关的任何研究及研发资料或者文档,这不科学。因此我就试着去研究了一下在NEO上部署匿名交易合约的可行性。安全
0x01 不可能完成的任务学习
和我以前研究NEO上的任意数量安全随机数的可能性同样,我对于在NEO上部署匿名交易合约的结论也是不可行。先把结论挂出来,只须要结果的就能够不用往下看分析了。区块链
为了亲民考虑,咱们彻底抛开什么零知识证实之类高大上的东西(实际上是没看懂)。有感兴趣的能够参考零知识证实。可是哇,参考是能够的,可是不建议深刻研究。这个东西技术细节须要很强的密码学功底,笔者反正是撤了。加密
0x02 匿名设计设计
这里我用到的东西是偷的一部分门罗币里CryptoNight构造交易时隐藏用户信息的方法,可是因为这只是博客而已,因此具体用了多少我也不去深究了。blog
咱们先不考虑这些币怎么来的,就说已经存在了。币采用UTXO的形式设计,每一个UTXO的结构以下:接口
对于这个系统里的每个UTXO来讲,Coin记录着币自己的信息,这个信息由用户的公钥进行加密,也就是说,假如这个币是李总的,那么这个Coin里的信息就是由李总的公钥来加密的。每个Coin自己有一个私钥,这个私钥能够在每次交易的时候从新生成,在交易构造完成后,与一般的使用用户本身的私钥进行签名不一样,这里使用目标用户的公钥进行签名,以后再用Coin自己私钥对应的公钥进行签名。在交易发布以后,系统只须要对Coin自己的合法性进行验证便可,不须要关心究竟转帐或者传递的数据的内容是多少。文档
也就是说,假如A转帐给B,那么交易构造的流程应该是这样的: 部署
首先A从本身的Coin里拿出一个Coin,而后用本身的私钥解密获取Coin自己的key1,生成新的key2并用这个key2替换key1构造新的Coin,构造完成后用B的公钥来对Coin进行加密,以后再用key1添加签名。
交易发出后,系统会验证key1是否和这个UTXO以前的版本相关联。
0x03 双花致使的不可能性 在上面的设计中有一个很严重的bug,就是双花问题,A知道UTXO,并且能够解密UTXO,那么A就可能构造许多许多的交易,而系统又要求匿名性,那么就不能引入对已有交易的直接判断,那如何即知道这笔钱已经被消费了,而又不知道是花的哪笔钱呢?这里就须要用到零知识证实,在零知识证实中,最简单的解释就是公式:f(x)+f(y)=f(x+y),就是说,咱们只知道f(x),f(y)而不知道x和y,可是咱们就能够判断出f(x+y)的结果是正确的。在这个系统中,咱们能够认为Coin就是x,用户就是y,咱们把Coin和用户都经过算法隐藏起来,可是提供二者交互的结果,那么系统就能够验证这个交互的正确性而不须要知道具体的Coin和用户。这样就达到了匿名而又避免了双花问题。然而,在NEO中,NEO并无对合约开放验证零知识证实须要的密码学计算接口。没有接口也就意味着没法进行零知识证实。所以,至少以目前的分析来看,在NEO合约中部署匿名交易合约是不可能的,除非官方开放相关密码学接口。可是话说回来,零知识证实自己须要的计算量比较大,若是NEO中开放零知识证实的算法接口,那么节点的计算压力将会暴增。
0x04 结语
本文只是笔者一段时间学习结果的小积累,并不必定彻底正确,也不表明严谨的区块链研究。若是有人有相关的思路,欢迎交流。