非托管的闪电网络移动钱包

Nov 13, 2022 at 23:13:26

闪电网络协议的问题和第一代钱包

2017年ACINQ推出了闪电网络钱包Eclair,我曾介绍过这个钱包。他是一个完全非托管的闪电网络钱包,在手机上运行一个标准的BTC客户端,再在上面运行闪电网络。Eclair完全照搬了闪电网络的完整实现,只是平台从PC搬到了手机。这带来了很多问题。

闪电网络需要客户端维持通道(Channel)状态,需要时不时进行通讯,太长时间不活跃的通道,可能会被对方Close掉,产生手续费。另外通道状态存储在客户端,需要时不时备份,否则一旦丢失了通道信息就再也找不回来。实际上,闪电网络协议本身并不适合移动平台。

这只是一方面。另一方面闪电网络协议本身也说不上好用,最经典的问题是,闪电网络客户端如果要进行收款,首先得有通道,通道里得有余额,但是闪电网络钱包创建之初是没有余额的,没有余额就需要收款,收款需要通道有余额。变成了一个鸡生蛋蛋生鸡的问题。另外也可以找其他节点反过来开启通道并充值,这显然更不现实。

正常情况下,一个闪电网络钱包要收款,如果不是对方主动开启通道,那么至少需要做三个操作:

  1. 在链上充值BTC,等待漫长的区块确认
  2. 和某个对端开启闪电网络通道,存入BTC
  3. 通过闪电网络发送出去一些BTC(没错,得先发出去)

完成这三步,才可以通过闪电网络收款。收款的上限额度是第三步发出去的BTC的数量。也就是说,要用闪电网络收款,必须先用闪电网络付款。这个问题是使用闪电网络最大的障碍。

第二代钱包

为了解决这些问题,2019年ACINQ又推出了第二代闪电网络客户端Phoenix。总的来说,Phoenix带来了几个改进:

  1. Pay-to-open。新创建的钱包也能直接收款。
  2. 通道创建之后,不用等待区块确认,直接就能使用。
  3. 通道备份功能。使用助记词恢复。
  4. 多通道余额叠加使用。
  5. Trampoline payments,提升支付体验
  6. 自动转换链上链下交易,不用维护链上和闪电网络两份余额

具体的改进可以看官方介绍:https://medium.com/@ACINQ/introducing-phoenix-5c5cc76c7f9e

其中第一点解决了上面说的问题。用户新创建的钱包,也能直接收款(有最低限额,且收取1%手续费)。不再需要繁琐的充值操作。

怎么实现的?

第一次使用的时候,我觉得这些特性很神奇,要知道闪电网络协议本身没有改变,Phoenix在背后做了什么?

  1. Phoneix只会和ACINQ官方节点建立通道
  2. 所有的通道都由ACINQ官方节点来开启和充值,用户不能自行充值,开启通道的过程用户需要信任ACINQ,通道确认后不再需要信任
  3. 链上链下的资产互换做不到去信任化,用户必须信任ACINQ

因为Phoneix只会和ACINQ做通道,ACINQ能够实时监控通道的状态,自动识别交易、自动发起充值、调整手续费等,实现了原本协议不能实现的能力。

另外可以看到,开启通道的过程、链上链下资产互换都是需要用户短暂信任ACINQ。并不是完全去信任化。但是在通道开启之后,绝大多数场景下,用户不再需要信任ACINQ。用户自己持有非托管的钱包、自己掌握钱包密钥、自己维护闪电网络通道。

最后得到了什么?

通过这一系列的“折中”,Phoneix实现了一个【大部分时间】去信任化的闪电网络钱包。

优点:

  1. 用户掌握私钥,非托管的闪电网络移动钱包
  2. 界面清晰简单,不再像Eclair过于复杂,用户只用关心“收款”、“付款”
  3. 即便ACINQ倒闭,钱包的资金安全不会受影响
  4. 钱包丢失可以通过静态的助记词完整找回,通道状态也能找回,不再需要随时备份
  5. 用户开通钱包之初便可以收款,不再需要繁琐的前置操作

缺点:

  1. 在开通道等部分场景下,需要短暂信任中心端
  2. 只能和ACINQ做通道,服务可用性依赖ACINQ,如果ACINQ服务器关闭,钱包也就不能使用(虽然资金仍然安全,可以通过链上转移出来)

总的来讲,Phoneix带来了一款完全可以日常使用的闪电网络钱包,使用体验已经和普通BTC钱包无异。另一方面,做出了安全性的妥协,不再像Eclair是100%的去信任化。

个人认为,作为BTC小额支付的终端,Phoneix已经完全可以胜任,便捷程度带来的安全性折中基本可以接受。

在此之外,还有Muun等几款闪电网络钱包,也基于类似的原理,通过或多或少的折中,实现了同等便捷的钱包体验。他们为闪电网络的普及带来了一些可能性。