如何实施重放攻击保护?给你讲解5种办法

翻译:西溪明月

作者:Jimmy Song

编辑:格鲁特

你可能连标题都还没看懂

但是!

你勇敢地点进来了

想学习下是嘛!

不怕,我跟你白话白话

Step1:解剖下标题

实施?重放攻击?保护?

换句话说,也就是避免“重放攻击”

那“重放攻击”是个啥?

分叉你一定不陌生,举个栗子🌰,比特币分叉了对不对,由一条链变成了两条链,在这两条链都得到支持并持续运营的情况下,另外一条分叉出来的链又产生了BCC这一币种,也就是BTC和BCC都存在。分叉完了之后如果不去管它,任其自然生长,这时候就会出现这样的情况:你在其中一条链交易时,另外一条链也会进行相同的交易操作,比如BTC链上A给B转100个币,那么在BCC链上也会出现给B转过去100个币的交易,这种情况被称为重放攻击

重放攻击,懂了吧。

所以,这还得了。我们当初BTC分叉的时候,钱包里多了等额的BCC,我们是可以分别处理它们的(转账或者提现之类的),两个币之间不会相互影响,你以为这是天经地义的,实际上如果不采取措施,在你转移BTC的时候BCC也会跟着跑。

那咋办,是不是很头疼。

所以就得开启“重放攻击”保护对吧。

那这个保护是怎么做的呢?

就是分叉后在两条链之间加了一重保护,比如在A链上进行一笔交易,那么B链上重复的交易会被判为无效。

嗯,那就进行“重放攻击”保护呗。

 

Step2:接下来你就可以安心进入正文了:

Jeff Garzik 近来在btc1 GitHub上恢复了“选择性实施重放保护(opt-in replay prote ction)”。这使一些人开始焦虑,因为很多人认为缺乏重放保护会给网络造成各种各样的可怕后果。

Jeff Garzik前bitcoin core 开发者,区块链服务公司Bloq的联合创始人兼首席执行官,Bloq将自身定位为 “企业级区块链”服务,初始产品包括BloqEnterprise,BloqSuite和BloqThink。

本文阐释的几种防御重放攻击的方法,无论是否实施了重放保护,都可以采用。首先我们需要解释比特币的交易原理以及如何消费UTXO,我希望你——亲爱的读者,能够更好地理解如何才能安全地继续前行。

方法1:UTXOs 未花费的交易输出

 

为了理解怎样做才能防御重放攻击,我们首先应该了解比特币的运作原理。

对于比特币,即使所有付款都发送到了同一个地址,但其实你持有的并不是一个大的余额,而只是一堆对你支付的小额钱款,叫做UTXO。

UTXO代表未花费的交易输出,你可以将其想象成某人发送给你的银行支票。你只能花费属于自己的部分,这些支票加起来就是你钱包里的余额。

当你花费比特币时,你的钱包就会使用一张或几张这样的支票,将其作为输入花掉。所以,如果Alice给你发送了5个比特币,Bob给你3个,而你要给Charlie 8个,那么你的钱包会使用“5个比特币” 支票与“3个比特币”支票作为输入。你发送给Charlie 8个比特币,他现在就拥有一张“8个比特币”支票(注意,该例子忽略了交易费)。

UTXO的一个重要特征是只要UTXO作为输入被使用,整个UTXO就必须被花掉。也就是说,如果你在使用朋友发送给你的支票,就必须把它全部用掉。

那么,如果你想给某人发送0.001个比特币,但却只有一张面值100比特币的支票(UTXO),该怎么办呢?这就需要在一个交易中向多人发送比特币,即你可以给别人发送0.001个比特币,给自己发送99.9985个比特币(并给矿工0.0005个比特币作为挖矿奖励)。那么现在你就拥有一张新的支票(UTXO),面值为99.9985比特币,它构成了你余额。

这样,一旦花掉一张UTXO,它就可以被忽略了。UTXO只有被花掉与未被花掉两种状态,不存在中间状态,这便使编码简单多了。

全球的UTXO集,或者说所有人未花费的支票集,便是完整节点为了验证没有出现双花攻击所要追踪的对象。同样,一旦一张UTXO被花掉了,它便不再是UTXO了,而是花费了的交易输出,可以作为交易的有效输入被忽略。

方法2:重放攻击

 

硬分叉之初,两条链上的UTXO是相同的。重放攻击若想成功,整个交易必须在两条链上都有效。假如没有强有力的重放保护,使用UTXO且在两条链上都有效的所有交易都会轻易受到重放攻击。

然而,随着两条链在交易构成上出现不同,UTXO集也开始出现不同。比如,两条链上的coinbase交易当然是不同的。所以硬分叉后的Coinbase交易将不会被重放。也就是说,2x上的coinbase交易不会再1x上重放,同样地,1x上的交易也不会在2x上重放。

当然,coinbase 交易(我们称之为0级交易)会有输出,那些输出是UTXO集的一部分。任何作为输入利用0级UTXO的交易(我们称之为1级交易)也不会在另一条链上重放。此外,任何利用1级交易输出的交易(我们称之为2级交易)同样也不会在另一条链上重放。如此循环再循环,到3级以致n级交易。

请注意,如果即使是单个N级交易是某项交易的输入,该项交易就将不会在另一条链上重放。也就是说,2x上的N级交易不会在1x上重放,1x上的N级交易也不会在2x上重放。我们将N级交易的所有未花费输出称为重放保护的UTXO。

这个方法有点复杂,因为coinbase交易有个特殊的规则,规定这些交易不能在100个区块上进行。通常这需要耗费17个小时,但依靠哈希算力分裂耗费的时间可能会更长。

方法3: 同时提交

 

不需要coinbase交易或衍生于coinbase的任何交易即可创建重放保护的UTXO的另一个方法是创建两项不同的交易,并消耗同一个UTXO将它们发送给自己。

这个程序的运作如下:

  • 假设你有一个UTXO,u
  • 在两项不同的交易中花费u,第一笔交易(tx1)去往地址1,第二笔交易(tx2)去往地址2。
  • 以足够的费用同时将tx1提交到链条1,将tx2交易提交到链条2。

如果一切正常,将在链条1上挖掘tx1,在链条2上挖掘tx2。当然,tx1可能在链条2上重放,但由于先提交tx2,这对链条2上的节点来说似乎是双花,所以这些节点可能拒绝它。在链条1上重放tx2也是同样的情况。对于先接收tx1的节点来说,这也像是双花。

只要重放攻击没有立即发生,且两项交易的费用都足够高,你就需要在每条链上都有输出,这些输出可以用作重放保护的UTXO。

即使遭到了重放攻击,也没关系,因为你控制着地址,所以除了交易费之外,你并不会有什么损失,还可以重新尝试。

方法4:利用锁定时间(Locktime)

 

创建重放保护的最后一种方法是利用锁定时间(locktime)。并非很多钱包都提供这种功能,但你可以将非法交易置于比特币区块链上某个区块号之前的区块内。即如果你指定500,000这个区块号,那么这个区块之前的任意包括此项交易的区块都会被网络拒绝。

要使这点成功运作,关键在于一条链是否比另一条长且长度合适(至少是6,但最好是20~30)  比如,链条1在区块500,010,而链条2在区块500,000。

  •   假设你有一个UTXO,u
  •  在链条1上花费u,tx1的锁定时间为500,011。
  • 一旦将tx1包含在了一个区块内(最好是在链条2上区块500,011之前的区块),就创建另一项交易(tx2),在链条2上将u花费在不同的地址里。
  • 如果tx2在链条2上区块500,011之前的区块上进行了确认,我们就在两条链上都有了重放保护的UTXO。

方法5:自然重放保护

 

事实证明,重放保护的UTXO可以有效防止重放攻击。

你所需要的仅仅是一个重放保护的UTXO。该UTXO的价值可以微乎其微,因为其金额无关紧要。双方最终可能会做的是提供水龙头,这些水龙头可以为你提供少量重放保护的UTXO,你可以用来确保交易不会被重放。

比特币水龙头就是一个会给访问者分发少量比特币的网站。数量从100聪到10000聪不等。通常你收到币以后需要等待一定时间才能获得下一次奖励。最初的比特币水龙头由Gavin Andresen创办,他是比特币的主要创始科学家。它大概在2010年晚些时间开始出现,免费给每位访问者5个比特币。那时候每个比特币大概值0.08美元。整个想法是为了传播世界首个加密货币。

至少,我们可以期待交易所、商人以及其他比特币企业等来利用UTXO,以免他们不小心向其客户发送同等金额的其他币种。换句话说,分叉后,你将很快能够从交易所、水龙头、商人等处得到重放保护的UTXO,因为免于重放攻击符合他们的利益。

也就是说,如果内置强有力的重放保护,整个生态系统将更方便,且税费更低,因为这会减少创建不可重放的UTXO的所需的开发时间。

 

对你来说这意味着什么

 

如果你是持币者,且目前没有任何交易计划,那么实际进行交易前,这并不重要。

即使Segwit2x没有提供任何重放保护,我们也还可以期待出现重放保护水龙头,以便确保交易安全进行。你会希望从这些水龙头来理解中本聪,并将钱包中的全部余额(包括对中本聪的新理解)转移到钱包的另一个地址。由于现在你的所有地址会被连接在一起,所以这会剥夺你的一些隐私,但这项交易不会被重放。

如果顾虑到隐私,你会想要更多重放保护的UTXO。但是,根据钱包内地址的数量,这会花费很多时间,更别说昂贵的费用了。要实现这点,你的钱包还需要有“币控制(coin control)”功能(比特币核心钱包以及Armory当然具有币控制功能,以太坊在某种程度上也有)。顺便说一句,这是钱包应该提供的功能,如果更过的钱包提供这项功能,且更多的用户对此加以利用,比特币就会更加安全。

也可能有些钱包可以让你尝试创建重放保护的UTXO。这要求钱包或者可以指定锁定时间,或者可以使锁定时间成为它最后知道的一个区块(比特币核心钱包是这样做的)。换句话说,你需要等待你最爱的钱包为你提供一些功能来缓解这个问题。

 

结论

 

重放保护对于硬分叉实属锦上添花,但没有也不必担心。包括水龙头、钱包等在内的各种解决方案会层出不穷,可以让你指定锁定时间等。要保护比特币安全,你永远都会有选择。你要做的就是留意并等待相关工具的出现。

但如果你是钱包/交易/支付处理人员/商人,那就另当别论了……

 

作者简介 Jimmy Song 比特币教育人员,开发人员

项目采访

首发|发币谁都会,你会发“货”么?是时候用Token干点“正经事”了正逢数字货币乱世,他们想用技术来保护投资人的最基本权益

数字货币交易所何去何从?

用区块链技术实现影响力的商业价值

用区块链技术拉起股权交易市场新的增长曲线

基于智能合约和区块链技术的创新信贷交换平台

“双链合璧”:他们想利用区块链打造更透明、更高效的供应链体系

专家专栏

EOS起源

硅谷资深投资人讲析区块链项目投资|教程

解决集成需求才是未来区块链业务的重点

不可篡改、可靠、安全——区块链安全性简史

信仰和投机:币圈没有奇迹

与元道对话三:区块链经济正在进行“动力切换”

百家观点

区块链+物联网+共享经济是什么玩法?

基于区块链的智能锁设计与实现

如何设计区块链项目的通证(token)模型

加密货币和区块链(一):历史的重演

裸照与区块链社群

疯狂的韩国比特币市场:“全民”炒币,人均收益率425%

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注