BCH分叉在即,重放保护与分离BSV你必须要了解

replay-050817-79b61b33eac00b6a.jpeg

2018年11月15日,BitcoinCash从版本0.17硬分叉升级到0.18时候,出现了另外一个与0.18不兼容的版本BitcoinSV,但是这个版本没有添加重放保护,号称要以算力战的方式用BitcoinSV替换BitcoinABC 0.18。算力战的问题这里暂且不谈,只说重放保护的问题以及如何分离BCH和BSV。


关于重放保护的相关问题


1. 什么是重放保护?

重放保护,就是让交易只在当前链中有效,并且在其它链中无效。通常在一条链分裂成两条链时,为了让两条链的交易互不影响,需要在生成交易信息的时候,加入不同的标识或者使用不同的交易结构,这样,另一条链的矿工就会验证该交易无效,从而不打包该交易。

2.添加重放保护的一方,有什么影响?

目前来看,添加重放保护的一方,是处于劣势的,因为该举动意味着放弃了另一方的所有生态。2017年8月1号BCH分叉时,主动添加重放保护,只能重新建立自己的相关应用,从0开始。

但是,添加重放保护,是能上交易所的基本条件。虽然不添加重放保护,交易所也可以把两种分离,但是交易所要花费很多精力和技术去做这些事。技术差的交易所,会因为账务混乱,无法支持。除非这种币有很大的用户群,否则交易所不愿意花费高成本去支持这种币。

3. BCH每年两次的硬分叉升级,为什么不添加重放保护?

BCH的硬分叉升级是为了升级(本来是升级,不知道谁取名字叫硬分叉),不是为了分叉,和ETH一样,全节点客户端都需要升级,否则就无法同步区块,但是轻钱包却不用升级。如果升级时添加重放保护,意味着之前所有的BCH轻钱包或者一些服务都不能使用,这些生态都需要同时升级,对生态的影响非常严重。(并不是所有的硬分叉升级,轻钱包都不需要修改的,区块链系统在升级的时候,尽量避免修改与构造交易相关的修改,否则就要作相关兼容,不然就需要很多生态一起升级,费时费力,用户体验也不好)。

4.BCH和BTC分叉时,是如何添加重放保护的?

2017年8月1号BCH分叉时,主动添加了重放保护,简单的说,就是在交易签名的数据中,添加了SIGHASH_FORKID=0x40这个数据(详情https://github.com/Bitcoin-ABC/bitcoin-abc/blob/master/doc/abc/replay-protected-sighash.md)。 BSV如果要添加重放保护,只要把0x40改为其它值就可以了。

5. ETC和ETH分叉时,没有重放保护,造成了什么样的问题?

ETC的出生,是让人未意料到的,从ETC到ETH,是一次硬分叉升级,没有重放保护,但是仍有人坚持挖ETC原链,由于ETC的难度调整很快,所以ETC活了下来,并且有了价值(BCH 的0.15版,也活了下来,但是由于没有主流交易所支持,可以认为是没有价值的)。但是由于大家都没有做好准备,特别是交易所,被重放攻击了。重放攻击,对于有价值的币有意义,对于没有价值的币,是没有意义的,因为你攻击得到的币,是没有价值的。

6. 如何重放攻击?

大部分影响下,没有重放保护的两种币,在转帐的时候,发送其中的一种币,另一种币也会同时发送。重放攻击,就是利用这个漏洞,在接收币的时候,同时获取另外一种币。重放攻击一般对交易所进行攻击。
例如:

在ETC分叉的初期,没有重放保护,交易所以为ETC不会出现,也没有做分离处理,用户在提取ETH的时候,同时也收到了ETC,然后用户自已把ETH和ETC分离,向交易所充值ETH,再提出ETH,这样就多收到了ETC。


如何分离没有重放保护的BSV?


1. 分离两种币的一些基本准备工作

想要分离两种币,前提是两种币都有算力,并且都能出块。如果11.15以后BSV不出块,那么也不可能分离了。

为验证这两种币是否分离成功了,你需要两种币的区块链浏览器进行查询,但是现在还没有BSV区块链浏览器。

另一个验证的办法,就是同时准备BCH钱包和BSV钱包,并且把同一个私钥或者相同协议的助记词导入到这两个钱包中。目前,BSV没有轻钱包,唯一的全节点客户端只能在Linux系统运行,并且没有界面。

下图是BSV全节点客户端的操作截图:

36698e3922c474fd79953f6196cc28ed_G4ZTMKRUHE3A.jpg



2. 分离两种币的一些方法

两种区块链币分叉以后,如果没有专门的重放保护,大部分情况交易信息是完全一样的,如果想分离,就需要让一笔交易在一条链上打包,在另一条链上不打包。如果自己有矿池,那么就会有很多手段,例如,矿池自己构造交易,直接打包,不广播,那么,这些交易就不会在另一条链上存在。另外,构造一些特殊交易,例如利用BCH新的操作码构造交易,也可以让交易只在BCH链上打包,在BSV链不打包。但是这两种方法对用户的要求太高,因为普通用户没有矿池,又不是高手,自己不能构造交易。下面介绍两种方法,可以让普通用户都可以操作。

3. INPUT污染法

向你的BCH钱包转入一笔分离后的BCH当作污染源,然后把钱包中的所有币一分不留的全部转向另一个地址,转移成功后,会发现BSV钱包中的币并没有转走,两种币分离成功。

这个方法的分离原理,要从比特币的转账原理说起。

6ffbe071e83d5f9666db3c78690b0ea4_GEYDENBKGE2TA.jpg


上图这笔交易由2个输入转账到一个输出。这两个输入必须同时存在,矿池才会验证通过,并打包进区块。如果输入1只存在BCH区块链中,那么BSV矿池就会拒绝收录这笔交易。操作的时要求用户一分不留的全部转走,就是为了让那笔当作污染源的输入能够包括在交易中,否则就会分离失败。

这个方法要求首先有一笔分离后的BCH,才能把其它的BCH和BSV分离开。这些币可以是矿池新挖出来的币,也可以是别人分离后转给你的币。我会在分离BCH后,给大家发送BCH,以便大家分离。

4. 区块不同步确认法

此方法用到两个特性:


BCH的零确认有个特点,就是未确认的交易,最多只能发送26次。

BCH和BSV挖矿出块不同步。



我们可以利用这两个特点分离BCH和BSV。


这个方法操作相对复杂一些,并需要试很多次,还要花费一些BCH或BSV,需要准备BCH钱包和BSV钱包,把同一个私钥导入到BCH钱包和BSV钱包。

我们仍然操作BCH(因为BCH的工具比较多,钱包多)。向BCH钱包转入大约0.01个BCH,不要太多,此时,BCH钱包和BSV钱包都会收到这0.01个币。

快速把这些币转账到原来的地址,连续操作26次以上(越快越好,最好在5分钟能操作完成,否则要试很多次),等钱包提示错误不能再操作为止。如果你的钱包不允许零确认26次,那就需要换个钱包。如果你会用程序生成交易,那最好不过了。

等未确认的交易达到26次以后,等待BCH网络和BSV网络出块。如果BCH网络先出块,那么再发一笔BCH交易,此时BCH网络会收录这笔交易,BSV网络因为超过26次零确认,会拒绝你的交易,分离成功。如果BSV网络先出块,那么用BSV钱包再发一笔交易,同样原理,也可以分离BCH和BSV。




作者:区块链展望与观察

0 个评论

要回复文章请先登录注册