闪电网络“正义交易”的原理和重要性
最近Bitmex Research发布的第三份关于闪电网络的报告引起了很多人的关注,文章介绍了一种惩罚非诚实方,防止他们窃取资金的一种机制,这种机制被称为“正义交易”(Justice Transaction)。
在其报告中,Bitmex提到其共检测到241笔“正义交易”,总共涉及2.22 BTC。
很多读者在看到相关报道后,只关注了结果,而没有考虑为什么闪电网络需要这种机制,以及其具体的原理。
实际上,“正义交易”正是《 闪电网络白皮书 》第3.1.4 节内容提到的博弈机制的实现版,通过这种机制,恶意违反协议的各方将损失通道中的所有资金。
“正义交易”概述
所谓“正义交易”,是旨在防止非诚实节点,通过广播一个旧通道状态来窃取资金的一种刺激措施。
值得注意的是,在这种设计下,当窃贼企图窃取闪电网络上的资金时,如果其被抓到,他们不仅会损失试图去窃取的资金,还会损失相关通道中的所有资金。这种“惩罚”措施,预计会起到威慑作用,因而被称为“正义”。
假设这样一个场景:
Alice与Bob之间进行永无休止的交易。如果它们之间打开了一个闪电网络通道,那他们就可互相按输入值为比例发送BTC资金。为了方便起见,我们假设他们都放了100万聪(0.01 BTC)。
如果Alice和Bob都在交易处理时始终保持节点在线,那么一切都会是正常的。这意味着,无论何时任何一方决定关闭通道,他们都会有一个双方都同意的场景,在这个场景中,主链上返回的金额将遵循交易的确切历史。如果他们都关闭通道,这可能是协同发生的。而如果他们之中只有一个启动关闭,并且所建立的关闭时间,是在另一方没有动作的情况下通过,则可能是非协同发生的。然而,这是没有人成为盗窃受害者的理想状态。
如果Alice想要窃取Bob的资金,她必须尝试以非合作的方式关闭通道(在另一方不知情的情况下),并在另一方不在线的时候进行窃取行为。如果满足这些条件,那么Alice将广播一个旧的通道状态,并希望Bob不会在规定的时间(通常为24小时)内在线将记录调准。
如果Alice的尝试成功,那么她将不可逆转地窃取非法向Bob请求的资金。但如果Bob在规定时间内回来,那么Alice将被罚掉她放到通道内的0.1 BTC。
四种闪电网络通道关闭方案
一般来说,开启闪电网络通道要比关闭通道要简单得多,因为只有一种方式可打开闪电网络通道。另一方面,在评估通道关闭时,我们需考虑四种不同的场景,如下面的决策树中所概述的。
第一种关闭类型:合作关闭(cooperative closure)
这是最常见的场景,当一个诚实节点发起通道关闭,而通道另一端的节点处于在线和通信状态时,就会发生协作关闭。
资金会根据最新的通道状态分配给各方的onchain钱包。
合作关闭只需要一笔onchain交易。使用一个“正常”2 of 2多签脚本兑现输入,并发送至两个输出,每个输出属于相关方,余额基于最新的通道状态。
此交易很难被识别为闪电网络交易,因此它是四种通道关闭类型中最私密的。
示例关闭:https://www.blockstream.info/tx/92370444373ab37c998999e0df0416c460166aa4845a940b66322c4934c6984f
第二种关闭类型:非合作非违约关闭(non-cooperative non-breach closure)
当一个诚实的节点在不直接与通道另一端的节点通信的情况下发起关闭时,就会发生非合作的非违约关闭。
资金会根据最新的通道状态分配给各方的onchain钱包。
第三种关闭类型:非合作违约非正义关闭(non-cooperative breach non-justice closure)
当一个不诚实的节点通过广播一个较早的通道状态,试图从通道另一端的节点窃取资金,从而启动通道关闭时,就会发生非合作违约非正义关闭。
非关闭节点在锁定时间段内不会检查网络(通常为24小时),也不广播公正交易,因此盗窃会是成功的。
上面提到的第二种和第三种关闭场景,需要用到两笔onchain交易。
首先,使用一个2 of 2多签witness来兑现资金,并发送至两个输出,未发起关闭的节点,将根据通道关闭方所说的可归因于它们的内容分配资金,而另一笔资金将发送到输出,该输出可使用OP_IF或OP_ELSE脚本进行兑现。
在第二笔交易中,发送到 OP_IF 脚本的资金,由发起通道关闭的一方,使用比特币脚本的OP_ELSE分支进行认领。
示例关闭:交易1 (https://www.blockstream.info/tx/0134992ff298d42835a1c47dc41cf7be8dbb91b3122e6391728e555046143844?expand)
交易2(https://www.blockstream.info/tx/a08e6620d21b8f451c63dfe8d0164f0ba1b2dc781ea163c7990634747b57282c?expand)(OP_ELSE)
第四种关闭类型: 非合作违约正义关闭(non-cooperative breach justice closure)
当不诚实的节点发起通道关闭,而不直接与通道另一侧的节点通信时,就会发生非合作违约正义关闭。
非关闭节点在锁定时间段内对网络进行检查,并创建一笔正义交易,从而导致盗窃操作失败。
潜在的窃贼会受到惩罚,所有的资金都流向诚实的非关闭方。
在正义交易场景中,需要用到两笔onchain交易。
在第一笔交易中,使用一个2 of 2 多签witness来兑现资金,并发送至两个输出,未发起关闭的节点将根据通道关闭方所说的可归因于它们的内容分配资金,而另一笔资金将发送到输出,该输出可以使用
OP_IF
或
OP_ELSE
脚本进行兑现。
在第二笔交易中,没有发起关闭的诚实节点使用
OP_IF
分支,认领发送到
OP_IF
脚本的所有资金。
这是三种通道关闭类型中最容易揭示的一种,并且提供了最低级别的隐私。
示例关闭:交易1(https://blockstream.info/tx/5cc28d4a2deeb4e6079c649645e36a1e2813605f65fdea242afb70d7677c1e03?expand)
交易2(https://blockstream.info/tx/c5597bbe1f56ea72ae4b6e2835d69c1767c3ce1317da5352aa14dad8ed22df34?expand)(OP_IF)
Bitmex使用以下步骤手动创建了一笔正义交易:
- 建立了一个新的别名为“BitMEXThief”的闪电网络节点(LND),并使用另一个正常节点打开一个价值50美元(40万聪)通道;
- 关闭这个BitMEXThief节点,并备份.lnd目录;
- 重新启动这个BitMEXThief 节点,并向正常节点支付25美元(20万聪)的闪电交易。这个通道现在平衡了,每个方向都有25美元。
- 再次关闭这个BitMEXThief节点;
- 关闭正常闪电网络节点(防止它向窃贼节点广播最新通道状态);
- 将“BitMEXThief”节点恢复到通道重新平衡之前的状态,即步骤2中的状态;
- 在恢复的“BitMEXThief”节点,尝试关闭其早期状态的通道,并向BitMEXThief节点的链上钱包索要50美元(40万聪)的全部金额;
- 重新启动正常闪电网络节点,然后,该节点自动检测到企图盗窃行为,并广播“正义交易”,将50美元(减去费用)的全部金额发送到其OnChain钱包。那将是小偷受到的惩罚,因为他失去了通道内的所有资金。注意,小偷企图偷走25美元,但最后却损失了50美元。
上面的实验成功地发生了,并提供了一种关于闪电网络的保障,如果你试图偷窃,那你将会受到惩罚。
正义交易网络数据
Bitmex Research在构建了自己的正义交易之后,研究了这类交易的特征,并在比特币区块链上搜索其他的正义交易。他们确认了241笔这样的交易,其中最早的交易可追溯到2017年12月。
(Source: BitMEX Research)
(Source: BitMEX Research)
在这241笔正义交易当中,很多可能并不是针对非诚实行为,例如,可能是有用户在测试这种机制,其中同一用户拥有两个有问题的闪电网络节点。就比如,在这241笔正义交易当中,就有BitMEX Research的5笔交易(交易当中没有受害者,因为节点和资金都是BitMEX自己的)。
结论
为了使闪电网络成为一个可靠、可扩展的支付系统,必须要有一个有效防止盗窃行为的机制,而正义交易就是这样的一个机制。至于最优的正义交易率,这是很难确定的,如果它太高,这表明盗窃还是较容易发生的,威胁可能还不够。如果它太低,可能意味着没有人试图去盗窃,从而增加了用户不监控其通道的风险,为未来大规模的盗窃事件埋下安全隐患。