区块链(三)

发布时间 2023-09-13 14:36:39作者: 筱倩

1. BTC——分叉

(1)state fork:如果两个区块差不多同一个时间点挖到了区块,会出现一个临时性的分叉

(2)分叉攻击forking attack,又叫deliberate fork

(3)protocal fork:协议发生改变也会造成分叉,要修改协议需要进行软件升级。在一个去中心化的系统里,升级软件时没办法保证所有节点同时都升级(来不及或不支持)。根据对协议修改内容的不同,可以分为:硬分叉、软分叉

  • 硬分叉(hard fork):如果对比特币系统添加一些新特性/扩展功能,那些没有升级软件的旧节点不认可新特性,就属于对比特币协议的内容有分歧。必须要是所有节点都更新,才不会分叉。

  • 【硬分叉典例:区块大小限制】比特币系统规定的大致是每秒钟处理7笔交易,还可能造成延时。假设有人发布了更新:1M->4M,假设系统中拥有哈希算力的节点大多数都更新了。比特币社区中有些人是比较保守的,部分人就不同意,而且区块的大小也不是越大越好(比特币系统底层传播主要采用flooding的方式,所以对带宽的消耗很大)。
  • 【硬分叉典例:以太坊】ETH、ETC,两条链各加一个chain ID
  • 软分叉(soft fork):假设有人发布一个软件更新,把区块大小变小了(1M->0.5M),旧节点如果不更新软件的话,可能会有很多白挖的。(新节点发布的内容旧节点是认的)不会有永久性的分叉

  • 【软分叉典例:coinbase】前8个字节可以作为extra nonce,扩充搜索空间。有人提出让其作为UTXO的根哈希值。把UTXO集合的内容组织成Merkle Tree,算出根哈希值写在coinbase的某个域里,coinbase域的内容本身也会算到block header里的哈希值,这样就可以用Merkle proof证出来了。
  • 【软分叉典例:P2SH】这个功能在最初的比特币系统中是没有的,是通过软分叉得到的。支付的时候,不是付给一个public key的哈希,而是付给一个赎回脚本的哈希(redeem script)。

(4)问答:

  • 问:转账交易的时候如果接收者不在线怎么办?

  答:不用接收者在线,因为只要把这笔交易记录在区块链上即可

  • 问:假设某个全节点收到一个转账交易,有没有可能转账交易中接收者的收款地址是这个节点以前从没有听说过的?

  答:比特币在产生一个账户的时候是不用通知其他人的,在本地产生一对公私钥对,只有在以后产生了首款地址,第一次收到钱的时候,其他节点才知道这个账户的存在。

  • 问:如果账户的私钥丢失了怎么办?

  答:没有办法,账户上的钱就永远取不出了。

【PS】我们也可以去交易所登记账户,保存私钥,或者。但是保存在这些地方并不比自己保管安全。

  • 问:如果私钥泄露了怎么办?账户上出现了可疑的交易怎么办?

  答:尽快把钱转到安全的账户上。公私钥对产生后是没办法改的,也没办法冻结,只能新生成一个账户。

  • 问:如果转账的时候写错了地址怎么办?

  答:可以和对方联系,没有办法强迫。不存在的地址:digital commitment。

  • 问:Proof of Burn,OP_RETURN,实际当中是怎么操作的?

  答:当一个全节点收到一个转账交易的时候,他首先要检查这个交易的合法性,只有合法的交易才会被写入区块链。OP_RETURN是写在当前交易的输出脚本中的,验证当前交易合法性的时候不会执行这个语句。什么时候执行?有人要花这笔钱的时候,才会执行这个交易的输出脚本。

  • 问:挖矿的时候会不会有矿工偷其他矿工的发布的nonce?(怎么知道是哪个矿工最先找到的nonce)

  答:发布的区块里有一个coinbase tx,里面有一个收款人的地址,是挖到矿的矿工的地址。如果要偷答案的话,要把矿工的地址改变,这样coinbase tx的内容就会发生改变,会导致Merkle Tree的根哈希值发生变化,这样原来找到的nonce就作废了。

  • 问:交易费可以看作是发布一个交易的时候,给矿工的小费。那么事先怎么知道哪个矿工会挖到矿?

  答:事先不需要知道。交易费计算方法:total inputs > total output,差额就是交易费。

 2.BTC——匿名性

(1)匿名性破坏

  • 一个人可能生成多个地址账户,但是这些地址账户有可能被关联起来
  • 资金的转入和转出。这个地址账户和你在现实社会中的真实身份也可能产生关联:你最开始获得比特币可能是在某个交易所,会登记注册你的信息。(怎么防范用比特币进行洗钱呢?盯住资金的转入转出链。)
  • 比特币做支付的时候。定位某人的消费记录,然后根据消费记录可以推测你的行动轨迹。(不同的账户之间可能有关联,另一个是你的账户和实体世界的真实身份也可以建立关联)

(2)实际使用中的匿名性

  • 中本聪的匿名性保持得最好。
  • 非法网站Silk road(eBay for illegal grugs),为了逃避司法部门的监管,它使用的就是比特币,底层用的是洋葱路由TOR。运行了两三年后被查封了。

(3)hide your identity from whom?

  • 网络层怎么提高匿名性?
  • 应用层怎么实现匿名性?
    • 专门的应用coin mixing,把你的身份和周围的人混在一起,但是也没有信誉很高的。
    • 有些应用本身带coin mixing 的性质,比如在线钱包,需要很多人把比特币存入钱包里,但它并不保证要履行coin mixing 的功能。
    • 交易所一般来说是有种天然的coin mixing的特性。

(4)比特币系统的公开性和不可篡改性对于隐私保护来说是灾难性的,因为如果有一次不小心暴露了隐私的话,这个消息就会永久留在区块链中。

(5)零知识证明

  • 定义:一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确的之外的任何信息
  • (不一定算零知识证明,因为泄露了签名)例子:如果这个比特币账户是我的,要证明我知道它的私钥,但又不能把私钥告诉别人,进行签名,假设你知道这个账户的公钥,你就可以验证这个私钥的正确性。

(6)同态隐藏

  •  是零知识证明的数学基础。
  • 性质1:如果x,y不同,那么它们的加密函数值E(x)和E(y)也不相同。(与哈希不同,哈希可能产生碰撞)反过来说明:如果两个加密函数值是相等的,那么x=y
  • 性质2:给定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(性质2:不可逆性)
    • Bob通过收到的E(x)和E(y)计算出E(x+y)的值(性质3
    • Bob同时计算E(7)的值,如果E(x+y)=E(7),那么验证通过,否则失败。(性质1
    • 【缺陷】Bob可以用蛮力算法套出x、y的值

(7)盲签:让央行做中心化的记账,监测double spending,又不让它知道具体内容呢?编号由自己产生,不告诉央行。

  • 用户A提供SerialNum,银行在不知道SerialNum的情况下返回签名Token,减少A的存款
  • 用户A把SerialNum和Token交给B完成交易
  • 用户B拿SerialNum和Token给银行验证,银行验证通过,增加B的存款(银行不知道这笔钱是哪里来的)
  • 银行无法把A和B关联起来

(8)零币和零钞

  • 零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证
  • 零币(zerocoin)系统中存在基础币和零币,通过基础币和零币的来回转换,消除就地址和新地址的关联性,其原理类似于混币服务。
  • 【PS】零币和比特币不同:比特币必须要指出币的来源,零币只需要证明自己是一个合法的币即可
  • 零钞(zerocash)系统使用zk-SNARKs协议,不依赖一种基础比,区块链中hi记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不现实交易金额,所有交易通过零知识验证的方式进行。

3.BTC——比特币引发的思考

(1)指针只在本地有意义,一旦传到其他的计算机上就失效了。区块链上的哈希指针是怎么传播的呢?

  • 哈希指针只是一个说法(逻辑上的指针),实际上只有哈希没有指针。那怎么记录前一个节点呢?
  • 全节点一般是把区块存储在key、value数据库里。key:区块的哈希,value:区块的内容。常用的key、value数据库为levelDB。区块链这种链表结构实际上是在levelDB里面的,用哈希值来串起来的,只要掌握了最后一个区块的哈希值,那么通过levelDB查询哈希值key对应的value,就可以把最后一个区块的内容取出来,这个区块头又有指向前一个区块的哈希值。一步一步往前找,能把整个区块链找出来。

(2)区块链

  • 截断私钥,降低了账户的安全性。比特币系统中账户的安全性和私钥的长度是相关的,为什么要用256位的私钥?因为这个长度的私钥用暴力破解的方法不可行,计算量太大,不可能成功。
  • 对于多个人的共享账户,不要用截断私钥的方法,而应该用多重签名(每一个私钥都是独立产生的)。
  • 如果俩人分手了,那他们当初买的币将永久存在UTXO中,对矿工是不友好的。

(3)分布式共识

  • 为什么比特币系统能绕过分布式共识中的那些不可能结论?严格上说,比特币并没有取得真正意义上的共识,因为共识随时可能被推翻,比如出现分叉攻击。按照分布式系统理论的要求,共识一旦达成就不应更改了。
  • 理论上有些不可能成立的结论只是在某个特定的模型下,现实生活中把模型改一改,这时候结论就有可能成立。

(4)比特币的稀缺性

  • 如果这个货币的总量定死了,那么它就不适合做货币。

(5)量子计算