比特币中的匿名:
用户可以使用公钥产生任意多地址,然后使用不同的地址进行交易。
什么情况可能破坏匿名性:
1.不同地址被关联在一起
网上购物:Input中的addr1、addr2....以及可能存在output中的找零地址(找零的钱肯定是比input中最小的UTXO更小)会被推断为一个人(因为同时拥有这些地址的私钥)
2.和现实产生联系时,存在资金泄露问题
用来支付的时候 账户就会和实现身份建立联系。如果在交易过程中周围人记住这笔交易,在链上查询,就能通过这个交易查询关联到账户
如何提高匿名性?
网络层匿名性:洋葱路由TOR(只知道上一个节点是谁,而不知道最早发出的节点是谁)
应用层匿名性:Coin mixing 把币混在一起,让人分不出来(把币发给提供Coin mixing服务的网站,再取回来随机抽取的币)
零知识证明:
证明者向验证者证明一个陈述是正确的,但不需要透露除了这个陈述是正确的之外的信息。
例1:证明某个比特币账户的所有权(证明者知道账户私钥) 解决方法:数字签名
同态隐藏:
1. 如果x,y不同,那么它们的加密函数值E(x)和E(y)也不相同。(不同于hash可能会存在碰撞,同时如果E(x)=E(y),说明x=y)
2. 给定E(x)的值,很难反推出x的值。
3. 给定E(x)和E(y)的值,可以很容易地计算出某些关于x,y的加密函数值。
-同态加法:通过E(x)和E(y)计算出E(x+y)的值
-同态乘法:通过E(x)和E(y)计算出E(xy)的值
-扩展到多项式
例:证明x+y7,但是不透露x、y的具体值
公开E(x)、E(y),通过同态隐藏的性质3算出E(x+y)的值,再对比E(7)的值,如果相同则验证通过,否则验证失败。
盲签方法:
用户A提供SerialNum,银行在不知道SerialNum的情况下返回签名Token,减少A的存款
用户A把SerialNum和Token交给B完成交易用户
B拿SerialNum和Token给银行验证,银行验证通过,增加B的存款
银行无法把A和B联系起来。
中心化
零币和零钞
零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证。
零币(zerocoin)系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务。
零钞(zerocash)系统使用zk-SNARKs协议,不依赖一种基础币,区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行。