wss://yabu.me から取得した実際のイベントに基づく、NIP-57 (Lightning Zaps) の手順。 実際のイベントを元にclaudeから吐かせた雑メモ。
| 役割 | 識別子 | hex pubkey |
|---|---|---|
| 受取人 | 発火大根 hakkadaikon | 101b30ee88c27a13de68bf7c8c06368ea3e3e837641595c18675677d18a46a45 |
| 送金者 | 匿名ユーザー | f11e91c5bf486fbcb930d82811d026b113a5cfb77bc8ab91439a7b8759a0b04a |
| ウォレットサービス | Wallet of Satoshi (Zap署名鍵) | be1d89794bf92de5dd64c1e60f6a2c70c140abac9932418fee30c5c637fe9479 |
クライアントがリレーから発火大根の 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": []
}contentを JSON パースlud16フィールドの抽出 →"hakkadaikon@walletofsatoshi.com"- Lightning Address の存在確認 → Zap ボタンの表示
Lightning Address から well-known URL への変換。
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 の記憶
送金者のクライアントが kind:9734 イベントを構築。秘密鍵で署名。リレーには publish しない。
{
"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パラメータと一致必須
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 と同一 |
WoS (livingroomofsatoshi.com) サーバーが受信した kind:9734 の厳密な検証。
- 署名検証 —
sigがpubkey: f11e91c5...に対して有効であること → ✅ - kind 確認 —
kind === 9734であること → ✅ - p タグ存在確認 —
pタグが存在し、自サービスのユーザー101b30ee...を指すこと → ✅ - e タグ個数確認 —
eタグが 0 個または 1 個であること → ✅ (1個) - relays タグ存在確認 —
relaysタグが存在し、1 つ以上の URL を含むこと → ✅ (9個) - amount 整合性確認 —
amountタグ"10000"とクエリパラメータamount=10000の一致 → ✅ - 金額範囲確認 —
10000がminSendable(1000)〜maxSendable(100000000000)の範囲内であること → ✅
いずれか1つでも失敗 → インボイス発行の拒否。エラーレスポンスの返却。
検証通過後、WoS による BOLT11 インボイスの生成。
{
"pr": "lnbc100n1p5lrzp9pp5r95takpy0z38g78h9vcekf7ahzj9aada6rkjh4afakmcxngs7hfqhp5k5cltmcjthe6jp5ngx6x9cngg7446atcxzg0gd6v7p27symdlfrqcqzzsxqyz5vqsp5lzfe8rcst33d4eg6upa2prpuedtnrpheevmx3zvppjzhcx8fadus9qxpqysgq0yu9wvqfkqwpmzxtg08v2jjl0nlc0mn80nnf5thmu8673pglfsnqprwg9zngd8r9mdmak79ruqk22aj7n3cskduyredqczm6k6tfj8cqkg9r5r",
"routes": []
}prefix: lnbc100n → 100 × 10^-1 nano BTC = 10 sat = 10,000 msat
description_hash = SHA256(kind:9734 の JSON 文字列そのまま)
NIP-57 のセキュリティの要。kind:9734 の JSON 文字列をそのまま SHA256 ハッシュし、BOLT11 の description_hash フィールドに格納。後の検証で改竄検知に使用。
送金者のウォレットによる BOLT11 インボイスの Lightning Network 上での決済。
- 送金者のノードが受取人ノードへのルート探索
- HTLC (Hash Time-Locked Contract) チェーンの構築
- マルチホップ決済の実行
- preimage の取得 → 支払い完了の暗号学的証明
preimage: "cd45630a7751f68f9702f82bdd8cc2727481bef5d3649e1ef445f6bd568e768c"
WoS が支払い完了を検知。WoS 自身の秘密鍵 で 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 丸ごと | 改竄防止の核心。送金者の署名を内包 |
P(大文字) タグの 省略。NIP-57 仕様では推奨だが必須ではないpreimageタグの省略。一部の Zap Receipt では含まれるcontentは空文字列。仕様通り
WoS による kind:9735 の、kind:9734 relays タグ指定リレーへの publish。
→ 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、または他リレーからの伝播の可能性。
任意の 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 👍"
各検証ステップが失敗した場合の意味。
| 検証 | 失敗時の意味 |
|---|---|
| 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 した 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"]
]
}- kind:9734 の
pubkey=101b30ee...(発火大根) - kind:9734 の
pタグ =101b30ee...(発火大根) - 送金者 = 受取人。プロトコル上完全に有効
- 金額:
lnbc10n= 1 sat (1,000 msat) contentが空文字列(コメントなし)preimageタグあり → 支払い証明の包含
発火大根自身が他ユーザーに 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 の内容は改竄されていない │
│ → 金額・受取人・送金者すべて真正 │
└────────────────────────────────────────┘
- 送金者保護 — kind:9734 の署名が送金者の pubkey に紐付く。送金者偽装の不可能性
- 内容保護 — BOLT11 の
description_hashが kind:9734 の SHA256。インボイス発行後の内容改竄の不可能性 - サービス保護 — 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者(送金者・サービス・プロトコル)の署名チェーンによる改竄不可能性の実現