# 聊聊粉尘攻击Dust Attack

By [DrJingle 金狗博士](https://paragraph.com/@fahayek) · 2023-09-24

---

什么是粉尘攻击？
========

粉尘攻击是指恶意行为者发送一小量比特币（被称为"粉尘"）到一个或多个特定的比特币地址，为追踪该等地址的所有者、破坏比特币网络或进行其他恶意行为。

我们在《为什么铭文是546聪》里面对粉尘攻击也有所讨论。

[https://mirror.xyz/fahayek.eth/aHVjhFmu-fsvk-xwbS1TeeLCX4mQGvjEB\_57HhleoS4](https://mirror.xyz/fahayek.eth/aHVjhFmu-fsvk-xwbS1TeeLCX4mQGvjEB_57HhleoS4)

粉尘攻击的类型
=======

粉尘攻击的类型常见有三种：跟踪型、网络破坏型以及交易费攻击。

**跟踪型粉尘攻击**根据分布广泛的粉尘交易进行资金追踪，旨在关联和识别比特币钱包，并分析钱包的交易行为。

**网络破坏型粉尘攻击**是大批量发送大量的粉尘交易，试图"堵塞"比特币网络，造成网络拥挤，进而影响比特币网络的正常运行。

**交易费攻击**是因为交易的额度非常小，所以如果想把这些粉尘再次用于交易，那么必须要支付更高的交易费用（因为交易数据量大，费用相对也会大）。由于费用太高，这些小额度的比特币可能永远无法被使用。攻击者利用这个机制，以迫使接收者支付比交易额度更高的费用。

粉尘攻击的原理
=======

当你创建比特币交易时，你是在创建一项指令，告诉网络你想将你的比特币从一个或多个比特币地址，转移到一个或多个不同的比特币地址。这项指令的数据大小取决于你引用的输入个数，而这输入就是你在这个交易中要花费的比特币份额。

如果你的地址收到了非常多的小额度比特币，比如一个“粉尘攻击”，那么在你使用这些“粉尘”

作为下一步交易的输入时，你必须在交易中提供这些输入的详细信息，因此，你的交易的数据大小会增加，需要支付的交易费用也会随之增加。尽管你的交易额度很小，但由于输入的“粉尘”较多，交易数据的大小将会急剧增加，从而提高了交易的费用。

一个粉尘攻击的实例
=========

![](https://storage.googleapis.com/papyrus_images/5fdf28486c5d4542e7318d3794c3b7212e19deb339075d6d1e40d50542182d56.png)

这个是一个特定的比特币交易的详细视图。

[https://mempool.space/zh/tx/1dbfc30339bad7279cb1369d05416ef30162f10fcd7f608aa4dd850d07526aec](https://mempool.space/zh/tx/1dbfc30339bad7279cb1369d05416ef30162f10fcd7f608aa4dd850d07526aec)

这是一个低费用的交易，网络拥堵而暂时卡在了mempool（由待处理的交易组成的池子）中。然而，如果有人尝试通过发送大量很低的费用的交易来“堵塞”网络，这种行为的影响通常是有限的。因为矿工在确认交易时，会优先选择那些付费较高的交易（以获得更高的报酬），所以这些低费用的交易可能需要等待比较长的时间才会被确认。

然而，这并不完全意味着这些低费用的交易会"永远"困在mempool中。比特币网络的交易拥堵情况是有周期性的，较空闲的时候（比如夜间或周末），也有可能会有矿工去处理这些低费用的交易。但正确的处理方式还是，如果你需要发送一个交易并希望它能在预期的时间内被确认，那么需要设定一个合理的费用来激励矿工进行处理。

虽然如果一个交易包含了很多小额输入（比如被粉尘攻击的结果），那么这个交易可能需要很多空间，导致交易费用的增加。但是大部分现代钱包都有对付粉尘攻击的策略，包括设定最小接收金额，或者对于小额度输入实行合并处理等。

粉尘交易费攻击的详细解释
============

当你创建比特币交易时，实际上是在创建一项指令，告诉网络你想将你的比特币从一个或多个比特币地址，转移到一个或多个不同的比特币地址。这项指令的数据大小取决于你引用的输入数量。一个输入就是你在这个交易中想要花费的比特币份额，这些份额之前被发送到你的地址。

所以，假设你的地址接收到了大量的"粉尘"交易--比如，你有1000个只收到0.00001比特币的输入--那么，现在假设你想要创建一个交易，这个交易使用这些粉尘，你必须在你的交易中引用这1000个输入。这个交易的比特大小将会很大，因为你需要为每个输入提供详细的信息，包括每个输入所引用的先前的交易，以及先前交易的其他一些信息。

**_比特币交易的费用并不是基于你要转移的比特币的数量，而是基于交易数据的大小_**。因此，尽管你可能只是想要发送一个很小的总量，如果你需要引用很多小额输入，你的交易就会变得很大，导致需要支付较高的费用。

在实际情况中，大部分电子钱包会自动为你处理这些细节，它们会在创建一笔交易时，优先选择那些会使你支付较少交易费的输入。为此，你的钱包可能会选择不使用粉尘交易，除非你没有其它选择，或者这些粉尘的累积量已经足够大，值得你支付高昂的交易费用。

但是，技术上来说，**_未确认的交易的输出（UTXO）在技术上是可以被再次用作新交易的输入，但这种交易被称为链上交易（chained transaction）_**，它本身也就变成了未确认的状态，因为它依赖于还未被确认的交易。许多钱包软件和比特币服务，为了避免这种可能导致问题的链上交易，通常默认标记正在mempool中的交易UTXO（即还未被确认的交易）是不可用的。

如果你的钱包未对此做特别处理，而你试图将mempool中的交易UTXO作为输入，创建新的交易，那么，你的这个新交易需要等待其所有输入被确认，也就是等待那个初次交易被矿工取出mempool，放入新区块并被网络确认，才能被网络确认。

这可能会造成一种情况，即后续的交易因为输入的交易未确认而无法被确认，直到那个低费用的粉尘交易被确认的情况发生。因此，处于这种情况的用户通常需要等待，或者使用技术比如Replace-By-Fee（通过增加费用来替换之前的交易）或Child-Pays-For-Parent（通过创建一个新的交易，支付足够的费用来包含未确认交易和新交易）来试图加速交易的确认。

如何防范粉尘攻击
========

对于个人用户，你可以定期清理你的钱包中的“粉尘”，或者使用具有防“粉尘”攻击功能的钱包。

定期清理：当你的钱包中存在大量小额度比特币（即“粉尘”）时，你可以定期创建一笔交易，将这些“粉尘”组合起来发送到另一个你拥有的地址。尽管你需要支付一些交易费用，但在网络相对空闲、交易费用相对较低的时候进行清理，可以最大限度地降低成本。

选择防“粉尘”钱包：有些钱包提供了防“粉尘”攻击的功能，可以帮助你过滤或者拒绝接收小额度的比特币。你可以在选择钱包时优先考虑这类功能的钱包。

对于公司和大的比特币服务提供商，可以考虑使用分层对冲策略，将客户的比特币放在不同的地址，隔离大额交易和小额交易，从而最小化“粉尘”攻击的影响。

**总的来说，尽管粉尘攻击对于比特币网络和用户可能会带来一些麻烦，但通过一些策略和方法，我们可以有效地防粉尘攻击。市场检查交易时候的输入输出也助于你免于粉尘攻击。**

---

*Originally published on [DrJingle 金狗博士](https://paragraph.com/@fahayek/dust-attack)*
