【区块链科普】BCH分叉在即,不懂重放攻击可能损失惨重!
如果你是一名经历过某次大型分叉(比如ETH分叉为ETH和ETC、BCH分叉为BCH ABC和BCH SV)的老韭菜,那你应该听说过重放攻击。
没听过也没关系,正好BCH分叉在即,今天CoinEx Wallet科普课堂就和大家聊聊重放攻击。
互联网的重放攻击
重放攻击并不是区块链世界的专有术语,传统互联网中同样存在重放攻击,引用一下百度百科的解释:
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
简化一下:重放攻击是把一段正确且已经被接收过的信息再发一次,互联网世界的重放攻击一般用在身份认证过程。
如果觉得这个解释还是很抽象,不妨想像成特工类电影中一个常见场景:詹姆斯邦德跟踪某个工作人员,通过窃取他的指纹或通行证进入某个秘密基地。
工作人员的指纹或通行证就是“正确且被接收过的信息”,詹姆斯邦德通过重放这个信息完成攻击。
区块链的重放攻击
区块链和互联网的重放攻击不是一个概念,除了同样是把一段信息发送两次外,没有太多相似之处。
区块链的重放攻击基本只发生在硬分叉后——当一条链分叉为两条链后,如果两条新链的地址、私钥、签名规则、交易格式都相同,就存在重放攻击的可能性。
攻击者只要将在A链上收到的交易信息原封不动在链B上再请求一次,由于信息正确,这笔交易在B链上同样会被发起并确认。
举个例子,TX某天宣布对原先的Q币链进行分叉,Q币将分叉成Q币和欢乐豆。李四在分叉前拥有100枚Q币,因此在分叉后他拥有了100枚Q币和100枚欢乐豆。
分叉后,李四的朋友张三向李四购买100枚Q币,李四在收到钱后就将100枚Q币发送到张三的地址。结果,李四发现不止是Q币余额变为0,自己的欢乐豆余额也被清零。
原来,法外狂徒张三利用重放攻击,将李四向张三发送100枚Q币的交易请求在欢乐豆链上重放了一次,由于信息正确,这笔交易也被欢乐豆链确认。通过这种方式,张三偷走了李四100枚欢乐豆。
图片来源于网络
不要以为这只是段子,BCH分叉为BCH ABC和BCH SV时网络单日重放攻击数量高达数百万次。
图片来源于PeckShield
别害怕,币圈的黑客也没有那么多,数百万次攻击中大多数属于自动重放,即系统由于无法识别用户发出的交易专属于哪一条链,自动在两条链上都发起交易并确认。但这也意味着,即使对方不作恶,你的币也有可能“自己长腿”跑了。
很多小白用户以为只要把币放在支持分叉的钱包就可以获得两种新币种。殊不知,如果不注意防范重放攻击,即使变成两种币,也有可能竹篮打水一场空。
如何避免重放攻击
避免重放攻击最简单的方式就是让交易在A链上生效,但在B链上无效。为了实现这一点,首先我们要了解比特币交易的运作模式。
比特币采用的是UTXO模型,UTXO是未花费余额的英文缩写。关于UTXO和比特币交易模型,我们在《【区块链科普】从没有什么比特币,有的只是UTXO》中曾为大家进行详细介绍,这里我们只简述两个主要特征:
特征1:一个比特币地址内的余额由一笔或多笔UTXO组成。
假设一个地址内余额有100 BTC,这100个BTC不一定是一个完整的UTXO,有可能是由一笔50 BTC和五笔10 BTC的UTXO组合而成。
类比现实世界中的现金,假设你的钱包里有100元,既可以是一张百元大钞,也可以是一张50元和五张10元钞票。
特征2:当我们进行转账交易等操作时,需要从钱包中选择某个或者某几个UTXO作为交易的输入消耗掉并生成新的UTXO。
依旧类比现实世界中的现金,如果我们手头有一张100元、一张50元和两张20元钞票,想买一件90元的商品,我们可以用一张100元进行支付,也可以用一张50元和两张20元进行支付。
按照UTXO的特征,在使用一张100元支付时,会生成一张90元的新钞票(UTXO)给商家,生成一张10元的新钞票(UTXO)给自己;使用一张50元和两张20元,会生成一张90元的新钞票(UTXO)给商家。
在硬分叉刚刚完成的时候,两条链上的UTXO都是继承原链,因此完全相同。此时,我们在A链发起交易请求时包含的UTXO在B链也是有效的,所以会被视为合法交易。
如果我们能在交易请求里掺入一点A链独有而B链没有的UTXO,那该笔交易只在A链合法、B链不合法,就可以有效避免重放攻击。
打个不太准确的比方,我们用是否有头发来分辨徐峥和沈腾,头发就是沈腾独有而徐峥没有的“UTXO”。
图片来源于网络
那应该如何操作呢?接着上面Q币分叉的例子,为了避免重放攻击,李四在给张三发Q币交易时故意多加了一张专属于分叉后Q币链的1元零钱。
当张三尝试在欢乐豆链重放这笔交易时,由于欢乐豆链无法识别那一张专属于分叉后Q币链的钞票,这笔交易无法完成,重放攻击失败。
而且张三收到的Q币由于已经混入了专属分叉后Q币链的钞票(UTXO),就会形成完全属于分叉后Q币链的101元新钞票(UTXO),再也不会被重放攻击。
但这种方式还是有其缺点的,在现实的交易中,我们不一定会一次性把所有的UTXO都交易出去。假设这一次李四只交易了一张10元的Q币,其他的90元在交易时忘记掺入专属Q币,同样存在被重放攻击的风险。
为了一次性避免重放攻击,李四可以采取以下方法:
1. 创建一个新钱包地址
2. 所有分叉后的新Q币钞票和一张专属于分叉后Q币链钞票打包发送到新地址
通过以上两个步骤,李四的新地址内会生成一张价值101元的分叉后Q币钞票(UTXO),这张钞票会专属于分叉后的Q币链,再也不担心被重放攻击。
在这种方法中,专属于分叉后链的UTXO就像是“疫苗”,我们通过为分叉后的币“注射疫苗”,“免疫”可能产生的重放攻击。
通过注射“疫苗”,免疫重放攻击
如何“注射疫苗”
前面说过,“疫苗”就是专属于新链的UTXO,但全网的UTXO都是由原链分叉而来,我们要如何获得专属的UTXO呢?
众所周知,比特币网络会向挖出新区块的矿工提供挖矿奖励。分叉之后,原链一分为二,矿工们同样也会一分为二,选择一条自己支持的链继续挖矿工作,分叉后挖出来的coinbase奖励就专属于某条新链。
因此,分叉后的coinbase奖励或曾用这些奖励作为输入产出的UTXO(可往前无限追溯)就算是新链专属的UTXO。
对于普通用户来说,最方便的方法就是在分叉前将币转入CoinEx交易所。CoinEx交易所除了支持BCH分叉为BCHN和BCHA外,也将第一时间为这两个币种“注射疫苗”,为您免除重放交易的风险。
如果您不想将币存入交易所,也可以进行以下操作:
1. 分叉后,从CoinEx交易所购买小额的BCH作为“疫苗”并转入钱包地址
2. 将当前钱包内所有的BCHN打包发送给自己
3. 将当前钱包内所有的BCHA打包发送给自己
上述两种方式都可以成功避免重放攻击,大家可以根据自己的实际情况选择,最后祝小伙伴们都能成功领到并保存好分叉币。