区块链常见的双花攻击问题如何避免?双重支付 (Double-spending)
区块链可以把一分钱,掰开两份花?
概述
- 所谓双花,就是区块链利用延迟和分叉的特点,发送两笔或者多笔相互冲突的交易,这样当一笔交易被确认之后,其它有冲突的交易就会被取消。
- 假设 A 转账给 B,在没有区块确认之前,A 有转账给 C,这个 C 就是 A 的另一个地址。如果 A 控制了足够多的算力,区块确认比较快,那么他转账给 C 地址会有些给打包确认,那么转账给 B 的交易就会被回滚或者取消,这样 A 得到 B 的某些服务之后,但是交易被取消了!
双花攻击的类型
-
51%算力攻击:这种攻击是指拥有超过全网一半算力的恶意节点,可以在私下构造一个比主链更长的分支链,并在适当的时机发布出来,使得主链上的交易被回滚。这种攻击可以实现多次双花,并且可以针对已经确认过多次的交易。
-
Race Attack(竞争攻击):这种攻击主要通过控制矿工费来实现双花。攻击者同时向网络中发送两笔交易,一笔交易发给自己(为了提高攻击成功的概率,他给这笔交易增加了足够的矿工费),一笔交易发给商家。由于发送给自己的交易中含有较高的手续费,会被矿工优先打包进区块的概率比较高。这时候这笔交易就会在先于发给商家的那笔交易,那么发给商家的交易就会被回滚。对于攻击者来说,通过控制矿工费,就实现了同一笔 Token 的“双花”。
-
Finney attacks(零确认攻击):这种攻击是针对接收零确认的商家,攻击者主要通过控制区块的广播时间来实现双花,假设攻击者挖到区块,该区块中包含着一个交易,即 A 向 B 转了一定数量的 Token,其中 A 和 B 都是攻击者的地址。但是攻击者并不广播这个区块,而是立即找到一个愿意接受 0 确认交易的商家向他购买一个物品,向商家发一笔交易,用 A 向商家的地址 C 支付,发给商家的交易广播出去后,攻击者再把自己之前挖到的区块广播出去,由于发给自己的交易先于发给商家的交易,从而导致支付给商家的交易回滚/失效。芬尼攻击的必要条件是事件按照特定顺序发生,能否成功还取决于收款方是否接受未确认的交易。一般来说,为了节省时间而接受 0 确认,特别是对于大额交易而言,是非常不安全的,而且对于大额交易而言,多几次确认,将会降低交易被回滚的风险。
双花攻击案例:
-
BTG双花攻击:在 2018 年 5 月份,这位攻击者通过租用算力,控制了 51%的 BTG 网络总算力,然后攻击者开始向加密货币交易所充值 BTG,这条分支我们命名为分支 A,同时也试图将这些 BTG 发送到他们自己控制下的钱包,这条分支我们命名为分支 B,攻击者在分支 A 转账到交易所的交易被确定之后,攻击者立马卖掉 BTG 变现,然后由于攻击者控制了 51%的算力,他很快的在另一个分支 B 挖矿的长度超过分支 A,那么分支 A 上面的交易就被回滚了。交易所并没有收到 BTG,但是已经支付现金给攻击者了。
-
以太坊经典(ETC)双花攻击:2019 年 1 月 5 日至 7 日,ETC 网络遭受了一系列的 51%算力攻击,导致至少 15 个区块被回滚,其中包含了双花交易。据估计,攻击者通过这种方式获得了约 22 万个 ETC。
-
比特币(BTC)零确认双花攻击:2013 年 11 月,比特币网络发生了一起零确认双花攻击,涉及金额为 0.1 BTC。攻击者在向一个在线商家支付 0.1 BTC 后,立即发送了一笔使用相同输入但更高手续费的交易给自己。由于后者被矿工优先打包进区块,前者就被废弃了。
如何预防双花攻击?
-
等待足够多的确认:对于接收数字货币的用户或交易所,最简单有效的防范措施就是等待足够多的确认,以降低交易被回滚或废弃的风险。一般来说,6 个确认以上就可以认为交易是安全的,除非有超过 50%的算力进行攻击。对于金额较大或者风险较高的交易,可以适当增加确认数。
-
Nonce (交易序号):Nonce 是一个随机的加密值,在挖掘区块之前必须进行杂凑运算。 Nonce 的值只能使用一次,从而阻止双花攻击的发生。
-
时间戳记:每个成功的交易都有一个时间戳记,这证明了特定区块在特定时间添加到链上。 一旦区块被时间戳记,就变得不可逆转。
-
高节点运营成本:双花攻击通常要求攻击者管理一个或多个节点。 在 51% 攻击的情况下,骇客需要支配网络内超过一半的节点。 所以区块链可以通过提高节点运营的门槛来减轻双花攻击的风险。 例如,以太坊要求抵押 32 个 ETH 才能成为节点管理员,这样相当于提高 51% 攻击的成本而让攻击者知难而退。
比特币解决双花问题
比特币的UTXO账户模型是可以避免双花问题的。
这是我在网上找的一个UTXO 模型的图片。我简单分享一下UTXO模型的工作原理。然后再说明为什么可以预防双花问题。
假设Alex转账5.1个比特币给Julia
那么Alex在自己的钱包里面找到最优的UTXO模型组合来转账。
他找到5个BTC和0.2个BTC来进行转账,
他创建一个新的UTXO模型,在这个新的UTXO模型之中,5+0.2作为输入。
5.1+0.09作为输出,其中,5.1个比特币是转账给Julia的,剩下的0.09个比特币是找零的比特币,是返回到自己账户的。
剩下的0.01个比特币就当作的矿工费消耗掉了。
所以最终,Alex的钱包有三个UTXO模型,总共还剩下1.89个比特币
Julia的钱包有5个UTXO模型,3 + 2 + 5.1 + 1.55 + 0.5 =12.15 个比特币。
根据以上的这个转账的例子,比特币在转账的时候,他会确认UTXO的状态,他会检测你的资金是否存在UTXO的模型之中,如果不在,那么该交易会被系统拒绝。
UTXO模型可以让比特币节点有效验证链上的每一个交易,当节点收到一个交易的时候,无论该交易是否已经打包进区块,均可验证该交易内的UTXO是否真的有效且没有被花费,正因为如此,比特币可以有效的解决双重花费问题。
例如,你转了一笔5.1个比特币给Julia,然后又想转账5.1个比特币给自己的另一个钱包地址,那么在第二次转账的时候,他会检测你的钱包是否还存在5.1个比特币,由于你之前转了一笔5.1个比特币给Julia了,你当前的钱包的余额还剩下1.89个比特币,那么你的这次转账就会被系统拒绝。这样就有效的预防双花问题。
总结
在区块链的转账交易之后,等待一定数量的确认数是非常重要的。这样可以有效的预付双花问题。
不同的公链,区块确认的时间会不一样,但是一般的确认数越多,交易越安全,也就也不会发送交易回滚问题。
以上就是之前视频的所有内容,希望对你有用。
现在的区块链网络很少会出现双花攻击,主要的原因是攻击的成本太高,基本无法实现,另外我们在转账的时候,交易所需要一定的区块确认数,这个就是为了预防双花攻击的。并且确认数越多,交易越安全。
相关视频:https://youtu.be/D9-VyagJfoE
以下是我用过的交易所,有需要的小伙伴欢迎使用我的邀请连接来注册,你的支持是我最大的创作动力!
- OKX 邀请链接(20%手续费折扣):https://bit.ly/3OtE9Rs 邀请码:15240673
- 币安邀请链接(20%手续费折扣):https://bit.ly/3pR4kHv 邀请码:RIOSDDU2
- Gate 邀请链接(30%手续费折扣):https://bit.ly/43EEciO 邀请码:VlcQAQ1a
- Huobi 邀请链接(30%手续费折扣):https://bit.ly/45hPfPj 邀请码:rsj67223
- Bitget 邀请链接(20%手续费折扣):https://bit.ly/3PAd2DV 邀请码:muq18645
- Kucoin 邀请链接:https://bit.ly/3IXG4tQ 邀请码:QBSYVCMK
- Bybit 交易所邀请链接(中国大陆和美国 ip 都不可访问):https://bit.ly/41QZF5Q 邀请码:54760
- Bitmex 邀请链接(不支持香港和美国):https://www.bitmex.com/app/register/mAV6hE
- BTSE 邀请连接(20%手续费折扣):https://www.btse.com/partner/8ClLXPq0 推荐码:8ClLXPq0