跳至主要內容
進階

LNURL 協議

了解 LNURL 協議套件如何通過 HTTP 服務簡化閃電網路的用戶體驗,包括 LNURL-pay、LNURL-withdraw 和 Lightning Address。

15 分鐘

什麼是 LNURL?

LNURL 是一套建立在 HTTP/HTTPS 之上的協議,旨在改善閃電網路的用戶體驗。 它通過 bech32 編碼的 URL 讓錢包可以與服務進行標準化的互動, 支持支付、提款、登入認證等多種場景。

核心理念: LNURL 將 BOLT 11 發票的「單次使用」模式擴展為可重用的服務端點, 用戶只需掃描一個靜態的 QR 碼就能完成各種操作。

LNURL 編碼

LNURL 編碼格式:

原始 URL:
https://example.com/api/lnurl?q=abc123

Bech32 編碼後:
LNURL1DP68GURN8GHJ7MRWW4EXCTNXD9SHG6NPVCHXXMMD9AKXUATJDSKHW6T5DPJ8YCTH

特點:
- 使用 bech32 編碼(與比特幣地址相同)
- 人類可讀部分:LNURL
- 內建錯誤檢測
- 不區分大小寫(方便手動輸入)

解碼流程:
1. 識別 LNURL 前綴
2. Bech32 解碼
3. 得到原始 HTTPS URL
4. 錢包請求該 URL

LNURL 子協議

LNURL-pay

允許用戶向靜態端點支付,服務端動態生成發票:

LNURL-pay 流程:

1. 錢包掃描 LNURL
         │
         ▼
2. GET 請求服務端
   GET https://example.com/lnurlp/alice
         │
         ▼
3. 服務返回支付參數
   {
     "callback": "https://example.com/lnurlp/alice/pay",
     "tag": "payRequest",
     "minSendable": 1000,      // 最小 1 sat (毫聰)
     "maxSendable": 100000000, // 最大 100,000 sats
     "metadata": "[["text/plain","Pay to Alice"]]",
     "commentAllowed": 140     // 可選:允許備註
   }
         │
         ▼
4. 用戶選擇金額(如 10,000 sats)
         │
         ▼
5. 錢包請求發票
   GET callback?amount=10000000&comment=Thanks
         │
         ▼
6. 服務返回發票
   {
     "pr": "lnbc100u1p...",  // BOLT 11 發票
     "routes": [],
     "successAction": {      // 可選:支付成功後的動作
       "tag": "message",
       "message": "Thank you!"
     }
   }
         │
         ▼
7. 錢包支付發票

LNURL-withdraw

允許用戶從服務提款(如領取紅包、獎勵等):

LNURL-withdraw 流程:

1. 掃描提款 LNURL
         │
         ▼
2. GET 請求
   GET https://example.com/lnurlw/voucher123
         │
         ▼
3. 服務返回提款參數
   {
     "callback": "https://example.com/lnurlw/voucher123/claim",
     "tag": "withdrawRequest",
     "k1": "random_challenge",
     "minWithdrawable": 1000,
     "maxWithdrawable": 50000000,
     "defaultDescription": "Withdraw from Example.com"
   }
         │
         ▼
4. 用戶選擇金額
         │
         ▼
5. 錢包生成發票,發送給服務
   GET callback?k1=...&pr=lnbc500u1p...
         │
         ▼
6. 服務支付發票
   {
     "status": "OK"
   }
         │
         ▼
7. 用戶收到款項!

LNURL-auth

使用閃電網路密鑰進行無密碼登入:

LNURL-auth 流程:

1. 網站顯示 LNURL-auth QR
         │
         ▼
2. GET 請求
   GET https://example.com/lnurlauth?tag=login&k1=challenge
         │
         ▼
3. 錢包解析登入請求
   {
     "tag": "login",
     "k1": "32_byte_random_challenge"
   }
         │
         ▼
4. 錢包派生特定網站的密鑰對
   linkingKey = derivePath(domain, walletSeed)
         │
         ▼
5. 簽名挑戰並發送
   GET callback?sig=signature&key=linkingPubKey
         │
         ▼
6. 服務驗證簽名
   - 驗證 sig 對 k1 有效
   - 記錄 linkingPubKey 為用戶身份
         │
         ▼
7. 登入成功!

安全特性:
- 每個網站有唯一的 linkingKey(隱私保護)
- 不洩露真實的節點公鑰
- 無需密碼,不可釣魚

LNURL-channel

請求服務端開設通道給用戶:

LNURL-channel 流程:

1. 掃描通道請求 LNURL
         │
         ▼
2. 服務返回通道參數
   {
     "tag": "channelRequest",
     "uri": "nodeId@host:port",
     "callback": "...",
     "k1": "..."
   }
         │
         ▼
3. 錢包連接到服務節點
         │
         ▼
4. 請求開通道
   GET callback?k1=...&remoteid=walletNodeId&private=1
         │
         ▼
5. 服務開設通道給用戶

用途:
- 新用戶快速獲得入站流動性
- 交易所提供通道服務
- LSP 服務

Lightning Address

Lightning Address 是 LNURL-pay 的人類可讀形式,看起來像電子郵件地址:

Lightning Address 格式:

地址:[email protected]

解析流程:
1. 錢包識別 Lightning Address 格式
2. 將地址轉換為 LNURL-pay 端點:
   https://example.com/.well-known/lnurlp/alice
3. 後續流程與 LNURL-pay 相同

設置要求:
- 網站需要在 /.well-known/lnurlp/ 路徑
- 提供標準的 LNURL-pay 響應
- 支援 HTTPS

優勢:
- 易於記憶和分享
- 類似電子郵件,用戶熟悉
- 可以印在名片上
- 靜態地址,不需要更換

示例服務:
- Wallet of Satoshi
- Strike
- Alby
- 自建 LNbits

Success Actions

LNURL-pay 支持在支付成功後執行動作:

message

顯示純文字訊息,如感謝信。

{"tag": "message", "message": "..."}

url

提供連結,如數位商品下載。

{"tag": "url", "url": "..."}

aes

AES 加密的數據,使用 preimage 解密。

{"tag": "aes", "ciphertext": "...", "iv": "..."}

LNURL vs BOLT 12

特性 LNURL BOLT 12
傳輸層 HTTPS (HTTP/TLS) Onion Messages
依賴 Web 服務器 閃電網路節點
隱私 服務端知道 IP 洋蔥路由隱私
離線運作 需要服務端在線 可完全離線
採用狀態 廣泛採用 逐步推進
額外功能 登入、提款 退款、訂閱

安全考量

風險

  • • 服務端可能記錄 IP 和支付資訊
  • • DNS 劫持可能導致資金損失
  • • 中心化服務有單點故障風險
  • • TLS 憑證問題可能被利用

緩解措施

  • • 必須使用 HTTPS
  • • 驗證域名和憑證
  • • 使用 Tor 保護 IP
  • • 自建服務保持控制

錢包支援

Zeus Full
Breez Full
Phoenix Partial
Wallet of Satoshi Full
BlueWallet Full
Alby Full

自建 LNURL 服務

常用工具:

1. LNbits
   - 完整的 LNURL 插件
   - 支援所有子協議
   - https://lnbits.com

2. lnurl-node
   - Node.js 庫
   - 方便集成到現有應用
   - npm install lnurl

3. satdress
   - Lightning Address 服務
   - 自託管
   - https://github.com/fiatjaf/satdress

4. LNDhub + BlueWallet
   - 託管錢包解決方案
   - 支援 LNURL

簡單 LNURL-pay 端點範例(Node.js):
app.get('/.well-known/lnurlp/:username', (req, res) => {
  res.json({
    callback: `https://${domain}/lnurlp/${req.params.username}/pay`,
    tag: 'payRequest',
    minSendable: 1000,
    maxSendable: 100000000,
    metadata: JSON.stringify([['text/plain', `Pay ${req.params.username}`]])
  });
});

相關資源

下一步: 了解 BOLT 規範 深入理解閃電網路的協議標準。

已複製連結
已複製到剪貼簿