专栏名称: 闪电HSL
读书分享
目录
相关文章推荐
闪电HSL  ·  Polymarket实在是太成功了,预测市场 ... ·  6 天前  
巴比特资讯  ·  腾讯放大招,超Meta!史上参数最大,开源专 ... ·  1 周前  
巴比特资讯  ·  OpenAI离不开微软,但Anthropic ... ·  1 周前  
巴比特资讯  ·  副业做的应用获25万用户, ... ·  1 周前  
51好读  ›  专栏  ›  闪电HSL

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

闪电HSL  · 公众号  · 比特币  · 2017-06-23 23:21

正文

0 引言

你有想过可以通过垃圾交易攻击作废掉一个地址吗?

这是我碰到的一个真实案例。

 

1 一个理财项目引发的尴尬

一个朋友参与了李笑来的比特沙银行理财,存了一个币,每天能收到0.0001BTC的利息。存了好几年了。

比特沙这个项目很有意思,是以比特币地址作为账户的。你用自己掌握私钥的地址往比特沙的存钱地址转入存款,然后利息每天都会自动发到你这个地址上来。而且你取款也只需要向存款地址发一笔特定金额的比特币,然后银行就会按该交易金额的1000倍返回到你的地址。当然你的取款金额不可能超过存款金额的。

这位朋友在几年的时间里,每天都收到0.0001BTC的比特币,到昨天为止,他的地址上一共有18300.0001UTXO(为了描述方便,中间忽略掉这个地址的一些不是0.0001BTC的收款,所以具体数据不是1830个UTXO,但不会影响整个文章的逻辑)

然后在前天他决定将这笔存款提出来,他往存款地址转入了0.001BTC,然后银行给他返回了1BTC

 结局是,他的这个地址里有1833次历史交易,一共有1.183BTC余额,却有多达1831个UTXO。

现在他想把这笔钱转入交易所卖掉。结果发现,他转不出来。

他用的钱包是blockchain.info。用这个钱包发送比特币时,只能按照地址的UTXO的时间顺序来花,先到的UTXO先花。

也就是说,如果他要发送0.0001BTC的话,blockchain.info钱包就会构造一笔交易,交易的input是最早的那笔利息。如果他要发送1BTC的话,blockchain.info钱包会构造出1831input和两个output,即钱包不会直接将他收到的那个1BTC的余额作为input,而是会从最早收到的0.0001BTC的利息开始凑余额,一直凑到1831Input才能凑够1.183BTC,然后发送出去,再找零找回0.183BTC,这里没有扣除矿工费。

1832input构造出来的交易体积会大于1M,超过了区块上限,所以这个根本不可能构造出来。

而且你知道的,现在比特币区块太堵了。

如果你要构造一笔0.0001BTCUTXO作为input的交易,结果是手续费都不够,根本发不出去,如果你以更低的矿工费发构造交易,则永远不可能被确认。

所以我这位朋友这1.183BTC的余额在blockchain.info的判断下,是根本不能花的币。如果选择正常的矿工费的话,钱包不让发送,因为根本花不出去。只有使用户自定义手续费时,将手续费设到10sat/byte以下才能被发送。

 

2 通过构建垃圾交易来清除18300.0001BTCUTXO

这位朋友请我帮忙。他把钱包账户和密码都告诉了我。

我查了半天,发现了上面描述的逻辑。

我第一个想到的办法是将私钥导出来,再导入到bitcoin完整节点钱包,通过createrawtransaction命令来专门构造选定的UTXO来把这1BTC的币发送出来,其他的0.0001BTC就不要了,等扩容之后再搞吧。

但发现blockchain.infoHD钱包,导出的是十二个单词的密语,我的完整节点钱包不支持HD钱包。

然后我只好用第二个办法——使用零手续费发送垃圾交易将18300.0001BTCUTXO清除掉地址的UTXO列表,只留下最后那1BTCUTXO,然后就可以正常发送1BTC的交易了。

我使用零手续费,每一次构造出250input,一个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 结束语

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

(为了不暴露隐私,我就不提供这们朋友的地址了)



(如果您觉得好,欢迎关注我的公众号: 闪电HSL,也欢迎加我微信号:13116885)




(如果你想学习比特币和区块链知识,欢迎加入我的小密圈)