Skip to content

Instantly share code, notes, and snippets.

@Hakkadaikon
Last active April 29, 2026 12:42
Show Gist options
  • Select an option

  • Save Hakkadaikon/dbf2e2c380b2203d5d541f57df83f66e to your computer and use it in GitHub Desktop.

Select an option

Save Hakkadaikon/dbf2e2c380b2203d5d541f57df83f66e to your computer and use it in GitHub Desktop.
zap手順

NIP-57 Zap 完全フロー解説(実データ版)

wss://yabu.me から取得した実際のイベントに基づく、NIP-57 (Lightning Zaps) の手順。 実際のイベントを元にclaudeから吐かせた雑メモ。


登場人物

役割 識別子 hex pubkey
受取人 発火大根 hakkadaikon 101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45
送金者 匿名ユーザー f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a
ウォレットサービス Wallet of Satoshi (Zap署名鍵) be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479

Step 0: 受取人プロフィールの取得

クライアントがリレーから発火大根の kind:0 (メタデータ) を購読・取得。

実際の kind:0 イベント

{
  "kind": 0,
  "pubkey": "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45",
  "created_at": 1769705248,
  "id": "235d979c47c43b2e2fea593f058e0ec21c25e9519936d04c8fda3c3f7aa7e2c7",
  "content": "{\"picture\":\"https://image.nostr.build/4c2099ee031cd17e00db5bdbfd6bd01181229039d8567afe64ea7ffda76cd3d1.jpg\",\"display_name\":\" 発火大根 hakkadaikon🎤\",\"lud16\":\"hakkadaikon@walletofsatoshi.com\",\"banner\":\"https://image.nostr.build/71d66eb449f217a60c53a4927a3f3f5cadebf4e46f5833df641bde2bdbe26629.jpg\",\"name\":\"hakkadaikon\",\"about\":\"Natto TKG expert\\n\\nMi ŝatas egalecon kaj malamas la ideon de elitismo.\\nĈi tie ĉiu estas unu \\\"Nostrich\\\"\\n\\nInterested in: \\n- Vim, Bitcoin, Nostr, Protocol stack, Network, Low-level tech, Joke\\n\\n#Nostrasia2024 staff\\n#Nostrasia2025 staff\\n\",\"nip05\":\"hakkadaikon@iris.to\",\"website\":\"https://github.com/Hakkadaikon\"}",
  "sig": "775f54054fe2f4bcfa5749bc064ea3f62d899c5776e5673f5db4d09a09d8acc5b94454e6aa0ff4d4ca2fb0082b8e831191a1285937f67835f62f803fc92f89fc",
  "tags": []
}

クライアントの処理

  1. content を JSON パース
  2. lud16 フィールドの抽出 → "hakkadaikon@walletofsatoshi.com"
  3. Lightning Address の存在確認 → Zap ボタンの表示

Step 1: LUD-16 エンドポイントへの問い合わせ

Lightning Address から well-known URL への変換。

変換ルール (LUD-16仕様)

hakkadaikon@walletofsatoshi.com
  ↓
user   = hakkadaikon
domain = walletofsatoshi.com
  ↓
https://{domain}/.well-known/lnurlp/{user}

実際のリクエスト

GET https://walletofsatoshi.com/.well-known/lnurlp/hakkadaikon

実際のレスポンス

{
  "callback": "https://livingroomofsatoshi.com/api/v1/lnurl/payreq/353f578e-8a2a-4fd5-a097-c67946c1ab90",
  "maxSendable": 100000000000,
  "minSendable": 1000,
  "metadata": "[[\"text/plain\",\"Pay to Wallet of Satoshi user: hakkadaikon\"],[\"text/identifier\",\"hakkadaikon@walletofsatoshi.com\"]]",
  "commentAllowed": 255,
  "tag": "payRequest",
  "allowsNostr": true,
  "nostrPubkey": "be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479"
}

クライアントの判定

  • allowsNostr: true → NIP-57 Zap 対応の確認
  • nostrPubkey: "be1d8979..." → Zap Receipt 検証用公開鍵の記憶
  • minSendable: 1000 (1 sat) → 最小送金額の把握
  • maxSendable: 100000000000 (100,000 sat) → 最大送金額の把握
  • commentAllowed: 255 → コメント最大255文字の制約
  • callback → インボイス要求先 URL の記憶

Step 2: Zap Request (kind:9734) の作成

送金者のクライアントが kind:9734 イベントを構築。秘密鍵で署名。リレーには publish しない。

実際の kind:9734 イベント

{
  "id": "9b7d15a8021876beb3a3882faf940b8425ea6bae2d88ca966a86cd6e6704fe3c",
  "pubkey": "f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a",
  "created_at": 1777436708,
  "kind": 9734,
  "tags": [
    ["p", "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45"],
    ["amount", "10000"],
    ["e", "ba071c6f0167580f62aef79d7cdb626f696fc910d81bcc4c3d961911c279c0a4"],
    ["relays",
      "wss://nostrja-kari.heguro.com",
      "wss://nrelay-jp.c-stellar.net",
      "wss://relay.snort.social",
      "wss://nos.lol",
      "wss://r.bitcoinhold.net",
      "wss://relay.damus.io",
      "wss://relay-jp.nostr.wirednet.jp",
      "wss://relay.nostr.band",
      "wss://r.kojira.io"
    ]
  ],
  "content": "Great post 👍",
  "sig": "a81fcb6688fa32d69aa0d74303e0c105a01e0865d4fff1746aa5e44d3a7fe52824ec697f7757c5db7394e510c4dcf8aafff5a77..."
}

各フィールドの役割

フィールド 実際の値 役割
kind 9734 Zap Request を示す固定値
pubkey f11e91c5... 送金者の公開鍵。署名検証の対象
p タグ 101b30ee... 受取人の指定。発火大根の pubkey
e タグ ba071c6f... Zap 対象投稿の event id。省略時はプロフィール Zap
amount タグ 10000 送金額(ミリサトシ)。10,000 msat = 10 sat
relays タグ 9 リレー Zap Receipt の publish 先希望リスト
content "Great post 👍" Zap に添えるコメント
sig a81fcb66... 送金者の秘密鍵による署名。改竄防止の根幹
id 9b7d15a8... イベントのハッシュ (シリアライズ → SHA256)

制約事項

  • p タグは 1つだけ
  • e タグは 0個または1個
  • relays タグは 必須。1つ以上のリレー URL を含むこと
  • amount 指定時は callback の amount パラメータと一致必須

Step 3: callback への kind:9734 送信

kind:9734 の JSON 文字列化。URL エンコード。callback への GET リクエスト送信。

実際のリクエスト

GET https://livingroomofsatoshi.com/api/v1/lnurl/payreq/353f578e-8a2a-4fd5-a097-c67946c1ab90
    ?amount=10000
    &nostr=%7B%22id%22%3A%229b7d15a8021876beb3a3882faf940b8425ea6bae2d88ca966a86cd6e6704fe3c%22%2C%22pubkey%22%3A%22f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a%22%2C%22created_at%22%3A1777436708%2C%22kind%22%3A9734%2C...%7D
    &comment=Great+post+%F0%9F%91%8D

パラメータ

パラメータ 説明
amount 10000 送金額(ミリサトシ)。kind:9734 の amount タグと一致必須
nostr kind:9734 JSON (URL encoded) Zap Request イベント全体
comment Great post 👍 (URL encoded) LUD-12 コメント。kind:9734 の content と同一

Step 4: ウォレットサービスによる kind:9734 の検証

WoS (livingroomofsatoshi.com) サーバーが受信した kind:9734 の厳密な検証。

検証手順

  1. 署名検証sigpubkey: f11e91c5... に対して有効であること → ✅
  2. kind 確認kind === 9734 であること → ✅
  3. p タグ存在確認p タグが存在し、自サービスのユーザー 101b30ee... を指すこと → ✅
  4. e タグ個数確認e タグが 0 個または 1 個であること → ✅ (1個)
  5. relays タグ存在確認relays タグが存在し、1 つ以上の URL を含むこと → ✅ (9個)
  6. amount 整合性確認amount タグ "10000" とクエリパラメータ amount=10000 の一致 → ✅
  7. 金額範囲確認10000minSendable(1000)maxSendable(100000000000) の範囲内であること → ✅

いずれか1つでも失敗 → インボイス発行の拒否。エラーレスポンスの返却。


Step 5: BOLT11 インボイスの生成・返却

検証通過後、WoS による BOLT11 インボイスの生成。

実際のレスポンス

{
  "pr": "lnbc100n1p5lrzp9pp5r95takpy0z38g78h9vcekf7ahzj9aada6rkjh4afakmcxngs7hfqhp5k5cltmcjthe6jp5ngx6x9cngg7446atcxzg0gd6v7p27symdlfrqcqzzsxqyz5vqsp5lzfe8rcst33d4eg6upa2prpuedtnrpheevmx3zvppjzhcx8fadus9qxpqysgq0yu9wvqfkqwpmzxtg08v2jjl0nlc0mn80nnf5thmu8673pglfsnqprwg9zngd8r9mdmak79ruqk22aj7n3cskduyredqczm6k6tfj8cqkg9r5r",
  "routes": []
}

BOLT11 インボイスの金額デコード

prefix: lnbc100n → 100 × 10^-1 nano BTC = 10 sat = 10,000 msat

description_hash の埋め込み(最重要処理)

description_hash = SHA256(kind:9734 の JSON 文字列そのまま)

NIP-57 のセキュリティの要。kind:9734 の JSON 文字列をそのまま SHA256 ハッシュし、BOLT11 の description_hash フィールドに格納。後の検証で改竄検知に使用。


Step 6: Lightning Network 経由の支払い実行

送金者のウォレットによる BOLT11 インボイスの Lightning Network 上での決済。

処理の流れ

  1. 送金者のノードが受取人ノードへのルート探索
  2. HTLC (Hash Time-Locked Contract) チェーンの構築
  3. マルチホップ決済の実行
  4. preimage の取得 → 支払い完了の暗号学的証明

実際の preimage(セルフ Zap の kind:9735 から確認)

preimage: "cd45630a7751f68f9702f82bdd8cc2727481bef5d3649e1ef445f6bd568e768c"

Step 7: Zap Receipt (kind:9735) の作成

WoS が支払い完了を検知。WoS 自身の秘密鍵 で kind:9735 に署名。

実際の kind:9735 イベント

{
  "id": "0aa1eb3f7c71ba95fb05992156ae5ad9c439581ee929d33fad0c33e615bed03c",
  "pubkey": "be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479",
  "created_at": 1777436713,
  "kind": 9735,
  "content": "",
  "tags": [
    [
      "p",
      "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45"
    ],
    [
      "e",
      "ba071c6f0167580f62aef79d7cdb626f696fc910d81bcc4c3d961911c279c0a4"
    ],
    [
      "bolt11",
      "lnbc100n1p5lrzp9pp5r95takpy0z38g78h9vcekf7ahzj9aada6rkjh4afakmcxngs7hfqhp5k5cltmcjthe6jp5ngx6x9cngg7446atcxzg0gd6v7p27symdlfrqcqzzsxqyz5vqsp5lzfe8rcst33d4eg6upa2prpuedtnrpheevmx3zvppjzhcx8fadus9qxpqysgq0yu9wvqfkqwpmzxtg08v2jjl0nlc0mn80nnf5thmu8673pglfsnqprwg9zngd8r9mdmak79ruqk22aj7n3cskduyredqczm6k6tfj8cqkg9r5r"
    ],
    [
      "description",
      "{\"id\":\"9b7d15a8021876beb3a3882faf940b8425ea6bae2d88ca966a86cd6e6704fe3c\",\"pubkey\":\"f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a\",\"created_at\":1777436708,\"kind\":9734,\"tags\":[[\"p\",\"101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45\"],[\"amount\",\"10000\"],[\"e\",\"ba071c6f0167580f62aef79d7cdb626f696fc910d81bcc4c3d961911c279c0a4\"],[\"relays\",\"wss://nostrja-kari.heguro.com\",\"wss://nrelay-jp.c-stellar.net\",\"wss://relay.snort.social\",\"wss://nos.lol\",\"wss://r.bitcoinhold.net\",\"wss://relay.damus.io\",\"wss://relay-jp.nostr.wirednet.jp\",\"wss://relay.nostr.band\",\"wss://r.kojira.io\"]],\"content\":\"Great post 👍\",\"sig\":\"a81fcb6688fa32d69aa0d74303e0c105a01e0865d4fff1746aa5e44d3a7fe52824ec697f7757c5db7394e510c4dcf8aafff5a77...\"}"
    ]
  ],
  "sig": "c2dbd714b2ab80b95044d5d47d7b1c0340015ec03729de24a31e5714a7b95e7aef25d6a53ff376f8ccfa8288ae4dbe08cf88482e525934e8d63cfd724c8ca3d1"
}

各タグの役割と由来

タグ 実際の値 由来・役割
p 101b30ee... kind:9734 の p タグからコピー。受取人の特定
e ba071c6f... kind:9734 の e タグからコピー。Zap 対象投稿の特定
bolt11 lnbc100n1p5lrzp9... Step 5 で生成したインボイス。金額の証明
description kind:9734 JSON 丸ごと 改竄防止の核心。送金者の署名を内包

WoS 実装の特徴

  • P (大文字) タグの 省略。NIP-57 仕様では推奨だが必須ではない
  • preimage タグの省略。一部の Zap Receipt では含まれる
  • content は空文字列。仕様通り

Step 8: リレーへの Zap Receipt publish

WoS による kind:9735 の、kind:9734 relays タグ指定リレーへの publish。

publish 先リスト(kind:9734 の relays タグから)

→ wss://nostrja-kari.heguro.com
→ wss://nrelay-jp.c-stellar.net
→ wss://relay.snort.social
→ wss://nos.lol
→ wss://r.bitcoinhold.net
→ wss://relay.damus.io
→ wss://relay-jp.nostr.wirednet.jp
→ wss://relay.nostr.band
→ wss://r.kojira.io

補足

実際には wss://yabu.me でもこの kind:9735 の取得が可能。WoS による追加リレーへの publish、または他リレーからの伝播の可能性。


Step 9: クライアントによる Zap Receipt の検証

任意の Nostr クライアントが kind:9735 を受信した際の検証フロー。

検証手順(厳密版)

1. kind:9735 の pubkey を取得
   → "be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479"

2. kind:9735 の署名検証
   → sig "c2dbd714..." が pubkey "be1d8979..." に対して有効か
   → ✅ 有効

3. p タグから受取人 pubkey を取得
   → "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45"

4. 受取人の kind:0 から lud16 を取得
   → "hakkadaikon@walletofsatoshi.com"

5. LUD-16 エンドポイントに問い合わせ
   GET https://walletofsatoshi.com/.well-known/lnurlp/hakkadaikon
   → nostrPubkey: "be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479"

6. kind:9735 の pubkey と nostrPubkey の一致確認
   → "be1d8979..." === "be1d8979..."
   → ✅ 一致。正規のウォレットサービスが発行した Receipt

7. description タグから kind:9734 JSON をパース
   → kind:9734 イベントオブジェクトの復元

8. kind:9734 の署名検証
   → sig "a81fcb66..." が pubkey "f11e91c5..." に対して有効か
   → ✅ 有効。送金者の identity 確認完了

9. bolt11 タグからインボイスをデコード
   → description_hash フィールドの抽出

10. description_hash の照合
    → SHA256(description タグの JSON 文字列) === bolt11 の description_hash
    → ✅ 一致。kind:9734 は改竄されていない

11. 金額の整合性確認
    → kind:9734 の amount タグ: "10000" (msat)
    → bolt11 のデコード結果: lnbc100n = 10 sat = 10,000 msat
    → ✅ 一致

12. すべて通過 → 有効な Zap として表示

表示結果

⚡ 10 sat
送金者: f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a
受取人: 発火大根 hakkadaikon
対象投稿: ba071c6f0167580f62aef79d7cdb626f696fc910d81bcc4c3d961911c279c0a4
コメント: "Great post 👍"

Step 10: 検証失敗パターン

各検証ステップが失敗した場合の意味。

検証 失敗時の意味
kind:9735 署名無効 イベント自体の改竄。リレーまたは中間者による攻撃
pubkey ≠ nostrPubkey 正規でないサービスが発行した偽 Receipt
kind:9734 署名無効 送金者の偽装。description タグの書き換え
description_hash 不一致 kind:9734 の内容改竄。金額・受取人・コメントの書き換え
amount 不一致 インボイス金額と Zap Request の金額の不整合。部分的な改竄

タイムライン(実データ)

2026-06-26T07:05:08Z  kind:9734 created_at: 1777436708
                       送金者が Zap Request を署名
                  ↓
                  ↓  callback に送信 → サーバー検証 → インボイス生成 → Lightning 決済
                  ↓
2026-06-26T07:05:13Z  kind:9735 created_at: 1777436713
                       WoS が Zap Receipt を署名・publish

kind:9734 作成から kind:9735 発行まで わずか5秒。この間に完了した処理:

  • HTTP リクエストの送受信
  • kind:9734 の検証(7項目)
  • BOLT11 インボイスの生成
  • Lightning Network 上のマルチホップ決済
  • 着金確認
  • kind:9735 の署名
  • 複数リレーへの publish

セルフ Zap の実例

発火大根が自分自身に Zap した kind:9735 の確認。

実際のイベント

{
  "id": "d4b88eb714abc1137b68cf1b63e69f80cd38d7c50b20d0860ab5ad467baf9282",
  "pubkey": "be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479",
  "created_at": 1777437992,
  "kind": 9735,
  "tags": [
    ["p", "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45"],
    ["e", "c5d7b54ee8f8d3931fb2a9c5a7b9a2bff274edd221fa03416800f42d513174ee"],
    ["bolt11", "lnbc10n1p5lrrfppp5enk8q93ug4gs3nsqwwpmuefyr3dp8ffzmf82y2zdktm6z7yxkerqhp58tezpmfp84emjx7386ruen0e9af23gt7ctjwdp6cmfyuaxf5qdcqcqzzsxqyz5vqsp52kjjp46k56mdmemgrtllywj7cnj2ypelafpkd4utw4y6p5tacf0q9qxpqysgqftdpx2cdk83gtfl42pwtcc63zt69ntk6uqtufhl0juq6ae878nwhp3q7eqcsttj6uvcym2f2qv4xp6wgv0yendsslxc4s7f9fnyuvvgqu2zzlh"],
    ["description", "{\"id\":\"d71ab265bb5cb8889bd51b385bcf99788fa138a63ebd49230d4681b71ab1cc25\",\"pubkey\":\"101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45\",\"created_at\":1777437984,\"kind\":9734,\"tags\":[[\"p\",\"101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45\"],[\"amount\",\"1000\"],[\"e\",\"c5d7b54ee8f8d3931fb2a9c5a7b9a2bff274edd221fa03416800f42d513174ee\"],[\"relays\",\"wss://nostr.bitcoiner.social\",\"wss://nostr.wine\",\"wss://relay.westernbtc.com\",\"wss://r.kojira.io\",\"wss://inbox.relays.land\",\"wss://relay-jp.nostr.wirednet.jp\",\"wss://relay.mostr.pub\",\"wss://relay.yozora.world\",\"wss://yabu.me\",\"wss://bitcoiner.social\",\"wss://relay.damus.io\",\"wss://relay.nostr.wirednet.jp\",\"wss://relay.ditto.pub\",\"wss://nostr.land\",\"wss://relay.primal.net\",\"wss://pyramid.fiatjaf.com\",\"wss://nos.lol\"]],\"content\":\"\",\"sig\":\"d9602cb2b1f93513e36ca24a704fbc74c2486d24ebbbcb5c2d014dfdbca8bb08880ebc011f104632ab44010a77a19b6c226724b3a6bea64fbce5c145f0cfd4c0\"}"],
    ["preimage", "cd45630a7751f68f9702f82bdd8cc2727481bef5d3649e1ef445f6bd568e768c"]
  ]
}

セルフ Zap の特徴

  • kind:9734 の pubkey = 101b30ee... (発火大根)
  • kind:9734 の p タグ = 101b30ee... (発火大根)
  • 送金者 = 受取人。プロトコル上完全に有効
  • 金額: lnbc10n = 1 sat (1,000 msat)
  • content が空文字列(コメントなし)
  • preimage タグあり → 支払い証明の包含

発火大根が送金者として Zap した実例 (kind:9734)

発火大根自身が他ユーザーに Zap した kind:9734 の例。

実際のイベント

{
  "id": "3b254335bb54ff8c6795887b195970fbda66089787dc9d3ae5c3e3758e1e8212",
  "pubkey": "101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45",
  "created_at": 1692972860,
  "kind": 9734,
  "content": "ピタリおめでとう!",
  "tags": [
    ["p", "83409ce424d2dae116fc9d1596f076d1d65843e44e026fa52a6b67dca2f35500"],
    ["relays",
      "wss://relay.damus.io/",
      "wss://yabu.me",
      "wss://relay-jp.nostr.wirednet.jp/",
      "wss://r.kojira.io",
      "wss://relay.mostr.pub",
      "wss://nostr-relay.nokotaro.com/"
    ]
  ],
  "sig": "5cea4ff2a09e292bdfd4ec5d404e6dad2003ed1951d545c2777f4c7f110f05130c19534dbca4333a62223e1f770c78153316d43b9e579e1b28a1562bee1358ec"
}

特徴

  • amount タグの 未設定。古い実装では省略されることあり
  • e タグの 未設定。プロフィール Zap(特定投稿ではなくユーザーへの Zap)
  • content: "ピタリおめでとう!" — 日本語コメント付き
  • 2023年8月のイベント。NIP-57 初期の実装

改竄防止の暗号学的チェーン(全体図)

┌─────────────────────────────────────────────────────┐
│ kind:9734 (Zap Request)                             │
│   署名者: 送金者 f11e91c5...                         │
│   内容: 受取人、金額、対象投稿、リレーリスト、コメント    │
│   署名: a81fcb66... (送金者の秘密鍵)                  │
└──────────────────────┬──────────────────────────────┘
                       │
          ┌────────────┼────────────┐
          │            │            │
          ▼            ▼            ▼
┌──────────────┐ ┌──────────┐ ┌────────────────────────┐
│ SHA256 hash  │ │ そのまま  │ │ bolt11 invoice         │
│              │ │ コピー    │ │   description_hash     │
│              │ │          │ │   = SHA256(kind:9734)  │
└──────┬───────┘ └────┬─────┘ └───────────┬────────────┘
       │              │                   │
       │    ┌─────────┴─────────┐         │
       │    │ kind:9735         │         │
       │    │  description タグ  │◄────────┘ bolt11 タグ
       │    │  署名: be1d8979.. │
       │    │  (WoS の秘密鍵)   │
       │    └───────────────────┘
       │              │
       ▼              ▼
┌────────────────────────────────────────┐
│ 検証時の照合                            │
│                                        │
│ SHA256(description タグ値)              │
│     === bolt11.description_hash  ✅     │
│                                        │
│ → kind:9734 の内容は改竄されていない      │
│ → 金額・受取人・送金者すべて真正          │
└────────────────────────────────────────┘

3重の暗号学的保護

  1. 送金者保護 — kind:9734 の署名が送金者の pubkey に紐付く。送金者偽装の不可能性
  2. 内容保護 — BOLT11 の description_hash が kind:9734 の SHA256。インボイス発行後の内容改竄の不可能性
  3. サービス保護 — kind:9735 の pubkey が LUD-16 の nostrPubkey と一致。偽サービスによる Receipt 偽造の不可能性

プロトコル全体のシーケンス図

送金者クライアント          WoS サーバー           Nostr リレー群
     │                        │                      │
     │ ① GET kind:0 (受取人)   │                      │
     │◄───────────────────────────────────────────────│
     │                        │                      │
     │ ② GET /.well-known/lnurlp/hakkadaikon         │
     │───────────────────────►│                      │
     │ { allowsNostr, nostrPubkey, callback }        │
     │◄───────────────────────│                      │
     │                        │                      │
     │ [kind:9734 作成・署名]   │                      │
     │                        │                      │
     │ ③ GET callback?amount=10000&nostr={9734}      │
     │───────────────────────►│                      │
     │                   [9734 検証]                  │
     │                   [BOLT11 生成]               │
     │                   [desc_hash=SHA256(9734)]    │
     │ { pr: "lnbc..." }     │                      │
     │◄───────────────────────│                      │
     │                        │                      │
     │ ④ Lightning 支払い実行  │                      │
     │───────────────────────►│                      │
     │                   [着金確認]                   │
     │                   [kind:9735 作成・署名]       │
     │                        │                      │
     │                        │ ⑤ EVENT kind:9735    │
     │                        │─────────────────────►│
     │                        │                      │
     │            ⑥ kind:9735 受信 (subscription)     │
     │◄───────────────────────────────────────────────│
     │                        │                      │
     │ [kind:9735 検証]        │                      │
     │ [Zap 表示 ⚡]           │                      │

まとめ

NIP-57 の本質:

  • Lightning Address (LUD-16) による支払い先の解決
  • kind:9734 による「誰が・誰に・いくら・何に対して」の署名付き宣言
  • BOLT11 の description_hash による kind:9734 とインボイスの暗号学的紐付け
  • ウォレットサービスによる kind:9735 の発行と署名
  • 3者(送金者・サービス・プロトコル)の署名チェーンによる改竄不可能性の実現
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment