LNURL 是什么:闪电收款二维码背后的动态请求层 图 1
LNURL 是什么:闪电收款二维码背后的动态请求层 · 图 1

在咖啡店扫一个闪电收款码,二维码里装的既不是比特币地址也不是几十位的 BOLT11 发票,而是一串 lnurl 开头的短链接。这个让闪电收款二维码变得“又短又小又好用”的胶水层,从来不是闪电网络的正式协议标准,却几乎是每个闪电钱包的必备功能。本文讲 LNURL 补上了什么洞、它的几种典型玩法、以及每次扫码背后那次容易被忽略的服务器请求。

发票太长,二维码太挤

BOLT11 发票把金额、收款方、过期时间等全部编码进一个字符串,动辄几百字符——塞进二维码就变成密密麻麻的高密度图案,扫码枪和低端摄像头经常失败;如果金额还没定(比如“输入你想付的数额”),固定发票根本没法提前生成。LNURL 的思路是把“生成发票”这一步从二维码里挪到网络上:二维码只编码一个 https 端点(或它的 bech32 编码形式,就是你看到的 lnurl1 长串),钱包扫码后向那个端点发一个 GET 请求,服务端再实时决定金额、生成发票、返回结果。二维码因此从“静态的长发票”变成“短小的动态接口指针”。

四种常见玩法

最常用的是 LNURL-pay:一个码可以对应“让付款人选金额”“固定金额”“按订单查询”等多种模式,服务端在钱包请求时才返回具体发票。反向的 LNURL-withdraw 让收款变提款:服务商生成一个提取码,用户钱包扫码后反而从服务商那里领走一张发票——常见于水龙头、返现和空投发放(防重复领取的机制在服务商侧)。LNURL-auth 把闪电身份密钥改造成一次性登录凭证:网站发一个挑战,钱包用派生自种子的私钥签名回一个 pubkey,全程没有密码,也没有可拖库的口令表。LNURL-channel 与 LNURL-channel-auth 则把“扫码为你开一条通道”自动化,常见于钱包首次收款时引导你向服务商借入流动性。这套规范在闪电生态的 GitHub 组织里以实现社区规范的形式维护,从未进入 BOLT 基础协议——它是钱包与服务生态的事实标准,而不是节点的共识义务。

每次扫码,谁看见了什么

这是 LNURL 最常被隐私讨论的一点:动态码意味着钱包必须向某个服务器发起一次带参数的 HTTPS 请求,才能拿到发票。收款方是商家系统时,它自然知道你何时扫了码、用什么钱包(user-agent 与 IP 都在请求里)。这与“你主动联系了对方的付款接口”相当,多数场景可接受,但和 BOLT12 那种把收款信息全部塞进可离线传播的 offer、无需先联系服务器的设计形成对照。两种路线的哲学差异:LNURL 用服务器换灵活性,BOLT12 用更大的编码换离线与抗审查。另外要注意,闪电地址(name@domain)本质是 LNURL 的邮件式糖衣——钱包把域名拼成 https 端点再走同一套流程,理解 LNURL 就看懂了闪电地址。

安全边界:把域名当收款人核对

LNURL 把信任锚点从“地址字符串”挪到了“域名”。这带来两类新风险:域名拼写钓鱼(指向仿冒服务商的端点)与恶意服务端(返回钓鱼请求或钓鱼发票)。防御纪律和链上交互同构:扫码后核对钱包回显的收款方域名与金额、确认金额来源(固定额还是自填额)、对“扫一下就能领钱”的 withdraw 码尤其警惕——领钱动作常伴随一次数据提交或一条签名请求。对普通用户,选择把 LNURL 请求与发票展示都做二次确认的钱包,比理解全部细节更实际。

常见误区

一是把 LNURL 当成“闪电网络协议”:它位于 BOLT 之上、应用层之下,不依赖它就收不了款是钱包产品层的实现选择,不是共识层的规则。二是把 lnurl1 编码串误当成比特币地址复制转账——两者编码规则完全不同(前者是 bech32 包着一个 URL),链上地址不存在于其中。三是认为动态码“比静态发票更安全”:动态码引入服务器信任面,静态 BOLT11 的防伪性更强(发票本身有签名),优劣取决于场景而不是方向性的“新优于旧”。

风险提示:本文为支付协议机制科普,不构成任何投资建议;各钱包对 LNURL 各扩展的支持范围不同,以当期官方文档为准。