专栏名称: 闪电HSL
读书分享
目录
相关文章推荐
51好读  ›  专栏  ›  闪电HSL

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

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

正文

请到「今天看啥」查看全文


0 引言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


2 通过构建垃圾交易来清除 1830 0.0001 BTC UTXO

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

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

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

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

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

我使用零手续费,每一次构造出 250 in put ,一个 output ,交易金额是 0.025 BTC 的交易。每一笔交易体积都高达 44.914 K b 。(对不起了,比特币网络,我发了五笔垃圾交易)

最后这个地址剩下 1.018 BTC 时,我构造出一笔手续费为 0.0013 BTC ,两个 Input 一个 Out put 的交易。并且请矿池加速。最后成功拿回 1.018 BTC 的币。又花了点矿工费,发到交易所,最后卖到 19600 多块钱。

3 原来李老师的自动化理财银行会制造那么多垃圾交易

我们经常可以在网上看到大量的 0.0001 BTC 的交易,一开始我还纳闷,这些交易有什么意义啊,是故意发起的垃圾交易攻击比特币网络吧。

现在我知道了,原来这些“垃圾交易”有可能是自动化理财项目发送的利息。

而且这些利息金额太小,现在区块堵成这个样子,根本不能用这种小额的币。而钱包又默认按 UTXO 的时间顺序来构造交易,结局就是这些利息全是死币了,除非扩容成功。

我上面构造的几笔 250 个输入的交易, 0 手续费,注定是不会被确认了,现在去 btc.com 查,已经查不到这些交易了,因为 btc.com 已经将它们踢出内存池了。但 blockchain.info 还是可以查到。

这些垃圾币最后肯定会回到我朋友的地址上,但除非扩容成功,否则就是没法用了。

4 结束语

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

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



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




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











请到「今天看啥」查看全文