区块链学习笔记9——BTC分叉

区块链学习笔记9——BTC分叉

state fork:由于对区块链当前状态有意见分歧而导致的分叉,几乎同时产生两个区块插入到链中
forking attack: 属于state fork,这个意见分歧是故意造成的

Protocol fork:对比特币协议产生分歧,用不同版本的协议造成的分叉
根据协议修改内容的不同可以分为hard fork和soft fork

hard fork(硬分叉)

什么情况会出现硬分叉?
对比特币协议增加新协议,扩展新功能,未升级软件的旧节点会不认可这些修改,会认为这些特性是非法的。这也就是对比特币协议内容产生分歧,从而导致分叉。硬分叉的一个典型例子,就是对比特币区块大小的修改(之前有提到过,BTC区块大小限制1MB,但是否合适存在争议)。

在BTC系统中,区块大小最大为1MB,可以包含的交易最大数量为4000笔左右。而一个区块产生大概需要10min左右,也就是说,整个比特币系统,平均每10分钟最多只能处理4000笔交易(平均每秒7笔交易),相比目前银行等金融机构每秒数十万数百万的交易量来说,根本不在一个数量级上,严重影响吞吐率和交易处理(即上链)时间(因为交易太多,无法写入只能等待下一个区块,一等平均就是十分钟)。

所以,有人便认为可以增大区块大小,使得一个区块中可以包含的交易数量增多,在此,我们假设将区块大小从1MB增大至4MB。

假设大多数结点都更新到了4MB,少数结点没更新,(这里的大多数是根据算力来看的不是根据账户的数量)。即:新节点认为区块大小最大4MB,旧节点认为区块大小最大1MB,且新节点占据大多数。

区块链学习笔记9——BTC分叉_第1张图片
假设1为当前区块链,此时软件更新,有一个新节点挖出了一个区块如2。但对于旧节点来说,该区块为一个非法区块,旧节点不会对其认可,从而,旧节点仍然从其前一个区块开始挖矿,如3.
需要注意的是,旧节点挖出的区块,新节点是认可的(并未超过4MB限制),所以对旧节点来说,3中下面的链才是合法链,而对新节点来说,这两条链都是合法的链。因为新节点算力强,所以出现4中情况可能性大。对于新节点来说,上面的为最长合法链,新节点便都会沿着上面的链继续挖;对于旧节点来说,上面的链无论多么长,都是一条非法链,不会认可该链,所以旧节点就会沿着下面的链继续挖矿。

此时,就出现了新节点永远沿着上面的链挖矿,旧节点永远沿着下面的链挖矿,由于新节点算力足够强,所以形成两条永远都在延伸且平行的链。当然,上面的链,也有可能会挖出大小在1MB内的小区块,但对旧节点来说,该链上存在非法区块,不会认可该链。可见,这种分叉是永久性的。只要这部分旧节点永远不更新软件,下面的链便永远不会消失。

1.BTC社区中有些人很保守,不愿意加大区块大小 2.区块大小并非越大越好,在网络篇中提到,比特币网络传输为flooding的方式,对带宽的消耗是很大的,带宽是瓶颈。 3.单纯增加区块大小,对交易数量的增加远不能达到数量级的提升。

出现hard fork后,便变成了两条平行的链,也就造成了社区分裂。社区中有一部分人,会认为下面的链才是”正统“(根正苗红),各个链上的货币独立。

实际上,这个事情真正出现过。后续会介绍以太坊,以太坊历史上的一件大事就是硬分叉事件。以太坊称为ETH,但目前看到的ETH已经不是最初的ETH了,以太坊在历史上发生过硬分叉,另一个链称为ETC(和过高速公路那个ETC可半毛钱关系都没有呀)。实际上,ETC才是以太坊设计原本的协议,而ETH是黑客攻击ETH上一个智能合约THE DAO后进行回滚的协议链(将黑客攻击偷取的以太币采用硬分叉方式回滚回到另一智能合约,然后退还给真正拥有者)。
但是这次硬分叉的后果,由于有人不愿意这么做,造成了以太坊社区的分裂。实际上,虽然ETC不如ETH又名,但实际它也是目前一种主流货币。
分叉之初,由于两个链分叉造成了互相影响,产生了很多麻烦。比如:在ETH链上有一笔转账B->C,有人便在ETC链上回放,将ETC链上的货币页转给了C(C收到两笔钱)。后来,对两条链各添加了一个chainID,将两个链区分开,才使得这两条链真正分开。

soft fork(软分叉)

如果对BTC协议添加限制,使得原本合法交易在新交易中不合法,便会形成软分叉。

假设有人发布一个软件更新将区块大小把1MB转为0.5MB(实际中不会这么做,1MB已经足够小了)

此时还是把节点分为新节点和旧节点,新节点认为是0.5MB,旧节点认为是1MB

区块链学习笔记9——BTC分叉_第2张图片
假设1为初始的区块链,新节点开始挖小的区块如2,这个区块旧节点也是认可的,也会沿着这个小区块挖矿,如3。
但是新节点会认为该旧节点挖出区块超过0.5MB限制,为一个非法区块,不会认可该区块,会从其前一个小区块开始挖矿。如4所示
此时旧节点因为也认可新节点,所以它又会按照最长合法链向下挖,最终会造成5中的效果(绿色大节点为旧节点),旧节点挖出的区块一直被抛弃,无法得到出块奖励(不在最长合法链上)。这就倒逼旧节点升级软件,最终会实现区块链上的所有矿工共同认可新协议,实现软件协议的升级。

实际中可能出现软分叉的情况

给某些目前协议中没有规定的域赋予新的含义或规则。

  • coinbase域
    有人便提出将其作为UTXO集合的根哈希值。目前UTXO是全节点自己在本地为了方便查询自行维护的,但UTXO内容并未写入区块链(还记得Merkle proof吗?Merkle proof用于验证某个交易是否在区块中,Merkle proof的交易信息是写入区块链的。)
    如果账户要查询余额,可以查找账户在UTXO里输出一共收到多少个币,如果是全结点的话可以算出来,但是很多比特币钱包不可能在手机上维护一个完整的区块链,实际上是一个轻节点,如果查询某账户余额,轻节点便需要询问全节点,全节点根据UTXO中信息可以计算得到账户余额,但如何确保全节点给的数据可信?
    有人提议把UTXO集合中的内容也组织成一棵Merkle tree,将其根哈希值写在coinbase域中,(如果改block header的话动静太大,coinbase域正好没人用),改这个域的内容,最后会改到block header中的根哈希值,这样就可以通过Merkle proof证明出来了。
    可以看到,旧节点认可新节点的区块,因为旧节点不管你写的内容,但新节点对于旧节点CoinBase域检查时候,发行并没有这个UTXO的根哈希值,不会认可其发布的区块,所以这是软分叉。
  • P2SH
    这个功能在最初是没有的,是后来通过软分叉加进去的
    对于旧节点只会做第一阶段的验证,新节点才会做第二阶段的验证,所以旧节点认为合法的交易新节点可能认为是非法的,新节点认为合法的交易,旧节点一定认为是合法的

总结

  • soft fork:只要系统中拥有半数算力以上的结点更新了软件,系统就不会出现永久的分叉
  • hard fork:必须所有节点都更新了软件,系统才不会出现永久性的分叉,如果有小部分结点不愿意更新,系统就分成了两条链

你可能感兴趣的:(区块链)