小部件CurrentPrice出错: unable to write file /opt/bitnami/apps/mediawiki/htdocs/extensions/Widgets/compiled_templates/wrt6805066256c503_97326771

粉尘攻击

来自早鸟科技-区块链百科|数字货币大全
跳转至: 导航搜索

区块链技术迅猛发展的同时,区块链网络的安全问题也越来越突出,比特币在价格飙升的过程中,也出现了多次重大安全事件,粉尘攻击就是比特币网络的威胁之一。


粉尘攻击,其实就是在比特币网络中有很多交易金额极少,手续费极低甚至是免费的交易,造成了比特币网络的拥堵。可能大家会奇怪,比特币转账都是要收取手续费的呀,怎么会有免费的?其实在比特币交易手续费的设置规则里是存在免手续费的情况。


比特币区块链由一个个区块组成,数据通过载体形成文件,永久记录在比特币网络上,这个载体就叫区块,每一个区块就是一个数据库,无数的区块链接起来,就形成了区块链。


比特币的账本是记在区块里的,从创世区块开始,每十分钟就增加一个区块。区块里记录的是一条条的交易数据,主要形式是——“某地址转账多少比特币到另一个地址”。比特币这种格式的账本,被称之为UTXO格式,它是流水账一样的,正是由于比特币这种记录交易历史过程的记账方式,使比特币的记账可以回溯历史,跟踪每一笔转账。


比特币这种特别的记账方式,也有它特别的手续费计算方法。传统记账方法,就是转账数额大,需要的手续费就多。但是,比特币是按照交易字节数来收取手续费的。


下面举例子:


情况一:A地址转给B地址1个btc;


情况二:A地址转给B/C/D地址各0.0001btc;


如果按照传统机构按交易金额百分比的形式收取,情况一的手续费肯定是要高于情况二的手续费。但是在比特币网络中,情况二转出的地址多,而每一笔交易,无论金额大小,交易的字节数都是差不多的,所以情况二交易数据的字节数要比情况一的多,所以情况二的手续费要远高于情况一。而情况二,恰恰是造成粉尘攻击的原因。

在比特币交易手续费的设计中,每一个交易都会分配一个优先级,这个优先级是由币龄、交易的字节数和交易的数量来决定的,交易数量越大、币龄(这些币在区块中存在的时间)越高优先级就越高,就越有机会免交易手续费。


比特币的每笔交易手续费默认最少是0.0001比特币的,如果你转账的金额太小或者是刚刚挖出来不久的新币(币龄很小),那么必须要付手续费。如果你转出的金额少于0.01比特币,也必需付0.0001比特币手续费。如果你需要大量的小额比特币转账,又想免费转出,这时候你可以加一个数额大的、币龄高的比特币金额,就会将平均优先级提高,从而可以免费转出比特币。


所以,粉尘攻击一方面是比特币的设计规则有漏洞,导致有人可以利用,允许极少金额的交易。另一方面,有人频繁恶意地进行小额交易,才会造成比特币网络的拥堵。因为,比特币的交易区间只有1M的大小,所以,那么多手续费极低甚至免费的小额交易,拥挤在比特币网络,必然会导致比特币网络的拥堵,而粉尘攻击最大的危害就是导致比特币网络拥堵。

网友解释[编辑 | 编辑源代码]

如果要想理解粉尘攻击[1]就必须先理解什么是粉尘。任何会消耗其费用三分之一以上的交易输出都不是比特币系统现在想要处理的东西,所以我们称之为“粉尘输出”,并且它们是非标准的。

一个典型的输出是33字节(pubkey hash +操作码),需要输入148字节的消耗,所以我们将它们加在一起以找出用于传输这个数值的总数据量。请注意,这个公式对于任何不是付费地址输出的东西都是错误的,不幸的是,我们必须遵循比特币核心的错误以确保我们被认为是标准。一个更好的公式可以估计满足所有不同脚本类型所需的数据大小,或者只是使用硬编码33。

// 这个是根据实时的数据进行的计算。 public Coin getMinNonDustValue(Coin feePerKb) {

   final long size = this.unsafeBitcoinSerialize().length + 148;
   // 计算交易费
   return feePerKb.multiply(size).divide(1000);

} // 默认是费用的3倍 public Coin getMinNonDustValue() {

   return getMinNonDustValue(Transaction.REFERENCE_DEFAULT_MIN_TX_FEE.multiply(3));

} 上面的这段代码就是用来计算最小的输出,如果小于这个输出值,我们就认为这个输出是粉尘输出。

相关条目

空块攻击

参考[编辑 | 编辑源代码]