作者:VLS

来源:https://vls.tech/posts/lightning-custody-models/

摘要

  • 闪电网络钱包和闪电网络服务商(LSP)的现状,究竟什么是真正的 “非托管”。
  • 在比特币 Layer 1 上,持有密钥就意味着自主保管。而在闪电通道中,即使你持有密钥,如果你的签名器会盲目地许可支付请求而不验证,节点被攻陷也可能导致你资金丢失 —— 这是共享托管模式。
  • 盲目签名既不是非托管,也不安全。它创造了两个故障点(节点和签名器)。只要任何一个被攻陷了,资金都会丢失。
  • “VLS(带验证的闪电通道签名器)” 为分离私钥和节点提供了真正非托管的解决方案。节点被攻陷也不会导致资金丢失。

闪电钱包的承诺与问题

你仔细地研究和挑选 “非托管的” 闪电钱包,因为你相信 “无私钥,即无币”。你精心地保护你的种子词

直到有一天,你起床后发现自己的通道已经关闭了,应当属于你的比特币被发送到了你不知道的地址。而程序的日志显示你的签名器授权了所有东西。你的比特币就这么飞走了。你的 “自主保管的” 钱包就这么欺骗了你。

闪电钱包承诺要在即时支付上实现比特币的自治原则。但有些地方出了问题。

你的钱包软件可能会自称是 “非托管的”, 因为 “你自己持有私钥”,然而,如果你的签名器会盲目地许可请求而不验证,那到底是谁控制着你的钱?

这就是盲目签名的真相,是闪电钱包的肮脏秘密。

什么是闪电钱包里的 “盲目签名”?

闪电钱包里有两个模块:

  • 节点,负责提议状态变更(增减余额);
  • 签名器,决定这些更新是否可以安全地签名(许可)。

在一个妥当的非托管装置中,签名器会根据协议的规则和用户条款,在签名之前验证每一次请求。

而在 “盲目签名” 模式中,闪电钱包的私钥本身与节点隔离,然而,签名器会盲目地许可节点的请求,也就是完全不验证请求的内容。这是因为,盲目签名器可以在格式正确的交易上签名,但并没有足够的信息来分辨安全的请求和不安全的请求。

将一个盲目签名器标榜为 “非托管的”,就好像一家银行说自己是非托管的,因为它不知道你的银行卡口令。不设验证的签名器不是控制器,而是威胁。

用户有权知道真相:盲目签名模式是共享托管,它实际上比一些托管解决方案还要危险一些。多年来,闪电钱包技术公司一直将盲目签名的解决方案伪装成 “非托管” 或 “自主托管”。

硬件钱包测试

设想一个比特币硬件钱包,它会签名任何交易而不检查找零地址、手续费和支付目的地。你会管这样的钱包叫 “非托管” 钱包吗?你会信任它?

这就是闪电钱包的盲目签名模式。

为什么盲目签名比热钱包还要糟糕?

纯托管:1 个攻击点(托管商)
盲目签名:2 个攻击点(节点 + 盲目签名器)
热钱包:1 个攻击点(设备)
VLS:1 个加强后的攻击点(带有验证程序的签名器)

盲目签名,让你可能受到攻击的界面倍增(字面意义上的倍增),而且依然是托管的。只要节点或者签名器被攻陷,你就可能丢失资金。我们专门指出这一点,是因为用户有权利知道真相。

热钱包的用户至少知道自己在承担风险。盲目签名的用户却因为 “自己控制着私钥” 而误以为自己是安全的。

可能的攻击形式

每一种爆破都从某个点开始。以下是漏洞如何转化为盗窃:

场景 1:供应链 -> 攻陷节点 -> 恶意关闭通道

攻击者修改节点的依赖项,获得节点的控制权 ->

节点请求:“关闭通道,将资金发送到攻击者的地址” ->

盲目签名器:无法验证地址 -> 许可 ->

资金被盗

场景 2 :社会工程学攻击 -> LSP 访问权 -> 陈旧状态

攻击者假装成用户,向服务支持团队声称自己需要 “紧急修复” ->

获得节点访问权,广播旧的通道状态 ->

盲目签名器:无法识别这是陈旧状态 -> 许可 ->

惩罚交易取走所有资金

场景 3:内部威胁 -> 手续费操纵

恶意雇员或已被攻陷的基础设施 ->

节点为每一笔交易设置超量的手续费 ->

盲目签名器:无法验证数额 -> 许可 ->

资金被缓慢吸干

带有验证程序的签名器将拒绝所有这些请求,而盲目签名器会同意所有这些请求

为什么闪电钱包的托管模式与比特币钱包的不同

在比特币 Layer 1 上,自主保管是非常直接的。你的硬件钱包(冷钱包)通过检查地址、手续费和找零地址来检查每一笔交易,然后才签名。这种验证程序与对私钥的控制相配合,使之成为自主保管的。你的私钥旧意味着你的钱币。

比特币的冷钱包模式无法直接移植到闪电钱包中,因为:

  • 通道状态会持续更新:与比特币钱包中地址保持静态不同。
  • HTLC 有截止时间:错过这个截止时间意味着丢失资金。
  • 惩罚需要快速响应:如果对手广播过时的通道状态,己方必须立即响应。
  • 路由支付需要在亚秒级时间内完成签名:冷钱包太慢了。

这些要求意味着,早期的闪电钱包实现都要求你运行自己的节点并使用热私钥(即两者是合在一起的),这对用户来说太复杂,也有风险。

LSP:创造了新问题的解决方案

“闪电网络服务供应商(LSP)” 是为着解决闪电钱包的易用性危机而出现的。运行一个闪电节点需要专门的技术知识、持续监视、同盖茨管理和流动性提供。LSP 可以为用户处理所有这些复杂性,也确实值得赞誉。这是一个巨大的用户体验升级。

然而,为了使用 LSP,同时保持 “非托管”,整个行业采用了盲目签名模式。这个补丁很简单:由 LSP 来运行你的节点,而你保管你的私钥。有私钥、就有币,不是这样的吗?

根本不是。当你的私钥会盲目签名 LSP 的节点请求而不加验证时,你实际上是在信任 LSP 不会偷你的钱。这不是自主保管,充其量是共享保管。

讽刺之处在于:LSP 让闪电钱包变得可用,而盲目签名又让它变得不安全,比热钱包和托管服务都要不安全。你得到的是没有控制杆的复杂性。

好消息是:LSP 的便利不是非付出这样的代价不可。带验证的签名就可以解决这个问题。

译者注:文中所述的这种对 LSP 的用法,应该只是其中一种,甚至可能不是主要的用法。

VLS 如何修复这个问题

“VLS(带验证的闪电钱包签名器)” 实现了每个闪电钱包签名器都应该做到的事:在签名之前先验证。

在签名任何东西之前,VLS 都会检查:

协议兼容性

  • 这是一个陈旧的状态吗?是 -> 拒绝
  • HTLC 的余额匹配吗? 是 -> 通过
  • 交易的手续费数额合理吗? -> 检查限制
  • 支付目的地得到过许可吗?是 -> 通过

用户条款

  • 支付数额在限制之内
  • 关闭通道的支付地址在许可列表上
  • 阻挡不常见的使用模式
  • 大额交易需要额外许可

独立验证

  • 专门验证区块链状态
  • 独立跟踪通道状态
  • 监视时间锁过期
  • 交叉检查节点声明

VLS 在行动

盲目签名器VLS
节点“关闭通道,将资金发送到地址 X”“关闭通道,将资金发送到地址 X”
签名器动作“收到!签名!”“X 是不是白名单上的地址?交易表示最新状态吗?数额对不对得上?”
结果资金可能被盗恶意请求被阻拦,资金安全

证明这真的有用:Blockstream Greenlight 钱包

Greenlight 证明了 VLS 可以大规模应用:

  • 架构:Blocsteam 运行节点,用户通过 VLS 控制验证
  • 跟踪记录:没有资金因为节点被攻陷而丢失
  • 安全性:节点被攻陷也无法盗窃资金
  • 性能:亚秒级验证,不影响用户体验
  • 用户:数千名用户用上了真正的自主保管

这种模式证明了你可以获得 LSP 的便利性,并且在托管上无需牺牲。这里更加详细了讲解了为什么 Greenlight 选择了 VLS 以及他们的集成经验。

闪电钱包的四种托管模式

了解你用的闪电钱包落在光谱的哪个位置,是极为关键的:

1. 完全托管

你持有:空气

他们持有:私钥 + 节点

保管程度:0%(他们控制着所有东西)

攻击界面:1 个点(托管商)

案例:绝大部分交易所钱包

适合用户:初次尝试用闪电网络来买杯咖啡的用户

2. 共享托管:盲目签名

你持有:私钥,但它盲目签名

他们持有:请求签名的节点

保管程度:大约 50%,共享托管:双方都需要对方,但是节点可以欺骗签名器

攻击界面:2 个点(节点 或者 签名器 被攻陷 = 资金丢失)

案例:许多 “非托管的” LSP 钱包

事实检查:比完全托管更糟 —— 更复杂、更多攻击界面、依然需要信任

3. 自主保管的热钱包

你持有:私钥 + 节点,放在同一个设备上

他们持有:无

保管程度:100%(你控制着所有东西)

攻击界面:1 个点(你的设备)

案例:Zeus(使用本地节点模式)、Phoenix(自主保管)

适合用户:习惯热钱包风险的专业用户

4. 使用带验证签名器(VLS)的自主保管钱包

你持有:私钥 + 验证逻辑

他们持有:节点(但无法偷盗)

保管程度:100%(节点可以提议,但只有你才能许可)

攻击界面:1 个加强点(带有验证逻辑的签名器)

案例:Blockstream 的 Greenlight,使用 VLS

适合用户:任何投入具有重要意义资金数量的用户

现状:谁是真正的非托管?

以下是关于闪电钱包和 LSP 在托管模式光谱具体位置的表格。你可以看看多少 “非托管” 的服务实际上使用了盲目签名模式。营销口号不一定跟技术事实相匹配!

(表格请见原文,此处不附。)

如何检查你当前使用的钱包是什么模式

询问你的闪电钱包供应商以下几个问题:

问题 1:“如果你的 服务器/节点 今天被劫持了,攻击者能否偷走我的钱?”

“不能,因为验证程序保护了它” -> 带有验证的签名器的自主保管钱包

“不能,因为私钥在你手上” -> 盲目签名钱包警告

“是的,你会丢钱” -> 至少他们是诚实的

问题 2:“签名器在签名之前,会执行哪些具体的检查?”

详细的验证清单 -> 真正的自主保管

“它会签名你授权的东西” -> 盲目签名

含糊其辞的安全口号 -> 盲目签名

问题 3:“我的通道关闭时,剩余的余额可以发送到任何地址吗?”

“只能发送到你限定的地址” -> 带有验证

“将发送到你签了名的任何地址” -> 盲目签名

为你的资金选择正确的托管模式

买一杯咖啡的钱

  • 完全托管钱包也没啥 —— 简单,而且在信任模式上是诚实的
  • 避免盲目签名模式 —— 这是不必要的复杂性

日常开支

  • 热钱包,如果你懂技术的话
  • 如果你不懂技术,选择高质量的托管 LSP
  • 明确规避盲目签名的风险

不小的钱

  • 只使用带有验证签名器(比如 VLS)的自主保管钱包
  • 热钱包也可以,只要你确定自己知道相关的风险
  • 永远不要使用盲目签名钱包

企业用户/交易所保证金

  • VLS 是唯一负责人的选择

除非钱的数目小到你丢了也无所谓,否则就不要使用盲目签名模式。它会让攻击界面倍增,比其它选择都更危险。

呼吁开发者行动:不要发布盲目签名器

使用哪种装置?

  • 我是一家企业或者 app 的开发者,只想要一个安全的闪电钱包装置,不想做繁重的基础设施

    -> 使用一个由 VLS 赋能的带设施非托管供应商Blockstream 的 Greenlight 或者 Breez SDK

  • 我希望控制我自己的闪电节点,但不希望从头开发所有东西

    -> 使用 CLN + VLS ;安全又灵活,无需完全定制的插件。

  • 我希望完全控制权以及深入的集成灵活性

    -> 使用 LDK + VLS ;适合定制化的部署。

- - -

使用哪种闪电钱包技术栈?

选择你的起点:

  • CLN + VLS

    使用我们的 vls-hsmd 插件来转发来自 Core Lightning 节点的签名请求。

  • LDK + VLS

    通过 vls-proxy 库,集成到你的基于 LDK 的节点。

  • Docker 沙盒

    使用 Docker 运行 CLN + VLS + Bitcoind 。非常适合测试。

  • LND 或 Eclair

    尚未支持 VLS 。请帮忙向 LND 和 Eclair 请求支持 VLS:

没有技术上的借口再使用盲目签名器了。VLS 是 Apache 许可的开源软件,而且准备好进入生产环境了。

你的行动:要求真正的自主保管

闪电钱包生态已经将持有私钥与控制资金混淆了太久了。盲目签名是带有额外步骤的共享托管,并非自主保管。

VLS 证明了,真正的自主保管闪电钱包是可以做到的。不要再找借口,不要再用盲目签名模式。

前进的道路

闪电网络的未来取决于我们对待托管模式的诚实。我们请求:

用户

  1. 理解你真正信任的东西
  2. 选择与你的风险偏好相匹配的托管模式
  3. 向钱包供应商要求透明性
  4. 用你的聪投票:支持真正的自主保管

开发者

  1. 别再把盲目签名叫做 “非托管”
  2. 实现验证逻辑,或者在托管模式上诚实
  3. 在真正的安全性上竞争,而不是打营销战
  4. 区分出真正的非托管产品

闪电网络生态

  1. 将带验证签名确定为行业最低标准
  2. 指出盲目签名的实质:共享托管
  3. 用户将真正的自主保管放在优先地位的项目
  4. 完全淘汰盲目签名

现在你知道真相了:那么你会怎么做呢?

  • 今天:使用我们的问题来检查你当前使用的钱包
  • 这周:如有需要,移动资金到带有验证的非托管钱包
  • 未来:要求透明性,支持真正的解决方案。

没有验证,你的私钥就不控制你的钱币。请做出明智的选择。

(完)