本文主要讲解交易和区块的“旧版本兼容新内容并新版本兼容旧内容”的升级方案。
有人会说,这种应该是最理想最好的升级方案!毕竟双方都互相兼容对方!
实际上,这种方案看似最理想最好,实际上暗藏风险。
我们先继续按照前两篇文章的方式分析,然后再评估为什么暗藏风险。我们只需要分析新旧节点接收旧新数据的问题,即只需要讨论交易传播形式中旧交易传播给新矿工、新交易传播给旧矿工、区块传播形式中旧版本区块传播给新版本矿工、新版本区块传播给旧版本矿工,这4种形式所能发生的问题。
其实现实中这种新旧完全兼容的案例确实有,即ETH和ETC案例。
以太坊在2016年6月17日发生了一起著名的the DAO事件,黑客将以太坊三分之一的币都发送到了他自己的地址中,但由于the DAO的机制,需要一个月的时间才可以二次转移,故留给了以太坊创始人v神及其团队不太多的时间去处理这个事情。由于部分人坚持认为之前的合约是具有契约性,并且去中心化的区块链网络不应该有回滚一说,这笔交易就应该被承认。但是v神以及大部分人都不同意。于是,在2016年7月20日,分叉出了ETH,ETH是从那笔恶意交易所属区块之前的那个区块重新开始生成区块的。而另一拨少数人则坚持不动,坚持了原来那条链,原来的链叫做ETC。
ETH与ETC对比来说,在当时,除了修复了the DAO的bug之外,并没有其它任何修改。这就导致了在分叉成功之后,用户在使用ETH进行交易时,发现自己的ETC也同时被交易出去了。
这就是昨天提到的未做重放保护导致的问题,即,一次交易,将两个币种的币都交易出去了。
这也就是今天主要讲的升级方案,即,分叉升级后,ETH交易仍然被ETC矿工承认、ETC交易仍然被ETH矿工承认、ETH区块仍然被ETC矿工承认、ETC区块仍然被ETH矿工承认。
大家互相承认对方的交易、区块没问题,于是由于ETH、ETC的私钥、公钥、地址、交易记录都是一模一样的,导致用户在发生一笔交易时,维护ETC的节点认为用户是要发起ETC交易、维护ETH的节点认为用户是要发起ETH交易,这就引发了这个重复交易的问题。因为分明已经是两个币种了,一次交易理论上是不应该联动两个币种的交易的。
这就是新旧相互兼容所带来的风险。这种风险是一定要杜绝的,因为会莫名损失用户的币。
所以,才有了前文提到的“重放保护”,即,将其中一个币种的签名规则修改为与另一种不一样的规则,这样,在各方校验交易时,由于都不认识对方的规则,所以都不认可对方的交易;即使在验证区块时,也由于区块里的交易签名规则不正确,也会拒绝对应的区块。这样的话,就不会发生上述所说的“一笔交易会触发多个币的同时交易”这样的事情了。
这就是相互兼容的升级方案。
在这里顺便提一下第4种升级方案:交易和区块的“旧版本不兼容新内容但新版本兼容旧内容”的升级方案,这种方案本身并不具有实际意义,所以并不存在。
补充说明:
实际上,除了这几篇文章提到的这4种升级方案,还有其它的升级方案。
我们之前一直在讨论交易和区块同时满足“新旧节点是否兼容”的方案(维度分为:交易区块维度、钱包新旧版本维度、矿工新旧版本维度、是否兼容维度)。其实,将交易和区块拆分开分析,那么就会有4种可能性:
· 交易验证通过并且区块验证通过
· 交易验证通过并且区块验证不通过
· 交易验证不通过并且区块验证通过
· 交易验证不通过并且区块验证不通过
我们需要知道的是,交易检验如果没问题,那么区块检验也一定会通过,一定不会不通过;交易检验如果不通过,区块检验可能会拒绝,也可能不会拒绝。
我们会发现,“交易验证通过并且区块验证通过”、“交易验证不通过并且区块验证不通过”这两个方案,是交易和区块同时满足是否验证通过的方案,之前几篇文章已经论述过。
“交易验证通过并且区块验证不通过”这个方案,在交易验证通过的情况下,并不会出现区块验证不通过的情况,所以此种情况可以不用论述。
目前只剩下一种情况,即,交易验证不通过的情况下,区块还仍然能验证通过。
实际上到底有没有这种情况?其实是有的。我们明天的文章中会详细讲述。
关注【通俗易懂区块链】,学懂区块链
领取专属 10元无门槛券
私享最新 技术干货