撰文:黄世亮
最近(2023 年 10 月下旬)比特币社区爆出闪电网络可能存在重大缺陷,用户可以构造一种攻击手法来偷钱,英文名叫「lightning replacement cycling attack」。
我读了它的原理,中文名可译成「闪电网络循环替换交易攻击」。
它的攻击原理如下。
首先解释下闪电网络的工作原理:
1.alice 和 bob 双方开通一个支付通道,就是共同开通一个 2-2 签名的地址,他们一人持有一把私钥。
alice 和 bob 分别往这个 2-2 签名的地址里充值 0.5btc 和 0.6btc(金额可以任意选择,我只是举例),这两笔充值交易都是发生在比特币主链上的,矿工是要确认的。这样这个支付通道的初始状态就是 0.5btc 属于 alice,0.6btc 属于 bob,我们记为(alice:0.5btc;bob:0.6btc)。
这样在这个 2-2 签名地址里,alice 和 bob 就可以相互支付,比如 alice 可以支付给 bob0.1btc,这样状态通道的状态就变成了 0.4btc 属于 alice,0.7btc 属于 bob,(alice:0.4btc;bob:0.7btc)。并且这样的交易是不需要到比特币主链上打包,只是发生在 alice 和 bob 之间的记账,这就叫支付通道。
alice 和 bob 之间可以任意转账,而不需要到主链结算,这就节省了大量的矿工费,并且可以实时到账,不再需要 10 分钟的区块确认。
但如果只能在两个人之间相互转账交易,那也没啥用。
2.bob 和 carol 之间也开通一个支付通道,初始状态是 bob 有 1.0btc,carol0btc,记为 (bob:1.0btc;carol:0btc)。
3.这时,你看 alice 和 bob 之间有支付通道,bob 和 carol 之间也有支付通道。
那 alice 就可以通过 bob,向,carol 支付比特币。
支付过程如下:alice 向 carol 支付 0.1btc,事实在上述两个支付通道里发生如下的状态变更
1)alice 和 bob 之间的状态变更为(alice:0.3btc;bob:0.8btc)
2)bob 和 carol 之间的状态变更为(bob:0.9btc;carol:0.1btc)
3)这样就完成了从 alice 向 carol 转 0.1btc 的交易。
4.当越来越多的双方打开支付通道,并且实现了相互联通,就形成了一个支付网络了,我们称之为闪电网络。
当然详细的技术解释太复杂了,上述就是最精简的解释。
下面介绍下闪电网络循环替换交易攻击的大致过程,详细的技术细节我也讲不明白,那些 opcode、合约和函数有点复杂。
1.攻击者是 alice 和 carol 两人,这两人合谋去攻击 bob,bob 是受害者。
2.alice 向 carol 支付 0.3btc。
1)初始状态通道如下(alice:0.3btc;bob:0.8btc)和(bob:0.9btc;carol:0.1btc)
2)alice 和 bob 之间的状态通道应该变更为(alice:0;bob:1.1btc)
3)bob 和 carol 之间的状态通道应该变更为(bob:0.6btc;carol:0.4btc)
3.alice 和 carol 决定合伙骗 bob 的 0.3btc
1)carol 一直不去认领确认自己收到了来自 alice 支付的 0.3btc,即 carol 不将闪电网络的收款回执信息发给 bob。这样就导致 bob 也无法在闪电网络内将 alice 的 0.3btc 合法的纳为己有。
2)到了一定时间,alice 耍赖,直接在比特币主链发起清算交易 tx1,声称自己还有 0.3btc,而 bob 在和他的状态通道里只有 0.8btc。
tx1 这笔交易中有 0.3btc 是发给 alice 自己的地址(单签),这样 alice 就是试图将不属于自己的 0.3btc 偷为己有。
3)因为 bob 没有拿到 carol 的收款回执,所以 bob 无法证明(alice;bob)这个状态通道当中状态应该修改为(alice:0btc;bob:1.1btc)
4)一旦 tx1 在链上被打包,即 alice 真的偷到了 0.3btc 后,carol 就会立刻在闪电网络里收下 0.3btc,将收款回执发给 bob。
5)这样,alice 没有真实发出 0.3btc 给 bob,而 carol 却真实收到了 bob 的 0.3btc。所以 bob 被 alice 和 carol 合伙偷走了 0.3btc。
6)注意 alice 在主链上发起 tx1 偷币交易时,bob 是有反制措施的,即向主链发起交易 tx2 证明 alice 在作弊,但因为 bob 没有拿到 carol 的收款回执,所以 tx2 这笔交易还是挺麻烦的,但理论上是可做到。
而 alice 在看到 tx2 后,就会再次使用更高矿工费的办法,重置 tx1,以诱使矿工打包 tx1,而拒绝 tx2,这就所谓的「替换交易(replacement)」。
7)而目前开发者说,alice 和 carol 的合谋,确实是可以让让 bob 的 tx2 在比特币主链矿工上看起来更难合法化,而想要更清楚地证明 tx2 是合法的,需要修改协议,并且对主链来说是一个软分叉,这就难了。
上述就是闪电网络循环替换交易攻击大致过程,具体的技术原理太复杂了,我也看不明白,我只是假设在网上看到的开发者发布的技术细节是正确的。
攻击的办法是两个夹一个,而交易所是天然的和所有用户开通了支付通道,所以交易所要遭殃了。
最后,我感觉这也不是啥大不了的事,软件哪有没 bug 的啊,会有办法修复的。