# 155期【币圈人物】 北大肖臻比特币的分叉 2022 **Published by:** [币同学](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/) **Published on:** 2022-04-17 **URL:** https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/155-2022 ## Content 你好,我是币同学。这是我分享学习的第155天,每天学习进步一点点。 关键词:北大肖臻老师的公开课,关于比特币系统的分叉。 1. 分叉(fork):原来是一条链,现在是分成了两条链。 2. 分叉的原因: 2.1如果有两个节点,差不多同时挖到矿,这时两个节点都可以发布区块,这就会出现临时性的分叉(state fork)【由于对比特币区块链当前的状态产生意见分歧,而导致的分叉】,分叉攻击(fork attack)也属于分叉,只是这个分叉攻击是人为造成的; 2.2比特币的协议发生了改变,比如软件升级,但没有办法保证所有的节点同时都升级软件。 根于对协议修改的内容的不同,分叉又可分为硬分叉(hard fork)和软分叉(soft fork)。 3. 硬分叉(hard fork) 如果对比特币协议增加一些新的特性,扩展些新的功能。这时没有升级软件的旧的节点,他们是不认可这些新特性的,认为这些特性是非法的,这时会属于对比特币协议的内容产生分歧,就会导致分叉。 硬分叉的例子:比特币中的区块大小的限制(block size limt)。 比特币规定每个区块最多是1M字节,1M字节就是100万字节,一个交易差不多250个字节,1000000/250≈4000个交易/区块 平均10分钟出一个区块,4000/10*60≈7笔/秒 假设有人发布一个软件更新,将区块大小1M增加到4M,假设大多数节点更新该软件,少数节点没有更新。这里说的大多数节点和少数节点,不是按照账户数目来计算的,是按照算力计算的,也就是系统中拥有了大多数哈希算力的节点,更新了该软件。如下图大多数新节点,是认可分叉后的大区块,其他节点会沿着该大区块(上面)挖。 只有少数的旧节点,不认可分叉后的大区块链,会沿着挖小区块(下面)挖。 新节点会认为上下两条链都是合法的,但是上面的链是最长合法链,会沿着大区块链继续挖。而且因为这部分的节点,算力足够多,会使上面的链变得越来越长。 对于旧节点,他们认为下面的链是合法的。上面的链,无论有多长,都是没用的,因为是非法的链,他们会沿着下面挖。 如上图,出现硬分叉后,原来的区块链就变成了两条平行运行的链,彼此的链都有各自的加密货币。 比如在硬分叉前区块链的记录的交易,如果不采取些措施的话,这两条链之间互相会有些影响。两条链上,除了协议不同,私钥和账户都一样,账户余额应该是分开的。但是在上面的链,有一笔转账交易,有的人会把该交易在下面的链进行回放。 为解决该问题,这两条链各带一个Chain ID,把两条链区分开来,变成两条独立的区块链。 这样的分叉(硬分叉),是永久性的。只要这一小部分的节点,不更新软件(区块大小增加到4M),上述分叉就不会消失。 【注意:比特币区块的大小,由于带宽消耗的限制,不是越大越好。】 4. 软分叉(soft fork) 如果对比特币协议加一些限制,原来合法的交易/区块,在新的协议中有可能是非法的,有可能是合法的,引起软分叉。 假设有人发布了一个软件更新,把比特币1M的区块大小变小了,从1M变成0.5M。如下图新节点不认大区块,新节点认为下面1M的区块链是非法的。按照比特币协议,我要扩展的是最长合法链。所以新节点会沿着上面0.5M的小区块链上挖。 这时旧节点挖出来的1M的区块链,也是认0.5M上面的小区块链。所以旧节点看到新节点0.5M区块的链变成最长合法链,会放弃他当前所在的分叉,切换到上面的链。 这就是软分叉,因为是临时性的。因为1M的旧节点,如果不更新软件的话,他们挖的区块,可能就白挖了。而且就算他们切换到上面的链,还可能挖出1M的区块,而新节点是不认的,那么挖到的区块也白挖了。 5. 实际当中,可能出现软分叉的情况: 一个情况就是,给某些目前协议中没有规定的阈,增加些新的含义,赋予它新的规则。 例子coinbase阈,每个发布的区块里,有一个铸币交易里(coinbase transaction),有一个coinbase阈。这个阈没有规定用来干什么,没人检查。 挖矿的时候,要调整区块头部的随机数(nonce)---只有4个字节。调整的区间,最多是2的32次方,搜索空间不够大。 所以实际中,我们可以把coinbase前8个字节,也用来做extra nonce。 两个合在一起,就可以变成2的96次方。目前的挖矿难度来说,已经足够了。 6. 总结 硬分叉(hard fork):只要系统中拥有半数以上算力的节点,更新了软件,那么系统就不会出现永久性的分叉。可能有些临时性的分叉,但是不会有永久性的分叉。 软分叉(soft fork):必须是所有的节点,都要更新软件,系统才能出现永久性的分叉。如果有小部分节点不愿意更新,那么系统就会分成两条链。 今天就学习到这里,明天见。 ## Publication Information - [币同学](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/): Publication homepage - [All Posts](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818): Subscribe to updates