63

详解BCH协议竞争:使用相同的forkid防重放保护不能阻止区块链分裂

 5 years ago
source link: https://www.jinse.com/bitcoin/268602.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0 章 引言

BCH在11月15日的协议升级,因为出现相竞争的升级版本——bitcoin abc 0.18.2和bitcoinsv 0.1,所以会出现潜在的分裂。但SV的支持者一直强调这两个版本使用了相同的forkid,所以相互不带防重放保护,所以不会出分裂。这是错的,本文解释为什么。

VJNBVjF.jpg!web

1 章 什么是forkid

比特币(BTC和BCH)的每一笔交易都有一个签名,(也有不需要签名的啊,我们不管这些细节)。签名是这么一回事:有一个信息(mes),有一个公钥(pub),公钥对应一个私钥(pri)。签名就是使用私钥(pri)对信息(mes)使用特定算法来生成一个签名结果Sig(pri,mes)。验证签名就是别人使用算法带入签名结果sig和公钥pub进行验证ver(sig,pub)。验证的结果要么是正确,要么是错误。

通常每一笔比特币交易都有一个签名,以证明发送交易的人是有权限动用这笔币。这个签名就是使用发送者的私钥(pri),签名用的信息比较复杂,一般会交易版本,前置哈希,输出,金额……大约 10 项内容,我们记为 mes 。签名就是 S ig(pri,mes)。我们把这个私钥和信息进行签名的过程称为签名算法。

当交易发出去之后,钱包,特别是挖矿节点会对这笔交易进行验证,其中就要对上述签名结果进行验证,要拿发送者的公钥(pub)和签名信息 (mes )进行验证, ver (sig,pub),通过验证,则交易合法。

forkid就是针对签名信息进行做一些变更,以生成不同的签名算法。

签名算法不同,签名出来的结果肯定是不同的。

在区块链产生分裂时,如果两条链上的签名算法不同,则其中一条链签名出来的交易结果在另外一条链肯定是不合法的。这样就可以阻止用户在一条链上发交易,在另一条链被意外也发出去。这就是防重放保护(一会儿就介绍什么是交易重放)。

所以 forkid 的用法,就是在区块链发生潜在分裂之前,至少在其中一条链上改变交易的签名信息,从而改变签名算法,进而达到任意一条链的交易在另一条链上是不合法的。

2 章 什么是交易重放和重放保护

首先讲明白, 重放攻击其实根本就不是攻击。 目前币圈流传的各种关于重放攻击的言论有点过于危言耸听了。

重放攻击,这里的“攻击”根本就不是别人对你发起的某种侵略或偷盗行为。而是因为比特币区块链分裂后的两个分支链,都有相同的地址、私钥和交易格式。你在分裂点前的币,自动会被分裂后的两条链都承认。

如果区 块链分裂后在任一条链上发起一笔交易,在两条链上这笔交易却都会有效。这就是显得你发了两笔交易,这里的另外一笔,就是“重放”。

我打个比方来解释这个,在国军退守台湾后,蒋公将大陆的很多机构都照样在台湾复制了一遍。比如在台湾也建了清华大学。而在大陆的北京,也是有一个清华大学。

如果你在美国给清华大学写一封信,就是用纸,让邮递员送的那种信。但收件地址上只写了“中国清华大学XXX收”

这个收件地址即可以解读为是北京的清华大学,也可以解读为台湾的清华大学。这下邮递员麻烦了,他干脆将你的信复印一遍,送到两个大学去。

这就是重放攻击。因为本来你只想寄给台湾的清华大学,但现在却被重放到了北京的清华大学。

所谓的重放保护,就是想办法让你发的交易,只在一条链上有效,在另一条链上无效。从而可以避免“重放”。

使用不同的 forkid 就是一种重放保护,不同的forkid可以让一笔交易只在一条链上合法,在另一条链上是非法的。这种方法需要开发者开发完整节点时部署不同的forkid,是非常彻底的重放保护做法。还有其他做法可以做到。

重放保护的做法非常很多。 但本文不重点强调这个。我们回来forkid为什么无法避免区块链分裂。

3 章 区块链分裂

区块链分裂是因为矿工群体生产区块时,对什么是合法的区块的判断分成了不同的派别。只要是矿工无法对区块的合法性达成统一 共识,那区块链就处在分裂状态。

一波矿工(矿工群体 1 )发现了全网产生了一个新块后,就会下载并验证这个块,如果验证过后发生这是一个非法的块,那就会丢弃这个块,继续在原来的区块高度上挖矿。如果有另一波矿工(矿工群体 2 )认为这个新块是合法的块,那这一波矿工就会将算力切到这个块上做为新的区块高度上挖矿。这时矿工群体 1 和矿工群体 2 就产生了分裂,区块链也就会因此产生分裂。

区块链分裂是经常发生的,分裂有可能是因为网络延迟导致的,这一般是临时性的,比如在几秒内,也可能在一个区块的时间左右。因为对协议版本不同而导致的分裂,则时间往往要更长,也可能通过算力战达成统一意见,也可能长期分裂。

BCH在11月15日的协议升级过程,产生了两个相竞争的协议版本,bitcoin abc 0.18.2和bitcoinsv 0.1,这两个版本定义的区块合法性规则是不一样的。分别使用这两个软件进行挖矿的矿工一定会产生分裂,BCH区块链也一定会产生分裂。直到矿工全部统一到一个版本,分裂才会结束。从分裂到统一的过程,其中必然会有一波矿工将自己挖的所有区块,全部抛弃掉,这个代价是无比惨重的。

abc版本中定义的区块里的交易排序使用了规范交易排序(CTOR),而sv版本采用的是拓扑交易排序(TTOR)。我们不需要知道CTOR和TTOR的具体技术细节,我们只需要知道这是两种不相兼容的排序规范。挖CTOR区块的矿工必然不承认TTOR的区块,反之亦然。 这就是为什么,只要在11月15日BCH矿工无法就采用abc还是sv版本达成统一意见,只要分裂成两个矿工群体,那BCH必然分裂。

这种区块链分裂和交易是否在两条链都合法是不相关的。

4 章 交易和区块

在区块链分裂时会出现相互不合法的区块,却可以打包相同的交易。

如果在区块链分裂后,两条链都采用相同的 forkid ,即交易的签名规则是相同的。因为是分裂产生的两条链,所以两条链都继承了原来那条链的所有UTXO。那如果采用相同的签名规则签署相同的UTXO,发出的交易,那就会同时在两条链上合法地存在。这就是交易重放。

到了这里,我们肯定知道了吧, 相同的 forkid 根本无法阻止区块链分裂。

5 章11月15日BCH到底会不会分裂

只要在11月15日BCH矿工无法就采用abc还是sv版本达成统一意见,只要分裂成两个矿工群体,那BCH必然分裂。

分裂就是一条链分成了两条链,一个币分成了两个币。

至于这种分裂状态是不是临时的,大家说的算力战会对分裂状态产生什么样的影响,那都是分裂之后的事。

算力战有可能逼迫其中分裂后的一条链上的矿工全部放弃这条链,改成挖另一条链,如果实现了这样,那分裂状态就结束了,重新回到一条链。

如果算力战逼迫其中一条链改了算法,那就意味着这条链失去了所有的原来的矿工支持,矿工只能到另一条链上挖,这也是矿工对区块的合法性达成了统一意见。分裂状态也结束。但这种结束也会产生另外一个币和另外一条链,只是这条新链的矿工不同了。不过,改算法这事,发生的可能性比较低。

6 章 结束语

我希望这一次双方认真对待算力战,最好在有限时间内,打成共识,把分裂控制在临时性分裂状态,输了就认输。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK