好好聊聊区块链分叉

in blockchain •  4 years ago 

比特币价格飙升


这段时间,比特币价格持续上涨。前几天单个比特币的价格突破17000美金,全球投资者显得比较激动,下面这张图或许能够说明一些问题。

图片

关于近期比特币价格大幅上涨的原因,外界众说纷纭,有些描述就和图片中展示地一样,妖魔化比特币的现象非常常见。我看到比较靠谱的说法是CNBC主持人凯特·鲁尼(Kate Rooney)在节目中的介绍。

有分析师称一些知名投资人如斯坦利·德鲁肯米勒(Stanley Druckenmiller)、比尔·米勒(Bill Miller)和保罗·都铎·琼斯(Paul Tudor Jones)等买入加密货币增加了普通投资者对比特币的信心。买入比特币很大程度上是为了对冲通货膨胀风险,如果美元继续贬值且走势渐趋不稳,投资者会转而持有比特币、黄金等资产。

有分析师称一些知名投资人如斯坦利·德鲁肯米勒(Stanley Druckenmiller)、比尔·米勒(Bill Miller)和保罗·都铎·琼斯(Paul Tudor Jones)等买入加密货币增加了普通投资者对比特币的信心。买入比特币很大程度上是为了对冲通货膨胀风险,如果美元继续贬值且走势渐趋不稳,投资者会转而持有比特币、黄金等资产。

此外,自11月12日起消费者可在Paypal上购买比特币,一定程度上解决了比特币的实用性问题,让其投资更加主流化,并融入到日常支付场景中。

最后,新冠疫情促进了数字经济快速发展,数字货币在此背景下可能受到更多投资者的青睐。(来源:财新数据通)

我们可以看到,网络上谈论比特币的人变多了,这是比特币价格大幅上涨必然会产生的现象。

比特币分叉


言归正传,我不怎么关注比特币价格,我关注的是区块链背后的一些机制,区块链分叉现象就是我认为值得去学习的东西。那么,什么是分叉呢?

简单来说,区块链分叉就是从一条主链变成多条链的过程。

以比特币为例,因为比特币是由区块链构成的去中心化的加密货币,所以比特币是有可能出现分叉的。随着比特币网络中挖矿的人越来越多 ,典型的情况是:有两个节点很有可能会同时挖到矿。那么这两个节点就同时获得了发布区块的权利,如果他们在很短时间内都发布了区块,那么最长合法链后面就会有两个合法区块,这时比特币就会出现短暂的分叉。学界把这种由于对比特币最长合法链当前状态的意见分歧(分叉)现象称之为state fork。

另一种分叉是人为故意造成地分叉,我在《比特币挖矿有多难?》这篇文章中的“调整难度”部分提到过的分叉攻击行为,指的就是这种类型的分叉。这种人为造成的分叉也属于state fork,因为本质上人为造成地分叉也是对比特币最长合法链当前状态的意见分歧,学界把这种类型的分叉称之为protocol fork(或者deliberate fork)。

还有一种分叉是比特币协议不同步造成的,比如要修改比特币使用的协议是需要升级软件的,但是像比特币这样一个去中心化的系统中,没有办法保证系统中的所有节点同时都升级软件,因为系统中的某些节点可能会由于各种原因没有升级软件,常见的原因有条件限制无法升级以及不同意协议修改而拒绝升级。相应地,学界把这种由于对比特币使用的协议有分歧意见产生地分叉现象称之为protocol fork。

需要注意的是,根据对协议修改地内容不同,学界进一步把protocol fork分为:hard fork(硬分叉)和 soft fork(软分叉)。

硬分叉


假设需要对比特币的现行协议做一些升级以适应当前的运行状态,这时候比特币网络中就会出现有些节点升级软件(新节点)而有些节点没有升级软件(旧节点)。理所当然的是,那些没有升级软件的节点就会认为当前的协议升级是非法的,他们是不会认可这些由于升级带来的新特性或新功能的。这种情况就会导致新节点会根据升级后的协议去产生新区块,而旧节点仍然会按照原来的协议产生旧区块;于是,分叉现象出现了。

硬分叉的典型案例就是区块大小限制。

我们需要知道的是,比特币现行的区块大小是1M字节。简单计算一下1M ≈ 1000000 bytes,一个交易大约需要 250 bytes,所以一个区块大概可以写 1000000 / 250 = 4000 笔交易。而比特币网络是10 mins左右产出一个区块,那么比特币网络处理交易的速度就应该是 4000 / 60 *10 ≈ 7 tx/s。换句话说,在比特币网络中,一秒钟大概能处理7笔交易。而传统的银行、电商网站每秒能处理的交易量远远不止这个量级,大家想想每年的双十一就知道了,每秒处理的都是上十万上百万的交易量,当然有些人就认为这个效率太低了。因为区块大小只有1M,一旦交易量激增,有些交易必然不能及时写到当前区块中而必须等下一个区块产生,这一等就至少10 mins,所以那些人就提议扩大比特币的区块大小。

比如,那些提议扩大比特币区块大小的人中,有人发布了一个比特币的升级协议,他把比特币区块大小限制从1M扩大为4M。假设比特币网络中的大多数节点都升级了协议,只有少部分节点不同意接受新协议,这会出现什么情况?

请看图:

图片

从1号区块开始,大部分节点都已经完成了协议升级,所以,这些节点发布的区块就是更大的那些,就像2号区块。后续的节点如果也升级了协议,就会按照2号区块继续往后挖,变成2->3->4这条链。但是还有部分节点没有升级协议,他们就不会沿着2号区块往后挖,并且不管2号区块后面有多少区块,他们仍然会从1号区块往后挖,因为他们认为2号区块已经上非法的了。

有意思的是,当1->6->7这条链形成后,发布新曲块的那些节点是认可的;原因很简单,升级的新协议不能推翻旧协议。又因为大部分节点升级了协议,所以具有更多算力的节点们挖出新区块的速度更快,很快就会使得1->2->3->4变成最大合法链。而且有时候这条链上有可能也会混进来一些旧区块,但都于事无补,旧节点仍然不会认可。

这样一来,分叉就出现了,并且是永久性的。在这种情况下,形成的两条链大部分算力都是承认的,这就是学界称之为硬分叉的现象。

硬分叉出现后,图中的上下两条链在不同的节点看来就都是最长合法链。这会导致社区分裂,因为大家都是各自沿着各自认为的最长合法链继续往后挖,所以原来的一种加密货币就会形成两种加密货币。数字货币中最著名的案例莫过于以太坊的硬分叉了,我们现在知道以太坊经过硬分叉之后形成了ETH 和ETC 两种加密货币,实际上ETC才是原来的ETH,现在的ETH是硬分叉之后形成的新加密货币。

软分叉


软分叉也是由于对比特币协议产生分歧而发生的分叉现象。我们还拿比特币区块大小做例说明,如果有人认为现行的区块1M 已经很大了,他发布了一个新协议把区块大小限制称0.5M(实际上不可能发生,1M 其实已经很小了),而且大部分节点都升级协议同意了这种修改。又会出现什么情况?

还是请看图:

图片

从1号区块开始,大部分节点升级了协议,开始挖出的区块都是更小的那些,例如2号区块。然后升级后的节点挖出的区块形成1->2->3->4这条链,旧节点没有升级协议,但是也认可这条链,因为0.5M的大小限制并没有超过1M。只不过,这些旧节点挖出的区块一开始可能是9号区块,不同的是,升级协议后的新节点并不认可9号区块(按照新协议,区块大小不能超过0.5M),新节点自然就会沿着2号区块往后挖。旧节点看到新节点一直沿着上面那条小区块链往后挖,而他本身又是认可的,这时候他会主动在新的这条最长合法链继续往后挖大区块,就像8号区块那样。再一次,新节点不认可8号区块,他们仍然会继续在5号区块后面拓展最长合法链…周而复始。

最终,我们可以看到图中的9号、10号以及8号区块都会变成非法区块,因为他们不在最长合法链上面,而且比特币的最长合法链始终都是一条。换句话说,软分叉造成的分叉现象只是暂时的。

实际来看,可能产生软分叉现象的情况是给现行协议中没有使用的阈增加一些新的含义,比如coinbase阈。

比特币网络中有一种特殊交易称之为coinbase(铸币)交易,其中的coinbase阈之前是没有用到的。随着比特币网络的不断运行,参与挖矿的节点越来越多,为了加大挖矿难度,这个coinbase阈中的前8个字节就用来扩充block header里面的输入了。

而coinbase阈不只有8 bytes,它还有很多字节空间。有些人就想把后面的这些空间也利用起来,干什么呢?用来证明比特币网络中钱包的余额正确性,因为在现行的比特币协议中使用的钱包(也就是所谓的轻节点应用)是没法证明余额的,轻节点并不维护UTXO集合,钱包应用并不知道你的比特币到底花没花过。如果将UTXO集合也组织成一个market tree写到coinbase阈的某个空间,那么当这个空间内容发生变化时,它的market tree的根哈希值也会发生变化,最终导致全节点中的market tree的根哈希值也会发生变化。如果变化后的根哈希值,所有节点也能验证通过,这就可以知道大家的比特币钱包中的资金流向了(具体挖矿过程请参见《比特币挖矿有多难?》 )。

上述两个例子都是软分叉现象,因为不管coinbase阈中的内容发生什么变化,旧节点是认可的,但是旧节点发布的区块中的coinbase阈如果还是没有变化,那么新节点是不认可的。

比特币历史上著名的软分叉的例子就是:P2SH (Pay to Script Hash)。

简单来说,原来的比特币协议验证交易合法性只进行一次验证,而 P2SH 功能通过软分叉加入比特币协议之后,对比特币网络中的交易就会进行两次验证。旧节点对于新节点验证通过的交易仍然是认可的,新节点对于旧节点验证通过的交易可能是不认可的,因为交易可能在第二部分验证不通过。

以上,就是学界称之为区块链的软分叉现象了。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!