『学概念找员外』比特币通过分叉还可以更改哪些特性
世界上没有绝对完美的东西,比特币也不例外,虽然它现在看起来依旧是如此的多金,但仍然无法完全遮盖住它的一些缺陷,有些能忍就忍了,有些则不行,要想改变这些缺陷,总是很艰难的,所以就引出了软分叉和硬分叉。
硬分叉
分叉其实就是通过在比特币协议中,修订协议然后引入新的特性,这可能会使前一版本的协议失效,也就是可能会被顶替掉。即运行新版协议的节点认定为有效的区块,会被运行旧版协议的节点认定为无效。因为谁也不能确保每个节点都会更新协议,所以只能假定大部分节点已经升级为新节点,但还有部分老节点节点没有升级,所以很快最长的那个区块链分支里包含的某些区块会被老节点认定为无效区块,因此老节点会认为其他的分支才是最长、有效的区块链分支,并一直扩展这个分支,直到它们更新了版本,因为在这个分支中,所有新节点认为有效的区块都会被排除在外。这种改变就是硬分叉了,它使得原先的链从此分裂了。网络上的所有节点会根据其所运行的协议版本去扩展两条不同的区块链,当然,这两个分叉再也不会合并。那些老节点只要不更新版本,就被永远地排除在了另一条链之外,这是比特币社区所不能接受的。
软分叉
另一种修订是加入新的特性,让现有的核验规则更加严格。那样老的节点依然会接收所有的区块,而新的节点会拒绝一些。这样的改变叫作软分叉,这可以避免硬分叉所造成的永久分裂。
如果引入可以产生软分叉的新版协议,运行新版协议的节点会使用一些更严格的规则,现在假定绝大部分节点都更新了新版协议并执行新的规则,这是产生软分叉的关键,因为老节点不会执行新规则,新节点的数量要足够多才能够竞争最长的链。这种情况下,老节点可能会挖到一些无效的区块,因为这些区块中包含一些在新规则下无法核验通过的交易,然后老节点会知道它们核验有效的区块不被别的节点接受,这使得老节点的矿工会去更新协议。而且如果新节点用它们的区块扩展了老节点的分支,那么老节点也会转而扩展这个分支,原因是新节点核验通过的区块,老节点也必定能核验通过。这样就没有硬分叉了,只是会有很多临时的小型分叉而已。
通过分叉还可以更改哪些特性?
之前员外说到的支付给脚本的哈希值就是软分叉的一个经典例子。第一版比特币协议里并没有P2SH,P2SH之所以造成软分叉,是因为对老节点而言,一个有效的P2SH交易也可以核验通过,它只验证这个哈希值跟前一笔交易输出哈希值是不是一样而已,它并不知道还要进一步检验脚本是否合法。所以依赖新版节点去进行这项核验:脚本本身真的可以获取到前一个交易输出的币。
P2SH是成功的,也许添加新的密码算法也可以通过软分叉实现。当然也可以通过软分叉在元数据的币基参数中添加更多的信息实现,币基参数可以是任何数值,但未来或许可以限定币基参数的格式。已经有人提出可以在币基参数里放入一个梅克尔树根,其中包含所有未被消费的比特币的信息。这种做法只会造成软分叉,因为老节点核验通过的区块,在新节点上可能无法核验通过。但随着区块链的延长,很快老版本就会转而去扩展最长的区块链分支。其他的一些改变可能就会产生硬分叉了,比如在比特币里添加新的功能操作代码、改变区块大小和交易规模,甚至其他一些修复性的改动。比如之前提到过MULTISIG
指令存在一个缺陷,它会推送给堆栈一个莫名其妙的值,要修复这个缺陷,也会产生硬分叉。这就是为什么尽管这个缺陷很烦人,但也一直没有修复,因为和硬分叉相比,保留一个缺陷还是可以忍受的。有些修订非常有意义,但比特币环境想要硬分叉也算是极其艰难了。虽然许多优秀想法都在其他的竞争币中得到了测试而且成功运行,因为那些竞争币系统是从头开始建立的,硬分叉不会产生严重的后果。