作者:Fanis Michalakis
“涡轮通道(turbo channels)” 已经存在了至少两年了,但社区中依然有非常多的误解。有关信息虽然有,但比较零散。本文的目的就是将它们汇集在一起,并为这个主题提供全面的视角。
零确认通道
涡轮通道基本上就是 “零确认的通道”,意思是这种通道在通道开启交易得到比特币区块确认之前就可以开始使用。通常来说,在通道开启交易 1 得到(一般来说)3 个区块确认之前,这条闪电通道会被认为是不可用的。这在安全性上当然是周全之策,因为它保护了用户免遭重复花费攻击(double-spending attacks),但它在用户开启通道和用上通道之间增加了数十分钟的时延。
人们等不及吗?
一般来说,你是对的。很多很多时候,你都不是特别着急要让你的通道确认。如果你是一个耐心的人、一个有远见、低时间偏好的人,通常你都会在需要用上之前就开好闪电通道。
但不是每个人都像你这样,也不是每个人都已经开好了自己的通道。我知道这听起来有点不可思议,但是,真的有人需要成套的闪电网络解决方案,所以才会有攻击。我们可以将成套的闪电网络钱包分成两大类:
- 完全托管钱包 。用户没有自己的私钥,用户也没有自己的通道。这是差劲的解决方案。千万不要选择这种 2。
- 非托管的、信任最小化的钱包。你控制这自己的私钥,也拥有你自己的通道(跟上述私钥相关联),通常是在你手机上的闪电轻节点和钱包供应商的节点之间开设的。这里面有一些信任因素,但所需的信任数量通常保持在最低识别。如果你不想承担自己维护节点和通道的负担,但还没有失去理智,那就选择这种钱包吧。
第一类闪电钱包套件(差劲的那一类)可以很容易给用户提供无缝的体验、帮助用户进入闪电网络:
- 用户在链上将比特币发送给钱包供应商
- 钱包供应商在闪电钱包中为用户显示相应的余额
这很快,也很便宜(只需一笔发送比特币交易的手续费),但这些 “闪电网络” 上的比特币实际上只是用户永远无法强制执行的借条,因为用户没有相应的私钥,只是单纯信任钱包供应商。
第二类的闪电钱包套件(好的那一类)想要提供相同的用户体验会更难一些。当一个用户开始使用闪电网络时,钱包供应商必须跟他们开设第一条闪电通道:
- 用户在链上将比特币发送给钱包供应商
- 钱包供应商发布一条通道开启交易,交易额为相应的数额(减去手续费)或更多
- 用户等待第一个区块确认
- 用户等待第二个区块确认
- 用户等待第三个区块确认
- 终于,用户可以使用这条新通道、访问闪电网络了!
如你所见,闪电网络的传统用户体验,也就是用户需要等待 3 次区块确认才能真正用上通道,对非托管型闪电钱包也不是绝对合适。有时候用户就是想要立即使用闪电网络,因此无法等待很长时间。而且,这种时延可能会驱逐用户,让他们转向托管型闪电钱包,也就是糟糕的那一类!
这就是为什么非托管的闪电钱包几乎都以各种方式实现了涡轮通道。
涡轮通道在今天是如何实现的
非托管型闪电钱包,比如 Breez、Muun 和 Phoenix,都以不同方式用到了涡轮通道。
举个例子,Muun 让用户自己决定是否要使用涡轮通道:这个选项是默认开启的,但用户可以自己关掉。
至于整体的流程,这个概念对所有实现都是完全相同的:
- 用户在链上将比特币发送给钱包供应商
- 钱包供应商发布一条通道开启交易,交易额为相应的数额(减去手续费)或更多
- 通道的两端(钱包供应商的节点和用户的轻节点)都立即将该通道视为可用的,即使这条通道还没有得到 3 次区块确认
需要指出的一个重点是,钱包供应商才是实际开启通道的人。这意味着,默认情况下,最开始的通道余额会放在钱包供应商一端。但这些其实是用户的资金,只不过用户在链上把它们发给了钱包供应商。因此,钱包供应商必须将一些资金推到用户一端。整个流程如下:
- 用户在链上将比特币发送给钱包供应商
- 钱包供应商发布一条通道开启交易(交易额至少是用户发送的数量,但通常会更多)
- 钱包供应商在通道中将用户在步骤 1 中发送的数额(减去手续费)推回给用户
- 通道的两端(钱包供应商的节点和用户的轻节点)都立即把该通道视为可用的,即使这条通道还没有得到 3 次区块确认
- 因为通道两端都有一些资金,用户可以立即开始使用闪电网络发送比特币。通常来说,钱包供应商所开启的通道,容量会大于用户在步骤 1 中发送的金额,也就是说,通道的钱包供应商一端也有余额,所以用户可以立即开始接收支付
至于钱包和闪电网络实现具体是如何处理这个流程的,就看钱包供应商了。指定涡轮通道如何在协议层工作的流程(例如撰写详述)已经在闪电网络 Dev 邮件组中开始了。
它牺牲了什么?
使用涡轮通道,非托管的闪电网络钱包可以实现可媲美托管钱包的用户体验。当然,像往常一样,它也有必须被强调的信任和安全性取舍。
在通道开启交易还未被确认的时候,链上没有任何机制能强制执行通道。如果钱包供应商跑路了、取消了还在交易池中的通道开启交易 3,用户会失去 开启 的通道中所有没有发送出去的资金:
- 要是用户在钱包供应商取消开启交易之前没有使用过通道,他们会损失自己在一开始发送的资金
- 要是用户在通道中已经花去了一些资金(例如,他们支付了 50000 聪给某个商家),他们就会损失自己发送的数额减去 50000 聪
在 “最好的情形下”,用户在钱包供应商攻击之前就花光了本地余额,因此什么也没有损失,只是浪费了链上交易的挖矿手续费和钱包供应商的处理费。
一旦通道开启交易获得一次区块确认,钱包供应商发动这样的攻击就变得很难,因为这需要重组区块链。深度为 1 的重组还是很有可能发生的(甚至会自然发生),但任何重复花费都会被比特币网络检测出来并拒绝。
这就是声誉起作用的地方了。任何时候一个钱包供应商想要愚弄用户,都必须发布一笔比特币交易 4。即使只是在交易池中放入一笔交易,即使这笔交易没有被挖出,它也会被网络中大部分节点所知。因此,这个钱包供应商的诡计不可能不被注意到,尤其是用户可以在公共空间中声讨,善良的比特币人会听到。当然,用户的资金是丢了,但这个钱包供应商的声誉也没了。而这样的非托管型钱包供应商的声誉需要经年累月才能建立起来。
脚注
1. 通道开启交易是一笔比特币交易,将资金发送道由通道的两方控制的多签名地址中。要想移动这个地址中的资金,双方都要提供签名。在一定的意义上,这个地址就是相应的闪电通道在链上的表示。 ↩
2. 这话不应该那么绝对。我非常尊敬像 BlueWallet 这样的钱包(链上部分是非托管的,带管理的闪电钱包是托管的)。 ↩
3. 只要一笔交易还没被包含进某个区块中,就可以通过另一笔花费相同的 UTXO 但支付更高手续费的交易来取消它。 ↩
4. 当然,还有别的办法可以欺骗用户。比如,钱包供应商的 app 是恶意的、会给用户显示虚假信息。但这不会发生在开源软件上,不是吗? ↩
(完)