(补充上文)
(二)有可能出现问题的区块传播
1)新区块传播给旧矿工
类比前文【新交易传播给旧矿工】的例子,当新版本矿工将新版本的交易打包到新版本区块后,新区块发给旧矿工时,旧矿工会发现区块里的交易都没什么问题,毕竟全是正数金额的收币交易,于是会验证通过。(依然是前文的负数收币的例子)
2)旧区块传播给新矿工
上述例子如果反过来,旧版本矿工将旧交易打包到旧版本区块后,旧区块发给新矿工时,如果旧版本区块里一旦有一笔收币地址的金额是负数的交易,那么新版本矿工将拒绝掉这个旧版本区块的。(依然是前文的负数收币的例子)
综合昨天文章以及上述内容,就是“旧版本兼容新内容但新版本不兼容旧内容”的升级方案。
继续昨日未完成的分析,今天主要讲解的是:
交易与区块的“旧版本不兼容新内容并新版本不兼容旧内容”的升级方案。
与上文的分析类似,我们只需要讨论一下交易传播形式中旧交易传播给新矿工、新交易传播给旧矿工、区块传播形式中旧版本区块传播给新版本矿工、新版本区块传播给旧版本矿工,这几种有可能出现问题的传播形式。
(一)有可能出现问题的交易传播
1)新交易传播给旧矿工
新交易如果传播到旧版本矿工那里,由于旧版本是不兼容新版本交易的(本文主要讲解“旧不兼容新并新不兼容旧”升级方案),所以旧版本矿工收到新版本的交易信息后,会拒绝这笔交易。
2)旧交易传播给新矿工
旧交易如果传播到新版本矿工那里,由于新版本矿工是不兼容旧版本交易的(本文主要讲解“旧不兼容新并新不兼容旧”升级方案),所以新版本矿工收到旧版本的交易信息后,会拒绝这笔交易。
(二)有可能出现问题的区块传播
1)新区块传播给旧矿工
新区块如果传播到旧版本矿工那里,由于旧版本是不兼容新版本区块的(本文主要讲解“旧不兼容新并新不兼容旧”升级方案),所以旧版本矿工收到新版本的区块信息后,会拒绝这个区块。
2)旧区块传播给新矿工
旧区块如果传播到新版本矿工那里,由于新版本矿工是不兼容旧版本区块的(本文主要讲解“旧不兼容新并新不兼容旧”升级方案),所以新版本矿工收到旧版本的区块信息后,会拒绝这个区块。
历史上有这种从交易到区块都相互都不兼容的升级案例吗?例子就是大家都知道的比特币的分叉币。从比特币分叉出来的其它数字货币,如果做了重放保护,就都是相互不兼容的了。
比特币一直受网络拥堵的困扰,但不扩大区块大小,并且在大家达成共识后,core团队又毁约,导致比特币在2017年8月1日分叉出比特币现金,也就是BCH。
BCH相对于比特币,想要改变了什么?BCH希望将区块大小从1MB调整为了8MB。从而解决网络拥堵。
分叉的方式是选取要分叉的时间点,也就是区块到达多少高度后,保存之前的所有区块和交易,待分叉币准备好了代码,发布上线后,各个钱包、矿工就可以基于分叉币的链开始工作了。
比如,BCH是当比特币到达478558区块后,保存了从1到478558个区块的所有区块到自己本地服务器并保存好,将这些区块当做自己的区块链上的区块,此时BCH的区块链上是没有钱包打包交易、矿工生成区块的。所以此时BCH的状态类似于停工状态。当BCH团队准备好了代码并发布到网络后,先下载代码的钱包、矿工率先开始工作,于是,BCH的区块链基于这478558个区块,开始运行起来了。所以,理论上BCH区块链链上产生的第一个区块,是第478559个区块。
为了达到重(chong)放保护的目的,BCH将收币交易的锁,修改为与比特币的锁不一样的锁。
重放的意思是,假如比特币和BCH的代码除了1MB和8MB的区别,其余完全一致,那么比特币和BCH是共用同一套私钥、公钥、地址的。假设张三的地址A里有10个BTC,那么在分叉处BCH后,这个地址也同时拥有10个BCH。这时张三给李四转10个BTC,由于没有重放保护,导致张三的10个BCH也同时转给了李四!(为什么分叉后,会同时拥有10个BCH?这个问题以后的文章会提到。)
这是因为交易发起地址、剩余金额、收币地址、加锁解锁条件等等都是相同的,看起来是两个世界,实际上就类似于两个相同的交易在不同的区块链上同步执行而已。
这就会造成用户不必要的损失。为了解决这个问题,BCH将交易签名修改为与比特币完全不一样的规则:SIGHASH_FORKID。这也就是重放保护。
于是,有了重放保护后,再有交易的话,就有了如下的校验情形:
· 当BTC矿工收到BCH交易时,不认识BCH的交易规则,故BTC矿工拒绝BCH交易。(新交易传播给旧矿工)
· 当BCH矿工收到BTC交易时,不认识BTC的交易规则,故BCH矿工拒绝BTC交易。(旧交易传播给新矿工)
· 当BTC矿工收到BCH区块时,虽然区块规则一样,但是在验证区块内的交易信息时,不认识BCH的交易签名规则,故BTC矿工拒绝BCH区块。(新区块传播给旧矿工)
· 当BCH矿工收到BTC区块时,虽然区块规则一样,但是在验证区块内的交易信息时,不认识BTC的交易签名规则,故BCH矿工拒绝BTC区块。(旧区块传播给新矿工)
上述4种情况,都是因为双方认为对方的交易或者区块内的交易为非法交易,导致互相不接受,最终的结果是,形成了两条独立的区块链,互相不会有任何干扰。
所以,任何满足重放保护的分叉币分叉方案,就是“旧版本不兼容新内容并新版本不兼容旧内容”的升级方案。
补充说明:
除了非法交易,合法交易,还有一种交易类型,叫做“非标准交易”。我们将在之后的文章里会提到这种交易类型。
关注【通俗易懂区块链】,学懂区块链
领取专属 10元无门槛券
私享最新 技术干货