翻译:西溪明月
作者: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 比特币教育人员,开发人员
公众号:零识区块链(ID:zkchainnews)