可以使用垃圾交易攻击作废掉比特币地址

转自这里



第0章 引言
你有想过可以通过垃圾交易攻击作废掉一个地址吗?
这是我碰到的一个真实案例。

第1章 一个理财项目引发的尴尬
一个朋友参与了李笑来的比特沙银行理财,存了一个币,每天能收到0.0001BTC的利息。存了好几年了。
比特沙这个项目很有意思,是以比特币地址作为账户的。你用自己掌握私钥的地址往比特沙的存钱地址转入存款,然后利息每天都会自动发到你这个地址上来。而且你取款也只需要向存款地址发一笔特定金额的比特币,然后银行就会按该交易金额的1000倍返回到你的地址。当然你的取款金额不可能超过存款金额的。
这位朋友在几年的时间里,每天都收到0.0001BTC的比特币,到昨天为止,他的地址上一共有1830个0.0001的UTXO。(为了描述方便,中间忽略掉这个地址的一些不是0.0001BTC的收款,所以具体数据不是1830个UTXO,但不会影响整个文章的逻辑)
然后在前天他决定将这笔存款提出来,他往存款地址转入了0.001BTC,然后银行给他返回了1BTC。
结局是,他的这个地址里有1833次历史交易,一共有1.183BTC余额,却有多达1831个UTXO。
现在他想把这笔钱转入交易所卖掉。结果发现,他转不出来。
他用的钱包是blockchain.info。用这个钱包发送比特币时,只能按照地址的UTXO的时间顺序来花,先到的UTXO先花。
也就是说,如果他要发送0.0001BTC的话,blockchain.info钱包就会构造一笔交易,交易的input是最早的那笔利息。如果他要发送1BTC的话,blockchain.info钱包会构造出1831个input和两个output,即钱包不会直接将他收到的那个1BTC的余额作为input,而是会从最早收到的0.0001BTC的利息开始凑余额,一直凑到1831个Input才能凑够1.183BTC,然后发送出去,再找零找回0.183BTC,这里没有扣除矿工费。
1832个input构造出来的交易体积会大于1M,超过了区块上限,所以这个根本不可能构造出来。
而且你知道的,现在比特币区块太堵了。
如果你要构造一笔0.0001BTC的UTXO作为input的交易,结果是手续费都不够,根本发不出去,如果你以更低的矿工费发构造交易,则永远不可能被确认。
所以我这位朋友这1.183BTC的余额在blockchain.info的判断下,是根本不能花的币。如果选择正常的矿工费的话,钱包不让发送,因为根本花不出去。只有使用户自定义手续费时,将手续费设到10sat/byte以下才能被发送。

第2章 通过构建垃圾交易来清除1830个0.0001BTC的UTXO
这位朋友请我帮忙。他把钱包账户和密码都告诉了我。
我查了半天,发现了上面描述的逻辑。
我第一个想到的办法是将私钥导出来,再导入到bitcoin完整节点钱包,通过createrawtransaction命令来专门构造选定的UTXO来把这1BTC的币发送出来,其他的0.0001BTC就不要了,等扩容之后再搞吧。
但发现blockchain.info是HD钱包,导出的是十二个单词的密语,我的完整节点钱包不支持HD钱包。
然后我只好用第二个办法——使用零手续费发送垃圾交易将1830笔0.0001BTC的UTXO清除掉地址的UTXO列表,只留下最后那1BTC的UTXO,然后就可以正常发送1BTC的交易了。
我使用零手续费,每一次构造出250个input,一个output,交易金额是0.025BTC, 的交易。每一笔交易体积都高达44.914Kb。(对不起了,比特币网络,我发了五笔垃圾交易)
最后这个地址剩下1.018BTC时,我构造出一笔手续费为0.0013BTC,两个Input一个Output的交易。并且请矿池加速。最后成功拿回1.018BTC的币。又花了点矿工费,发到交易所,最后卖到19600多块钱。

第3章 原来李老师的自动化理财银行会制造那么多垃圾交易
我们经常可以在网上看到大量的0.0001BTC的交易,一开始我还纳闷,这些交易有什么意义啊,是故意发起的垃圾交易攻击比特币网络吧。
现在我知道了,原来这些“垃圾交易”有可能是自动化理财项目发送的利息。
而且这些利息金额太小,现在区块堵成这个样子,根本不能用这种小额的币。而钱包又默认按UTXO的时间顺序来构造交易,结局就是这些利息全是死币了,除非扩容成功。
我上面构造的几笔250个输入的交易,0手续费,注定是不会被确认了,现在去btc.com查,已经查不到这些交易了,因为btc.com已经将它们踢出内存池了。但blockchain.info还是可以查到。
这些垃圾币最后肯定会回到我朋友的地址上,但除非扩容成功,否则就是没法用了。

第4章 结束语
不知道现在比特沙存币多不多,如果多的话,那李老师这个银行每天得制造多少垃圾交易啊!