重放攻击是什么?
这里的“攻击”,不是别人对用户发起的某种侵略或偷盗行为,而是因为比特币区块链分裂后的两条分支链都有相同的地址、私钥和交易格式。用户在分裂点前的币,会自动被分裂后的两条链都承认。
如果用户使用分裂点前的币发起一笔交易,在两条链上这笔交易都会有效。如此,就会显示用户发起了两笔交易,其中一笔就是“重放”。
比如,我国北京有清华大学,台湾地区也有“清华大学”。如果在美国给清华大学写一封信,但收件地址上只写了“中国清华大学某某收”,该收件地址既能解被读为北京的清华大学,也可以解读为台湾地区的“清华大学”。没办法,邮递员只能将信复印一遍,送到两个大学。这就是重放攻击,本来只想寄给北京的清华大学,现在也被送到了台湾地区的“清华大学”。防范重放攻击,就是想办法让用户发出的交易只在一条链上有效,在另一条链上无效,避免重放。
如何防范重放攻击?
一、防范重放攻击的方法
防范重放攻击有两个方法。
一是相信比特币开发者所开发的交易格式是完善了防范重放攻击的代码。也就是说,如果比特币分裂成两条链,任何从分裂点前发出来的交易,都只能在一条链上有效,在另一条链上无效。一笔交易只能在一条链上有效,用户只要在分裂前掌握私钥,把币存在钱包里即可。分裂后,用户分别下载两条链的新钱包,将相同的私钥导入两个钱包,就能获得两种币。
二是让分裂后的两条链上的币“污染”分裂前的币。如果开发者没做好防范重放攻击代码,用户只能自己干。因为分裂后的两条链是相互不兼容的,否则就不叫分裂了。所以,用户完全能从分裂后的两条链上分别买一点币,发到分裂前的地址上,“污染”自己的币。如此,将分裂前的币发送交易时,输入带有了“污染”源,只能在其中一条链上有效。
具体操作也非常简单:分裂前将币存在自己掌握私钥的钱包里;分裂后,去交易所分别买一点比特币和比特币现金,发到地址上;然后,下载一个比特币现金钱包,将私钥导进该钱包。对比特币现金钱包来说,它只能接受到来自分裂后的链上发来的那一点币;对于比特币钱包来说,它也只能接受到来自分裂后的比特币链上的那一点币。这样,两个钱包里的币分别包含了一点来自“未来(分裂后)”的币,导致它们在对方链上都是无效的。如此,用户的币就安全了。
二、防范重放攻击的流程
为了防范重放攻击,用户可以按下列操作流程执行。
第一步,在分裂前,请将自己的币存在自己控制私钥的地址上。比如,使用比太钱包存。使用“导出私钥明文”功能,将私钥抄下来。或者干脆使用比特币钱包存,不需要同步区块也可以。
第二步,为了保险起见,建议一定要存一个只有0.01比特币的地址,这个地址里的币就是用来测试的。
第三步,下载一个比特币现金钱包,是否同步区块并不重要,将上述私钥导入这个钱包。(这个步骤可以在分裂后做,也可以在分裂前做。)
第四步,分裂后,到交易所买0.011个比特币和0.012个比特币现金钱包,一起发到你的地址上就可以了。注意一定要带不一样的小数尾数。
第五步,将你的钱包同步区块,你就会发现,在比特币钱包只能收到0.011个比特币,而比特币现金钱包只能收到0.012个比特币现金。这两笔交易是不能被重放的,因为它们是来自分裂后的区块。这样你的币就被污染了,以后就不可能被重放了。
第六步,为了更加安全,分别将污染的币发到另一个自己控制私钥的地址上。如此操作,即使这笔交易被重放了,因为目标地址的私钥是自己控制的,也会被重放到自己的地址上。
第七步,使用分裂前做好的0.01个比特币的那个钱包来完成测试,然后再将大额钱包做分离。