粉尘攻击是指恶意行为者发送一小量比特币(被称为"粉尘")到一个或多个特定的比特币地址,为追踪该等地址的所有者、破坏比特币网络或进行其他恶意行为。
我们在《为什么铭文是546聪》里面对粉尘攻击也有所讨论。
粉尘攻击的类型常见有三种:跟踪型、网络破坏型以及交易费攻击。
跟踪型粉尘攻击根据分布广泛的粉尘交易进行资金追踪,旨在关联和识别比特币钱包,并分析钱包的交易行为。
网络破坏型粉尘攻击是大批量发送大量的粉尘交易,试图"堵塞"比特币网络,造成网络拥挤,进而影响比特币网络的正常运行。
交易费攻击是因为交易的额度非常小,所以如果想把这些粉尘再次用于交易,那么必须要支付更高的交易费用(因为交易数据量大,费用相对也会大)。由于费用太高,这些小额度的比特币可能永远无法被使用。攻击者利用这个机制,以迫使接收者支付比交易额度更高的费用。
当你创建比特币交易时,你是在创建一项指令,告诉网络你想将你的比特币从一个或多个比特币地址,转移到一个或多个不同的比特币地址。这项指令的数据大小取决于你引用的输入个数,而这输入就是你在这个交易中要花费的比特币份额。
如果你的地址收到了非常多的小额度比特币,比如一个“粉尘攻击”,那么在你使用这些“粉尘”
作为下一步交易的输入时,你必须在交易中提供这些输入的详细信息,因此,你的交易的数据大小会增加,需要支付的交易费用也会随之增加。尽管你的交易额度很小,但由于输入的“粉尘”较多,交易数据的大小将会急剧增加,从而提高了交易的费用。
这个是一个特定的比特币交易的详细视图。
这是一个低费用的交易,网络拥堵而暂时卡在了mempool(由待处理的交易组成的池子)中。然而,如果有人尝试通过发送大量很低的费用的交易来“堵塞”网络,这种行为的影响通常是有限的。因为矿工在确认交易时,会优先选择那些付费较高的交易(以获得更高的报酬),所以这些低费用的交易可能需要等待比较长的时间才会被确认。
然而,这并不完全意味着这些低费用的交易会"永远"困在mempool中。比特币网络的交易拥堵情况是有周期性的,较空闲的时候(比如夜间或周末),也有可能会有矿工去处理这些低费用的交易。但正确的处理方式还是,如果你需要发送一个交易并希望它能在预期的时间内被确认,那么需要设定一个合理的费用来激励矿工进行处理。
虽然如果一个交易包含了很多小额输入(比如被粉尘攻击的结果),那么这个交易可能需要很多空间,导致交易费用的增加。但是大部分现代钱包都有对付粉尘攻击的策略,包括设定最小接收金额,或者对于小额度输入实行合并处理等。
当你创建比特币交易时,实际上是在创建一项指令,告诉网络你想将你的比特币从一个或多个比特币地址,转移到一个或多个不同的比特币地址。这项指令的数据大小取决于你引用的输入数量。一个输入就是你在这个交易中想要花费的比特币份额,这些份额之前被发送到你的地址。
所以,假设你的地址接收到了大量的"粉尘"交易--比如,你有1000个只收到0.00001比特币的输入--那么,现在假设你想要创建一个交易,这个交易使用这些粉尘,你必须在你的交易中引用这1000个输入。这个交易的比特大小将会很大,因为你需要为每个输入提供详细的信息,包括每个输入所引用的先前的交易,以及先前交易的其他一些信息。
比特币交易的费用并不是基于你要转移的比特币的数量,而是基于交易数据的大小。因此,尽管你可能只是想要发送一个很小的总量,如果你需要引用很多小额输入,你的交易就会变得很大,导致需要支付较高的费用。
在实际情况中,大部分电子钱包会自动为你处理这些细节,它们会在创建一笔交易时,优先选择那些会使你支付较少交易费的输入。为此,你的钱包可能会选择不使用粉尘交易,除非你没有其它选择,或者这些粉尘的累积量已经足够大,值得你支付高昂的交易费用。
但是,技术上来说,未确认的交易的输出(UTXO)在技术上是可以被再次用作新交易的输入,但这种交易被称为链上交易(chained transaction),它本身也就变成了未确认的状态,因为它依赖于还未被确认的交易。许多钱包软件和比特币服务,为了避免这种可能导致问题的链上交易,通常默认标记正在mempool中的交易UTXO(即还未被确认的交易)是不可用的。
如果你的钱包未对此做特别处理,而你试图将mempool中的交易UTXO作为输入,创建新的交易,那么,你的这个新交易需要等待其所有输入被确认,也就是等待那个初次交易被矿工取出mempool,放入新区块并被网络确认,才能被网络确认。
这可能会造成一种情况,即后续的交易因为输入的交易未确认而无法被确认,直到那个低费用的粉尘交易被确认的情况发生。因此,处于这种情况的用户通常需要等待,或者使用技术比如Replace-By-Fee(通过增加费用来替换之前的交易)或Child-Pays-For-Parent(通过创建一个新的交易,支付足够的费用来包含未确认交易和新交易)来试图加速交易的确认。
对于个人用户,你可以定期清理你的钱包中的“粉尘”,或者使用具有防“粉尘”攻击功能的钱包。
定期清理:当你的钱包中存在大量小额度比特币(即“粉尘”)时,你可以定期创建一笔交易,将这些“粉尘”组合起来发送到另一个你拥有的地址。尽管你需要支付一些交易费用,但在网络相对空闲、交易费用相对较低的时候进行清理,可以最大限度地降低成本。
选择防“粉尘”钱包:有些钱包提供了防“粉尘”攻击的功能,可以帮助你过滤或者拒绝接收小额度的比特币。你可以在选择钱包时优先考虑这类功能的钱包。
对于公司和大的比特币服务提供商,可以考虑使用分层对冲策略,将客户的比特币放在不同的地址,隔离大额交易和小额交易,从而最小化“粉尘”攻击的影响。
总的来说,尽管粉尘攻击对于比特币网络和用户可能会带来一些麻烦,但通过一些策略和方法,我们可以有效地防粉尘攻击。市场检查交易时候的输入输出也助于你免于粉尘攻击。