Loading

北大肖臻《区块链技术与应用》学习笔记7

BTC-匿名性 (Bitcoin and anonymity)

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

  • BTC中破坏匿名性的几种情况

    • 每次收款都使用一个新的地址,这样可以有不同的地址,没人知道哪些是属于你的,看起来匿名性很强,但是实际上这些地址是可以被关联到一起的。因为比特币交易允许有多个输入多个输出,假设一笔交易中,一个账户的余额不足以支付一件商品,两个地址同时支付;输出时,有多个输出,其中就有可能存在一个找零的输出地址。通过如上方法就能将输入地址和输出地址关联起来
  • Silk Road eBdy illegal drugs 比特币中的匿名性具有局限性,在于你不想像谁暴露身份(hide your identity from whom),对于不想让亲朋好友知道,是能够实现的;对于进行违法活动,是起不了作用。

  • 比特币用户提高个人的匿名性方法。因为比特币系统时运行与应用层(application layer)的,底层是(network layer),所以从这两方面入手

    • 网络层解决方法:多路径转发。跟洋葱路由(TOR)一样的原理。即信息不是由发出者直接发送给接收者,中间要进过很多次转发中间的每一个节点,只知道它的上一个节点是谁,但并不知道最早发出消息的人是谁。当然中间一些节点可能是坏的,但路径上只要有一个节点是诚实的,就能够把最初发起人的身份隐藏起来。这也是洋葱路由的基本原理。
    • 应用层解决方法:把不同人的币混在一起(coin mixing)。即把你的身份跟别人的身份混在一起,让别人分不清楚谁是谁。不光是区块链,在其他各个需要匿名的领域都能用到。有一些专门做coin mixing的网站,提供一定的服务收取一定的服务费。所有想做coin mixing的人把币发给网站,网站内部进行一些重组,然后你再把币取回来,这时取出的币就不是发布到网站上的币了,它是随机抽取一些币给你(但是除了应用本身自带的coin mixing属性外,单独的提供高信誉coin mixing服务是不存在的;且设计漏洞会导致存入数额推断出身份)
  • 保护隐私性难度大的原因

    区块链是公开的,而且是不可篡改的。不可篡改性对于隐私保护来说是灾难性的

  • 零知识证明

    零知识证明是指一方(证明者)想另一方(验证者)证明一个陈述是正确的,而无需透露该陈述是正确的任何信息

  • 同态隐藏

    • 如果x,y不同,那么他们的加密函数值E(x)和E(y)也不同(如果E(x)和E(y)是相等的,那么x、y也是相等的

    • 给定E(x)的值,很难反推出x的值

    • 给定E(x)和E(y)的值,我们可以很容易地计算出某些关于x,y的加密函数值

      • 同态加法:通过E(x)和E(y)计算出E(x+y)的值
      • 同态乘法:通过E(x)和E(y)计算出E(xy)的值
      • 扩展到多项式
    • 举个例子

      Alice想要向Bob证明她知道一组数x和y使得x+y=7,
      同时不让Bob知道x和y的具体数值。

      简单的解答
      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加起来还是不变的

  • 盲签方法(虚拟货币的编号不能是央行产生的,改成自己产生的,又不会被篡改掉)

    • 用户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的币是从哪来的。
  • 零币和零钞(这个货币从一开始的结构设计上就用了密码学的原理保证了匿名性)

    • 零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证

    • 零币(zerocoin )系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务

    • 零钞(zerocash)系统使用zk-SNARKs协议,不依赖一种基础币,区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行

    • 这是专门为匿名性设计的加密货币。零币中存在基础币(比如比特币)和零币。用的时候要证明本来是有一个基础币,让基础币变得不能花费(unspendable),然后换取一个零币,零币在花的时候只需要用零知识证明你花掉的币是系统中存在的某一个合法的币就行了,但是不用透露你花的是系统中具体的哪一个币。

      这是跟比特币的一个本质区别,比特币是每一笔转账交易都要说明币的来源。这样才能证明花的币的真实性不是凭空捏造出来的。但零币和零钞不是这样,零币和零钞是说证明的时候可以从数据上保证你花的币是以前区块链上某个合法存在的币,但不知道具体是哪个。这样的话就把关联性破坏掉了,就没法追溯了。

    • 零钞和零币也不是100%匿名安全,因为要与实体发生交互时,仍然会暴露身份

问题思考

  • 哈希指针

    指针保存的是本地内存的地址,那么只是在本地这台计算机上才有意义,发送到其他计算机上就没有意义了。而网络进行传输的哈希指针只是一种形象的说法。而为了找到前一个区块的内容全节点一般是把这些区块存储在一个(key,value)数据库里面。key是区块的哈希,value就是区块的内容。一个常用的key value数据库是level DB。所谓的区块链这种链表结构实际上是在level DB里面用哈希值算出来的。只要你掌握了最后一个区块的哈希值,那么你通过level DB的查找,哈希值key对应的value就可以把最后一个区块的内容取出来。然后这个区块块头里面,又有指向前一个区块的哈希值。那么再去查找key和value,可以找到前一个区块的内容,以此类推,一步一步往前找,最终能够把整个区块链都找出来。在实际系统当中,所谓的哈希指针,只有哈希,没有指针,或者也可以认为哈希值的本身就是指针。有一些节点没有保存完整的区块链的信息,只保存了最近的几千个区块,如果需要用到前面的区块的信息可以问其他的全节点要。哈希指针的性质保证了整个区块链的内容是不可篡改的

  • 区块恋

    把一个私钥分成几份,有几个人各自保管,只有最终大家都拿出自己的部分私钥,才能合成完整的私钥。这样存在的问题是:这些人中任何一个人把私钥丢了钱就取不出来了(类似于ultisig 多重签名)。还有更大一个问题:这种截断私钥的做法会降低账户的安全性。因为比特币系统中每个账户的安全性跟所用的私钥的长度是相关的。用256位的私钥是因为这个长度的私钥用暴力破解的方法是不可行的。在区块恋例子中,如果一对情侣分手了,那么他们的比特币将永久的保存在UTXO里面,这对矿工是不友好的。矿工是不知道这笔钱永远取不出来的,所以矿工要把这笔钱永久的保存在UTXO里面,造成这个集合的膨胀

  • 分布式共识

    从理论上实现分布式系统的共识是不可能的,但是实际实践中怎么绕过了分布式共识中的那些不可能结论。严格来说,比特币并没有取得真正意义上的共识,因为取得的共识随时有可能被推翻,比如出现了分叉攻击。你以为已经取得了一个共识,分叉攻击后系统会回滚到前一个状态,从理论上说甚至有可能回滚到创世纪块。按照分布式系统理论的要求,共识一旦达成之后,就不应该再改了,所以从这方面来说比特币并没有绕过分布式系统那些不可能的结论,因为它并没有达到真正意义上的共识。这说明理论和实际往往是有区别的。很多理论上的不可能结论对于实际当中是并不适用的,因为这种不可能结论只是对某种特定的模型下是不可能的,实际当中把模型稍微改一改不可能结论就不成立了

  • 比特币的稀缺性

    矿工挖矿的原因是为了获得收益,挖矿的收益要大于开销才是有利可图的。要吸引别人来挖矿,要么增加挖矿的收益,要么降低挖矿开销。任何一个新发行的加密货币,都有一个能启动的问题。早期为了吸引矿工来挖矿,可以给矿工更多的收益

    • 比特币的做法是:①早期难度设置的比较低。②早期的出块奖励比较高。实际上,比特币这种总量恒定的性质是不适合用来做货币的。因为稀缺的东西是不适合用来做货币的,通货膨胀会导致钱变得更不值钱了,但一个好的货币是要有通货膨胀的功能的
  • 量子计算:

    随着量子计算的发展,量子计算机计算力变得越来越强大,不一定会影响加密货币的安全。量子计算技术离实用还有很长一段距离,在比特币的有生之年不一定能产生实质性的联系。如果量子计算在将来能强大到破坏加密体系的话,首先会冲击的是传统金融业

    比特币当中没有把账户的公钥直接暴露出来,而是用公钥取哈希之后得到一个地址。比特币当中用的非对称加密体系,从私钥是可以推导出公钥的。所以只要把私钥保管好,公钥其实丢了也没有关系。从公钥显然是不能推出私钥的,假设将来量子计算技术发达到能够从公钥中推出私钥,比特币在设计的时候又加了一层保护,没有用公钥本身,而是用公钥的哈希。所以如果有人想偷你账户上的钱的话,首先是要用地址推导出你的公钥,相当于把公钥的哈希值进行逆运算,而这一点即使是用量子计算机也是没有办法完成的

    安全起见,一个地址用过之后就不要再用了,每次取钱最好把钱一次取走,即使取不完,也最好把钱转给另一个安全的账户

  • 加密和取哈希

    这是两个不同性质的操作,加密的目的是为了将来能够解密,所以加密算法要保证信息的完整性,加密过程是不能丢失信息的,这样解密的时候才能够还原原来的输入。但是取哈希的过程一般是会造成信息的损失的,哈希函数一般都是不可逆的,因为有些信息在取哈希的过程中就已经丢失了

    比特币系统中用的哈希算法是SHA-256,算出的哈希值是256位,无论输入有多大,即使有几个T,算出来的哈希值也是256位。这样的运算过程显然是不可逆的。如果可逆那可就变成了一个超级压缩算法

posted @ 2021-07-31 10:27  潜仁  阅读(254)  评论(0)    收藏  举报