跳转到正文
buybitcoinsmart

术语表 /闪电网络与 Layer 2

LNURL

LNURL 是什么?
LNURL 是一系列小型网络协议,可让闪电网络钱包通过一个编码链接,从服务器获取新的发票、提币请求或登录验证请求。

闪电网络发票会过期,且只能支付一次,因此不便打印或公开发布。LNURL 的解决办法是在发票前加一层 HTTPS 请求:在您要付款的那一刻,钱包才向服务器索取付款请求。相关规范独立于 BOLT 之外,编号从 LUD-01起。

运作方式

LNURL 把静态链接变成钱包与服务器之间的实时交互。

关键就在链接本身。在最初的形式 LUD-01中,一个 HTTPS URL 经 bech32 编码并加上 lnurl 前缀,得到一串字符,可以打印成二维码,也可以输入聊天窗口而不受影响。较新的 LUD-17形式不再编码,而是在普通 URL 前加上 lnurlp:之类的简单协议前缀,更短,也更便于调试。无论哪种形式,钱包都会解码链接,发出 GET 请求,并收到一段 JSON,说明这是哪一类交互。

该 JSON 中的 tag 字段决定后续的一切。LUD-06定义了 payRequest,即付款流程:服务器返回一个回调 URL、以毫聪计的 minSendable 和 maxSendable,以及一段由钱包显示的元数据字符串。您选择金额后,钱包带着该金额回调,服务器随即返回一张恰好对应该金额的新生成的 BOLT11 发票。LUD-03定义了 withdrawRequest,方向相反:服务器提供资金,钱包提供用于收款的发票。LUD-02向对等节点请求开通通道。LUD-04定义了 auth,钱包用按域名派生的密钥对验证请求签名,一些闪电网络网站正是以此让您无需密码即可登录。

值得了解的安全特性范围有限。LNURL 保证发票来自链接中的域名,且金额与您批准的一致,因为钱包会在付款前核对返回的发票。但对于谁控制该域名,它不作任何保证。扫描贴在真实二维码上方的 LNURL 码(例如在市集摊位上),付款会进入攻击者的服务器,而且付款会完全按设计成功完成。

在哪里会遇到它

大多数人用过 LNURL,却从未见过这个词。

打赏和捐款页面在二维码背后使用 LNURL-pay,因此同一个打印出来的二维码可供一百位不同的顾客以一百种不同的金额付款。比特币大会的赠品和水龙头卡使用 LNURL-withdraw:您扫码后,钱包会在后台生成发票,聪随即到账,全程看不到任何发票。一些闪电网络钱包和网络服务把 LNURL-auth 作为其全部登录系统。

最大规模的部署是间接的。闪电地址(user@domain 形式)在 LUD-16中定义,并直接建立在 LNURL-pay 之上:该地址会被转换为一个 well-known HTTPS 路径,此后的流程就是普通的 LUD-06。如果您的钱包支持闪电地址,它就已经支持 LNURL。

主要的注意事项是可用性。由于中间有一台网络服务器,LNURL 码的可靠程度取决于该服务器及其 TLS 证书。BOLT11 发票一旦生成,即使服务器离线也能支付;LNURL 链接则不能。

LNURL vs BOLT11 发票

LNURL 是获取付款请求的一种方式;BOLT11 发票本身就是付款请求。仅这一点差别就决定了二者的特性。发票自成一体,由收款节点签名,在设定时间内有效,且只能支付一次。LNURL 链接不含金额、付款哈希或签名,长期有效,可供任意数量的付款方使用,因为每个付款方都会触发一张新发票。打印一张发票,一小时内就会失效。打印一个 LNURL 码,只要该域名仍在运行,它就一直有效。

请勿混淆

常见问题

LNURL 是闪电网络规范的一部分吗?

不是。BOLT 定义的是闪电网络协议本身,而 LNURL 是另一套文档,编号从 LUD-01起,在其自己的代码库中维护。钱包是否支持由各钱包自行决定,情况不一。

扫描 LNURL 码安全吗?

它能防篡改,但不能防替换。您的钱包会核实发票来自链接中的域名,且与您批准的金额一致,但如果二维码被实物换成攻击者的,付款仍会完全按设计支付给攻击者。

相关术语

闪电网络与 Layer 2中的更多术语

阅读本页英文版