区块链隐私

TxProbe

探测nodes之间的拓扑关系,即node A和node B是否连接。从CoinScope中同时给A和B发送txp和txf,然后双花一次txf,记作txm发送给node A,如果两者有通讯,那么txm将会出现在txm的孤儿列表里。

CoinJoin

Blockchain保护隐私的难点在于:

  • Linkability
  • Traceability

所以CoinJoin把两个同时发生的交易合并了起来,再重新按比发送给接受者。
问题:

  1. 需要信任的第三方来完成混合
  2. 很难同时发生两笔交易
  3. 因为价格不能隐藏,两笔混合的交易数量可能被倒推出来
  4. 参与的人只有两组,50对50的几率

Stealth Address

比如说你是一家店的老板,你选择收取比特币,但是如果大家都直接打钱给你的账户,那么大家都知道你的账户且知道你每天赚了多少钱。

当然你可以通过开很多账户的方式来收钱,但是你太懒了。所以可以用Stealth Address,也就是你可以生成两个私钥,一个spend key,一个scan key,组成一个stealth address:scan_pubkey(spend_pubkey)给客户,你的客户在随机生成一个私钥ephem_key和公钥ephem_pubkey,用ephem_pubkey(scan_pubkey(spend_pubkey))生成Stealth_Pubkey给你。同时还有ephem_key传给你。

于是当是收到了Stealth_Pubkey了以后,可以用ephem_key,scan_key,stealth_address得到bitcoin_address。

有了bitcoin_address后,再用spend_key就可以花出去了。

LightWeight Client’s Privacy

Bloom Filter

轻量客户端的存在是为了让普通用户不用像全节点那样,记录上百GB的数据。同时,每天有那么多交易,我们也不希望全部监听这么多交易信息,我们当然可以把自己的地址告诉节点,让节点在只接受到发给我自己地址的消息时才发送。但是这样的话节点或者其他黑客就能知道我的地址,为了我的隐私,如何让节点既能只告知我们需要的信息,又不让节点知道这些地址对应着我呢?

Bloom Filter针对每个输入的address,做加密哈希,这样他们就会映射在长度为n的一串bits上,并把位上的bit翻转成1。

那么在验证某个address时,只要同样做加密哈希,如果有映射的位上bit为零,则这个address一定不在。而如果得到的bits全部为1,我们只能说可能存在在我们的输入中。我们在创造Bloom Filter时需要输入一个False Positive Rate(FPR),保证不会有太多的错误address被判断正确的。

于是我们自己的SPV client创建了Bloom Filter把我们自己的addresses输入进去,然后发给全节点。在全节点中,记录着所有的地址。如果在全节点端,有黑客试图搞清我们的地址,他有全部的地址和我们的Bloom Filter,那么他可以通过暴力方法得到所有True Positive和False Positive的地址,但他不能辨别。这样我们的地址就被保护了起来。

Stair Stepping阶梯

随着越加越多的address, bloom filter需要扩容,否则就无法满足我们设定的FPR。但我们不想每加一个就扩容一次,所以一般定在每增加五十个就扩容一次。

这就导致了另一个问题,在每次扩容的开始,我们实际的FPR比设定的FPR要小。已知FPR是我们保护隐私的关键,如果FPR变小,那么意味着保护变弱。

Resizing扩容 Restarting重启

当扩容或者刷新hash的种子时,我们需要重新设计filter,我们输入的address会被重新映射,但是这个新的filter和旧的filter将产生不一样的false positive例子。比如Space:{@1,@2,@3,@4,@5,@6}有输入: {@1,@2,@3}, 旧的Positive{@1,@2,@3,@4,@5}, 新的False Positive{@1,@2,@3,@5,@6},那么我们就可以知道@4和@6是错误的,从而缩小了Positive的范围。

Multi Filters

使用多个filters的情况,我们可以得到多组positive的address,在取交集过后也可以判断某些address是false positive,交集是true positive

应该做的

  1. Constant FPR
  2. 不要更新seed
  3. 不要使用不同参数的Multiple Filters

可行的方案

  1. VPN
  2. 预先设置100个address,直接输入到Bloom Filter,然后慢慢使用其中的一个或者多个address。当不够时,再生成另外100个address,生成另外一个Bloom Filter交给node。避免了stair stepping和resizing