主页 > imtoken钱包地址 > 使用相同的forkid反重放保护并不能防止区块链分裂——深度解读BCH 11月15日
使用相同的forkid反重放保护并不能防止区块链分裂——深度解读BCH 11月15日
第0章介绍
在11月15日的BCH协议升级中台湾比特币交易合法吗,由于出现了竞争的升级版本——bitcoin abc 0.18.2和bitcoinsv 0.1,将会有潜在的分裂。 但是SV的支持者一直强调这两个版本使用的是同一个forkid,所以彼此没有anti-replay保护,所以不会split。 这是错误的,本文解释了原因。
第一章什么是forkid
比特币(BTC和BCH)的每一笔交易都有签名,(也有不需要签名的,我们不关心这些细节)。 签名就是这样一个东西:有一个消息(mes),有一个公钥(pub),公钥对应一个私钥(pri)。 签名是使用私钥(pri)对信息(mes)使用特定的算法生成签名结果Sig(pri,mes)。 其他人为了验证签名,使用算法带入签名结果sig和公钥pub来验证ver(sig,pub)。 验证结果为真或假。
通常每笔比特币交易都有一个签名,以证明发送交易的人有权使用比特币。 这个签名是使用发送者的私钥(pri)。 用于签名的信息更加复杂。 一般会包括交易版本、预哈希、输出、金额……大概10项,我们记录为mes。 签名是 Sig(pri, mes)。 我们将对这个私钥和信息进行签名的过程称为签名算法。
交易发出后,钱包,尤其是挖矿节点会对交易进行验证,必须验证上述签名结果,必须使用发送方的公钥(pub)和签名信息(mes)进行验证. ver(sig, pub),如果验证通过,则交易合法。
forkid就是对签名信息做一些改动,生成不同的签名算法。
签名算法不同,签名的结果必然不同。
当区块链分裂时,如果两条链上的签名算法不同,一条链上签名的交易结果在另一条链上肯定是不合法的。 这可以防止用户在一个链上发送交易并意外地将它们发送到另一条链上。 这就是反重放保护(稍后会介绍什么是事务重放)。
因此,forkid的使用就是在区块链可能发生分裂之前,改变至少一条链上的交易签名信息,从而改变签名算法,使得任何一条链上的交易在另一条链上都是非法的。
第二章 什么是事务重放和重放保护
首先,很明显重放攻击根本不是攻击。 币圈流传的各种关于重放攻击的言论未免有些危言耸听。
重放攻击,这里的“攻击”不是别人对你发起的某种侵略或盗窃。 这是因为比特币区块链分裂后的两条支链地址、私钥和交易格式相同。 你在分裂点之前的币会在分裂后被两条链自动识别。
如果在区块链分裂后在任何一条链上发起交易,则该交易将在两条链上均有效。 这意味着你发送了两笔交易,这里的另一笔是“重播”。
让我用一个类比来解释这一点。 国军退守台湾后,蒋公在台湾复制了大陆的许多机构。 例如,清华大学在台湾成立。 而在大陆的北京,也有一所清华大学。
如果你给美国的清华大学写信,你用的是纸,让邮递员送信。 但是收件人地址只写着“XXX, Tsinghua University, China”
这个地址可以理解为北京的清华大学或者台湾的清华大学。 现在邮递员有事了,他干脆抄了你的信,寄给了两所大学。
这是重放攻击。 因为本来只想发到台湾的清华,现在又重播到北京的清华。
所谓重放保护就是想办法让你发送的交易只在一条链上有效,在另一条链上无效。 因此可以避免“重播”。
使用不同的 forkids 是一种重播保护。 不同的 forkids 可以使交易只在一条链上合法而在另一条链上非法。 这种方式需要开发者在开发全节点时部署不同的forkids,是一种非常彻底的重放保护方式。 还有其他方法可以做到这一点。
重放保护有多种方法。 但本文不着重于此。 我们回到为什么 forkid 无法避免区块链分裂。
第 3 章区块链分裂
区块链的分裂是因为一群矿工在出块的时候,对于什么是合法区块的判断出现了不同的派别。 只要矿工不能就区块的有效性达成统一共识,区块链就处于分裂状态。
一波矿工(矿工组1)发现全网产生了新的区块后,会下载并验证该区块。 如果验证后发现是非法区块,他们将丢弃该区块并继续在原来的区域工作。 在区块高度挖矿。 如果另一波矿工(矿工组2)认为这个新区块是一个合法区块,那么这波矿工就会把算力砍到这个区块作为新的区块高度进行挖矿。 此时矿工组1和矿工组2会分裂,区块链也会随之分裂。
区块链分裂经常发生,分裂可能是网络延迟造成的,一般是暂时的,比如几秒内,或者一个区块的时间内。 协议版本不同造成的分裂往往需要更长时间,有可能通过算力大战达成共识,或者分裂时间较长。
11 月 15 日的 BCH 协议升级过程产生了两个相互竞争的协议版本,bitcoin abc 0.18.2 和 bitcoinsv 0.1。 这两个版本定义的块有效性规则是不同的。 分别用这两个软件挖矿的矿工肯定会分裂,BCH区块链也会分裂。 直到矿工全部统一为一个版本,分裂才会结束。 在从分裂到统一的过程中,难免会出现一波矿工将挖出的区块全部丢弃的浪潮,代价极其惨重。
abc版本中定义的区块中的交易排序使用规范交易排序(CTOR),而sv版本使用拓扑交易排序(TTOR)。 我们不需要知道CTOR和TTOR具体的技术细节,只需要知道这是两个不兼容的排序规范即可。 挖出 CTOR 区块的矿工不能识别 TTOR 区块,反之亦然。 这就是为什么台湾比特币交易合法吗,只要BCH矿工在11月15日不能就采用abc还是sv版本达成共识,只要分裂成两个矿工群体,那么BCH就必然分裂。
这种区块链分裂与交易在两条链上是否合法无关。
第四章交易和区块
区块链分裂时,会出现互不合法的区块,但可以打包同一笔交易。
如果区块链分裂后,两条链采用相同的forkid,即交易的签名规则相同。 因为分裂产生了两条链,两条链都继承了原链的所有UTXO。 那么如果同一个 UTXO 以相同的签名规则进行签名,则发出的交易将同时合法存在于两条链上。 这是事务重放。
此时我们要知道,同一个forkid根本无法阻止区块链分裂。
第五章BCH会在11月15日分叉吗?
只要BCH矿工无法在11月15日就采用abc还是sv版本达成共识,只要分裂成两个矿工群体,那么BCH就必然分裂。
分裂就是一条链分成两条链,一币分为两币。
至于这种分裂状态是不是暂时的,算力大战会对分裂状态造成什么样的影响,那就是分裂之后的事情了。
算力之争可能会迫使其中一条分链上的所有矿工放弃这条链,转而挖另一条链。 如果实现了这一点,分裂状态将结束,他们将返回到第一条链。
如果算力大战迫使其中一条链改变算法,则意味着这条链失去了原有矿工的所有支持,矿工只能在另一条链上挖矿。 这也是矿工们对区块合法性的共识。 分裂状态也结束了。 但是这一端也会产生另外一种币和另外一条链,只是这条新链的矿工不同而已。 但是,改变算法的可能性比较低。
第六章结论
希望这次双方认真对待算力之争,最好能在限定时间内达成共识,把分裂控制在暂时的分裂状态,输了就认输。
今天卖脐橙