NIP-57: Zaps
NIP-57はzapsを定義します。これは、Lightning paymentをNostr identityやcontentへ結び付ける方法です。zap対応invoiceのrequestと、支払い後にwalletが公開するreceipt eventの両方を標準化しています。
仕組み
- clientは、profile metadataまたは対象イベント上の
zapタグから受信者のLNURL endpointを見つける - clientは、relayではなく受信者のLNURL callbackへ、署名済みkind
9734zap requestを送る - ユーザーがinvoiceを支払う
- 受信者のwallet serverが、zap requestで指定されたrelayへkind
9735zap receiptを公開する - clientがzapを検証し、表示する
Zap Request(kind 9734)
zap requestは、支払者と意図した対象を識別する署名済みイベントです。通常は次を含みます。
pタグ - 受信者pubkeyeタグ - zap対象のイベント(任意)amountタグ - millisatoshis単位の金額relaysタグ - receiptを公開するrelay一覧
addressable contentでは、eタグの代わりに、または併用してaタグを使えます。任意のkタグは対象kindを記録します。
Zap Receipt(kind 9735)
支払い確認後に、受信者のwallet serverが公開します。内容は次の通りです。
descriptionタグ内に元のzap requestbolt11タグに支払済みinvoicepreimageタグで支払いを証明
clientは、受信者のLNURL nostrPubkey、invoice amount、元のzap requestに照らしてreceiptを検証する必要があります。その検証なしでは、receiptは単なる主張にすぎません。
信頼モデルとトレードオフ
zapsは、支払いをsocial graph内で可視化できる点で有用ですが、receipt自体は依然として受信者のwallet infrastructureが作成します。仕様自身も、zap receiptは普遍的なpayment proofではないと述べています。最も正確には、「zap requestに結び付いたinvoiceが支払われた」というwallet署名付きの陳述として理解すべきです。
妥当なclientは、receiptをzapとして表示する前に4つを確認すべきです。receiptの署名が受信者のLNURL responseでadvertiseされたnostrPubkeyに一致すること、bolt11 invoice amountが埋め込まれたzap request内のamountタグと一致すること、invoiceのdescription hashが文字列化されたzap requestへコミットしていること、preimageがinvoiceのpayment_hashへハッシュされることです。これをせずに集計済みzap数を表示するclientは、偽造kind 9735イベントを出す攻撃者に簡単に騙されます。
Private zapsとAnonymous zaps
private zapsは、その上に機密性レイヤーを追加します。送信者はzap requestのcontentを受信者向けに暗号化し、外側requestへanonタグを含めることで、relay networkには支払い対象だけを見せつつ、添えたメモは読ませません。anonymous zapではさらに一歩進み、clientがzap request自体のために新しいephemeral keypairを生成するため、receiptは支払いがあったことを示しても、受信者はそのzapを送信者の長期pubkeyへ結び付けられません。
Zap GoalsとSplits
NIP-57は、NIP-75で定義されるzap-goal systemの土台です。goalは、目標額とreceiptを数えるrelay setを宣言するkind 9041イベントであり、clientは一致するkind 9735イベントの検証済みbolt11 amountを合計して進捗を集計します。
NIP付録で定義されたzap splitsでは、受信者が複数の重み付きzapタグを持つkind 0 profileを公開でき、1回のzap paymentを複数のpubkeyへ原子的に分配できます。Amethyst、Damus、noStrudelはsplit-payingをend-to-endで実装しています。
Primary sources:
Mentioned in:
- Newsletter #1: News
- Newsletter #2: News
- Newsletter #3: Notable Code Changes
- Newsletter #9: NIP Updates
- Newsletter #19: NIP Deep Dive
See also: