0%

区块链技术与应用(11 BTC - 匿名性)

区块链技术与应用(11 BTC - 匿名性)

北京大学肖臻老师公开课《区块链技术与应用》,可以直接点击查看视频。

比特币的匿名性 (bitcoin and anonymity)

什么叫匿名?一般来说,匿名是跟隐私保护联系在一起的。比特币中不要求用真名,可以用公钥产生的地址,所以比特币具有一定的匿名性。也就是你可以产生任意多的地址,然后用不同的地址干不同的事情。它用的是化名,但它不是完全没有名字,所以有人把它称为 preudonymity。

比特币和银行存款哪个匿名性更好?
银行账户是实名制,你得提交身份信息,然后才能注册银行账户,而比特币不需要,从这点上看比特币匿名性要好。

其实,以前银行是可以用化名的,如果银行账户匿名的话隐私性和匿名性与比特币相比哪个好?
银行账户更好。比特币区块链的账本是公开的,所有人都能查到,每个人都可以上区块链把整个信息下载下来。而银行的账本是受控制的,银行的工作人员可以查到,一些司法手段也可以调取银行的信息,但普通百姓是查不到别人的账的。

比特币系统中什么情况下有可能破坏匿名性?
有的人推荐每次收款都用一个新的地址,这样的话可以有不同的地址,谁也不知道哪些是属于你的,看起来好像匿名性很强,但实际上这些地址是可以被关联在一起的。

比如网上购物,比特币交易允许有多个输入多个输出。而多个输入有可能是同一个人,因为这个人可能同时控制了这两个账户的私钥。为什么要有两个输入:因为你买的东西很可能不是你某个账户上全部的币。有多个输出,很可能有一个是找零钱的地址。这种交易一般都是比特币钱包软件生成的。很多交易软件每次交易的时候都会生成一个新的找零的地址,也是为了隐私保护。

有没有可能把输入地址和输出地址也关联起来呢?比特币生成交易的时候并没有规定找零钱的地址在 outputs 中出现的位置,所以想知道哪个是找零的地址也并不容易,但有些情况下可以分析出来。

比如第一个地址账户上有 4 个比特币,第二个有 5 个。产生的两个输出第一个输出转入 6 个比特币,第二个输出转入 3 个比特币。那很明显转入 3 个比特币的输出是找零的,因为如果它是商家的地址,就用不着两个 inputs,任意一个输入都比 3 大。通过这种方法我们可以把输入地址和输出地址也关联起来。

如果想要更好的隐私保护,可以产生一些没必要的输出,为了迷惑别人。但是这些交易几乎都是用钱包软件生成的,现在很少有人手工生成这些比特币的转账交易,常用的比特币钱包就那么几种。所以把常用的比特币钱包生成交易的方式搞清楚,那么区块链上很大一部分转账交易都可以分析出来。常用的钱包到目前为止一般没有故意生成一些不必要的输出地址。

有可能破坏比特币匿名性的第一个方面:一个人可以生成很多个地址账户但这些地址账户是有可能被关联起来的。第二个方面:是这个地址账户跟现实世界中的身份也可能产生关联。什么时候会有关联?什么情况下别人有可能知道比特币账户对应的现实生活中的哪个人呢?

比特币系统一旦跟现实世界联系起来,就可能泄露你的真实身份,最明显的例子就是资金的转入和转出。怎么避免用比特币洗钱呢?盯住比特币的转入转出链是一个常用的手段。大笔的比特币和货币的交易想不引起司法部门的注意是很难的,转入转出也是比特币隐私容易被破坏的一个很重要的时机。

还有什么时候会泄露真实身份?用比特币做支付的时候。在实体世界中用比特币做支付,比如国外有的商家是接受比特币支付。但有一些麻烦之处:①延迟很长,等到交易确认要等六个区块生成,即一个小时。②交易费很贵。如果买咖啡,交易费可能都跟咖啡差不多贵了。这样的话,你支付的账户就跟你的真实身份建立联系了。这个账户可能跟个人的其他账户也是有联系的,所以这样很容易泄露个人隐私和身份。而且该交易不仅是该商家会知道,其他人也会知道。

比如:A 想知道 B 的地址。A 可以在 B 去买商品时,留意 B 支付的时间,然后去查找在这个时间点的交易。在 B 下一次购买商品时也留意支付时间,这样下去用不了几次就能知道哪个哈希值是 B 的。

这个例子告诉我们什么?信用卡记录不能公开,即使匿名,也不应将公钥取哈希后公开。但比特币系统是无法保密的,所以比特币的匿名性并不是绝对的,没有想象中那么好。

实际中用比特币的人匿名性保存的怎么样?中本聪发明比特币以来,没有进行过任何一笔交易,所以到现在也没人知道他的真实身份。曾经有一个叫丝路 (silk road) 的网站 (eBay for illegal drugs),有像 eBay 一样的网上交易平台,但卖的都是非法的违禁品。为了逃避司法制裁,其支付手段就是比特币,底下的网络层用的是洋葱路由 (TOR),在美国也有匿名邮寄的服务。

最后运行了两三年,就被查封了。美国政府抓到其老板时没收了其十几万个比特币,在当时价值几千万美元。但他生活简朴,因为虽然有价值连城的比特币,但一旦消费就会暴露身份。

该网站被查封之后,有人又开了 silk road2。也是运行没几年就被查封。还有一些类似的网上黑店,最后下场都不好。这些事件都说明了,比特币的匿名性没有我们想象中的那么好,尤其是想用它来做坏事。

所以回到前面的问题:比特币的匿名性有多好?匿名是跟隐私保护相关联的,但问题在于:你不想向谁暴露身份 (hide your identity from whom)?如果你不想让身边的亲戚朋友知道,这是比较容易实现的。如果是非法组织,从事黑市活动,那保护起来就难多了。

一个比特币用户能采用什么样的方法尽量提高个人的匿名性?以前曾讲过,比特币系统是运行于应用层 (application layer) 的,底层是 (network layer)。所以要提高匿名性可以从两个方面入手。

①网络层怎么提高匿名性?
在现实中,如果一个人去网吧发了帖子,别人是有办法知道他是谁的。因为他的身份证代表了他的身份,这和他的 IP 地址是有很大关联性的。
而网络层的匿名性是比较好解决的。区块链是个新生事物,但网络层的匿名性学术界已经有了很好的方案:多路径转发。跟洋葱路由 (TOR) 是一样的原理。即消息不是由发出者直接发送给接收者,中间要经过很多次转发。中间的每一个节点,只知道它的上一个节点是谁,但并不知道最早发出消息的人是谁。当然中间一些节点可能是坏的,但路径上只要有一个节点是诚实的,就能够把最初发起人的身份隐藏起来。这也是洋葱路由的基本原理。

②应用层怎么提高匿名性?
把不同人的币混在一起 (coin mixing),即把你的身份跟别人的身份混在一起,让别人分不清楚谁是谁。不光是区块链,在其他各个需要匿名的领域都能用到。有一些专门做 coin mixing 的网站,提供一定的服务收取一定的服务费。所有想做 coin mixing 的人把币发给网站,网站内部进行一些重组,然后你再把币取回来,这时取出的币就不是发布到网站上的币了,它是随机抽取一些币给你。

coin mixing 真正实施起来有一定的复杂性,如果设计不好的话,别人可以根据你当初存进去币的数额,推断出来哪些币是你存进去的。
而且,在当今的区块链的世界里,没有什么信誉度非常高的 coin mixing 的服务。很多 coin mixing 的服务它本身也是要保持匿名的,它匿名的后果是:有可能投进去的币被他卷款跑路了,投币者是一点办法都没有的。

实际上并不一定非要做 coin mixing,有一些应用本身也带有 coin mixing 的性质,比如在线钱包。很多人会把钱存入在线钱包里,在线钱包就会把这些人的币混起来,再取回自己的币时可能就不是当初存进去的币了。但在线钱包并不保证要履行 coin mixing 的功能。

还可以通过加密货币的交易所,交易所一般有天然的 coin mixing 的性质。前提是交易所不会泄露提币、存币的记录,否则也是不行的。

为什么保护隐私性难度挺大?本质原因是区块链是公开的,而且是不可篡改的。不可篡改性对于隐私保护来说是灾难性的。

零知识证明:

image-20211214112453803

概念如图 (第 44 分第 50 秒) 所示:零知识证明是指一方 (证明者) 向另一方 (验证者) 证明一个陈述是正确的,而无需透露除该陈述是正确的外的任何信息。

例如:要证明一个账户是我的,只需要我给出私钥就行。但私钥不能直接泄露,所以就给出由私钥产生的签名,假设对方是知道这个账户的公钥的,那么就可以验证签名的正确性。这是不是一个零知识证明其实是有争议的,因为我给出了私钥之外的其他信息,具体算不算要看应用场合。

image-20211214112530927

同态隐藏:

零知识证明的数学基础是同态隐藏。
如图 (第 48 分第 25 秒) 是同态隐藏的性质。
第一个性质说明加密函数值 E 不会出现碰撞,这跟哈希函数有所不同,哈希函数是可能出现碰撞的。这个性质反过来说明如果 E (x) 和 E (y) 是相等的,那么 x、y 也是相等的。(该语句是上面语句的逆否命题)

第二个性质说明加密函数是不可逆的,知道加密后的值,没办法推出加密前的值。

第三个性质是最重要的,叫作同态运算。它说的是对加密之后的函数值进行某些代数运算,等价于对这些输入直接进行代数运算然后再加密。
同态加法:加密值的和等于和的加密。
同态乘法:加密值的乘积等于积的加密。

image-20211214112716684

举一个例子:如图所示 Alice 想要向 Bob 证明她知道一组数 x 和 y 使得 x+y=7,
同时不让 Bob 知道 x 和 y 的具体数值。

image-20211214112830095

简单的解答版本如图
・Alice 把 E (x) 和 E (y) 的数值发给 Bob
・Bob 通过收到的 E (x) 和 E (y) 计算出 E (x+y) 的值 (利用了性质 3)
・Bob 同时计算 E (7) 的值,如果 E (x+y)=E (7),那么验证通过,否则验证失败。

Bob 可以用蛮力算法,一个一个试而计算出 x 和 y 的值,因此 Alice 要对 x 和 y 的值做一些随机化处理,保证 x 和 y 加起来还是不变的。

不考虑去中心化的前提下,前面在讲 double spending 时讲过,要对每一个数字货币进行编号就能防止 double spending。回到这节课讲的隐私保护问题,央行是什么都知道的,那么有没有什么办法让央行做中心化的记账检测 double spending,又不让它知道呢?即虚拟货币的编号不能是央行产生的,改成自己产生的,又不会被篡改掉。

image-20211214113029493

这里就要用到盲签方法。如图。
・用户 A 提供 SerialNum,银行在不知道 SerialNum 的情况下返回签名 Token,减少 A 的存款
・用户 A 把 SerialNum 和 Token 交给 B 完成交易
・用户 B 拿 SerialNum 和 Token 给银行验证银行验证通过,增加 B 的存款
・银行无法把 A 和 B 联系起来
・中心化

解读如下:
・用户 A 提供序号,银行进行签名但此时看不到序号的内容,A 要取钱所以银行要减少 A 的存款。
・A 给 B 转账交易的时候把序号和签名给 B,这个时候序号是明文,B 是可以看到序号的具体内容的。
・B 把序号和签名给银行验证,这个时候序号也是明文,这一步验证的目的是检测 double spending。
这样设计的好处是:银行不知道 B 的币是从哪来的。

零币和零钞 (它们也是加密货币,跟比特币是一类属性):

比特币在很大程度上提供了匿名性,但它不能完全消除关联性,那么我们能不能设计一种新的加密货币,这个货币从一开始的结构设计上就用了密码学的原理保证了匿名性,所以就有了零币和零钞。

image-20211214113129974

如图零币和零钞
・零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证。
・零币 (zerocoin) 系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务。
・零钞 (zerocash) 系统使用 zk-SNARKs 协议,不依赖一种基础币,区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行。

这是专门为匿名性设计的加密货币。
零币中存在基础币 (比如比特币) 和零币。用的时候要证明本来是有一个基础币,让基础币变得不能花费 (unspendable),然后换取一个零币,零币在花的时候只需要用零知识证明你花掉的币是系统中存在的某一个合法的币就行了,但是不用透露你花的是系统中具体的哪一个币。这是跟比特币的一个本质区别,比特币是每一笔转账交易都要说明币的来源。这样才能证明花的币的真实性不是凭空捏造出来的。
但零币和零钞不是这样,零币和零钞是说证明的时候可以从数据上保证你花的币是以前区块链上某个合法存在的币,但不知道具体是哪个。这样的话就把关联性破坏掉了,就没法追溯了。

零钞没有基础币,是完全的零币。零钞和零币也不是 100% 匿名安全的,在影响匿名安全的因素中依然有一个因素无法解决,就是与实体发生交互的时候。比如有人想拿这些币干坏事,把很大的金额转换成这种加密货币的时候,或者是把这些加密货币转换成现金的时候,仍然要暴露身份。这些加密货币数学上设计的再好,只是说对已经在区块链当中的转账有匿名性,跟外界交互的匿名性仍然是一个弱点。所以它依然无法提供 100% 的匿名。

参考笔记:

  1. 区块链笔记在我主页
  2. sam_nau