区块链/等级 V · 分层扩展/5.1 闪电网络(Lightning)/课程 3
发票:BOLT11 和 BOLT12
从一次性字符串到可重复使用的 offer,以及弥合两者差距的 Web 服务器
材料一种能够解码发票的闪电钱包可通过浏览器使用的公共 BOLT11 解码工具一张 BOLT11 发票样本和一个 BOLT12 offer 字符串
好奇
- 为何那些一小时后就到期的付款请求会迫使商家不断重新生成?
- 静态二维码如何能多年保持有效,同时仍为每笔交易生成唯一且安全的发票?
- 在转账之前,哪些具体的数据字段能让钱包确认发票未被篡改?
探索
- BOLT11 发票是一个以“lnbc”开头的 bech32 字符串,封装了所有必要的支付参数。它编码了可选的金额(以比特币计,带一个乘数字母,可精确到聪的分数)、由秘密原像派生出的特定支付哈希,以及默认为一小时的过期时间戳。收款节点的公钥用于标识目的地,而可选的路由提示可在没有直接通道时为付款方提供指引。整个字符串由收款方签名,以确保其完整性。
- 这一架构使 BOLT11 发票严格只能使用一次。一旦发送方支付了相应的支付哈希,该发票即被结算,无法再次兑付。重复支付是不安全的:第一次支付后,该路由上的每个节点都知道了原像,因此其中任何同样位于第二次支付路由上的节点都可能截取这笔款项。这一限制使零售场景必须使用动态二维码,商家必须为每位顾客生成新的字符串,这使销售终端硬件变得更加复杂。
- 社区开发者通过 LNURL 和闪电地址(Lightning Address)缓解了这一摩擦,这两者都依赖外部 Web 服务器。用户扫描一个指向服务器端点的静态 URI;钱包在发起支付前,会先从该服务器获取一张新的 BOLT11 发票。这将公开地址与具体的交易数据解耦,使单个链接即可承接无限次支付,同时在后台保持唯一、一次性发票的安全性。
- BOLT12 offer 由 Rusty Russell 设计,于2024年被纳入规范,它将这一流程内置到协议中。这些可重复使用的支付码以“lno”开头,作为收款节点的静态标识符。被扫描后,付款方的钱包会直接通过闪电网络发送一条洋葱消息,从 offer 创建者处获取一张新发票。这消除了对外部 Web 服务器的依赖,把请求生成整合进核心协议之中。
- BOLT12 offer 支持 BOLT11 所没有的功能,包括由商家向用户付款的流程,例如退款或提现(周期性支付曾被起草,但已从合并后的规范中移除)。offer 还可以使用盲化路径,在通道图中隐藏接收节点,而不必公开其公钥。与直接暴露路由提示或备用地址的标准发票相比,这种设计减少了隐私泄露。
- 自发支付使用 keysend 或 AMP(原子多路径)协议完全绕过发票,发送方无需事先请求,即可将资金推送到已知的节点密钥。如需亲手验证,可将任意一张闪电发票粘贴到公共 BOLT11 解码器中,找出其中的人类可读前缀、金额、支付哈希、过期时间和收款方签名。再与一个“lno”字符串对比:它不包含支付哈希,只包含付款方请求发票所需的信息,即节点 ID 或通往该节点的盲化路径。
关键事实
- BOLT11 发票是以“lnbc”开头的一次性 bech32 字符串,编码了金额、哈希和签名。
- LNURL 和闪电地址(Lightning Address)借助 Web 服务器,通过静态链接获取新的 BOLT11 发票。
- BOLT12 offer 以“lno”开头,通过闪电网络上的洋葱消息生成唯一的发票。
- BOLT12 offer 可重复使用,并支持退款等由商家向用户的付款,而 BOLT11 不支持。
- BOLT11 发票的默认过期时间为一小时(3600秒)。
- Keysend 允许在没有发票的情况下,直接向节点的公钥进行支付。
练习 九、六、三、一
9收集列出数字金融中使用的9种不同的支付请求格式或标识符,范围从传统的银行转账代码到现代的加密货币标准。同时注明每种格式是仅能使用一次还是可以重复使用。
6归类按处理唯一性的方式将这9种分为6类:静态可复用、动态一次性、由服务器中转实时获取、协议原生实时获取、基于密钥的自发支付,或其他。
3提炼将这6组因素简化为用户便利性(静态代码)与加密安全性(唯一哈希值)之间的3种核心权衡。
1凝结写一句话,解释为什么 BOLT12 offer 让可复用支付流程不再需要外部 Web 服务器。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。