比特币分叉

分叉

一条链变成了两条链。

原因

分叉可能是多种原因造成的

一种原因是两个节点差不多同时挖到了区块,这个时候两个节点都可以发布区块,就出现了一个临时性的分叉,这种分叉叫state fork。分叉攻击也属于state fork ,也是属于对比特币区块的当前状态产生了分歧,只不过分叉攻击的分歧是故意造成的,所以分叉攻击造成的分叉也叫deliberate fork 。

除此之外,比特币协议发生了改变也会造成分叉,要修改协议需要软件升级,在一个去中心化的系统里,升级软件的时候没有办法保证所有节点同时都升级软件,我们假设大部分节点升级了软件,少部分节点因为种种原因没有升级,这种情况导致的分叉叫做protocd fork。根据对协议内容修改的不同,又可以进一步分成硬分叉(hard fork)和软分叉(soft fork)。

硬分叉

如果对比特币协议增加新的特性,那些没有升级软件的节点不认可新特性,这个时候就会产生硬分叉,一个例子是比特币的区块大小限制。假如有人发布了软件更新,将区块大小限制从1M→4M,假设大多数节点都更新了,少数节点没有更新,这里的大多数不是按账户数目来算,而是按算力来算,即系统中有大多数hash算力的节点都更新了软件。新节点能挖出最大是4M的区块,但是旧节点不认可大小超过1M的区块,所以旧节点会沿着小区块一直挖下去,新节点大小区块都接受,但旧节点不接受大区块,两者没有达成共识,这样就会出现一个永远的分叉。

软分叉

如果对比特币协议加一些限制,原来合法的交易或者区块在新的协议可能不合法就会引起软分叉。假如有人发布更新将区块大小变成0.5M,大部分节点更新了软件,少部分没有更新。这时候新节点沿着一条链挖小区块,不认可大区块,旧节点沿着一条链挖大区块,同时旧节点也认可小区块,因为新节点算力更强,所以更快形成一条新旧节点都认可的最长合法链,但是新节点不会在旧节点产出的大区块后面继续挖,而是会继续分叉挖小区块,所以旧节点挖出的大区块最后都没用了,不得不更新软件。

软硬分叉的区别就是
掌握大多数算力的新节点认可旧节点挖出的区块,但旧节点不认可新节点挖出的区块,那么就是硬分叉;
掌握大多数算力的新节点不认可旧节点挖出的区块,但是旧节点认可新节点挖出的区块,那么就是软分叉。

实际当中出现软分叉的情况之一是给某些目前协议中没有规定的域增加新的含义,赋予新的规则,如coinbase域,将前8字节作为extra nonce,但是剩下的字节都没有被使用。有人提出剩下的字节用来存UTXO的根hash值,那么新节点不认可旧节点挖出的区块,而旧节点认可新节点,因为coinbase写啥都无所谓,这样就会出现软分叉。

比特币历史上有名的软分叉例子是P2SH,这个功能最初没有,是后来通过软分叉加进来的。支付的时候不是付给一个public key hash(也就是输出脚本不是给出收款人公钥hash),而是付给一个redeem script hash(赎回脚本的hash),具体流程参考前文。对于旧节点来说,他不知道这个P2SH这个特性,他只会验证赎回脚本是否正确,新节点才会做第二阶段的验证,所以旧节点认为合法的交易,新节点可能认为非法,新节点认为合法的交易旧节点也认可

发布了45 篇原创文章 · 获赞 8 · 访问量 1800

猜你喜欢

转载自blog.csdn.net/weixin_43888039/article/details/103874097