Nostr Compass #19
Nostr Compassへようこそ。Nostrの週刊ガイドです。
今週の内容: Amethystは、Marmot準拠、NIP-72 community、NIP-75 zap goals、MoQベースaudio roomをまとめて進めました。TollGateは、NostrとCashu上のpay-per-use internet access仕様をv0.1.0として固め、nostreamはNIP-45、NIP-62、compression、query hardening、完全なNIP-11 parityを進めました。Forgeswornは、signing、identity、paid API discoveryのstackを一気に公開しました。ShockWalletは、NostrネイティブなLightning wallet同期を押し進め、Formstr suiteはsecurity hardeningとRRULE supportを中心に26 PRをマージしました。StableKraft、Keep、topaz、WoT Relay、Flotilla、NipLockも今週の出荷に並びます。今週のdeep diveはNIP-72とNIP-57です。
Top Stories
Amethyst ships Marmot MIP compliance, NIP-72 communities, zap goals, and MoQ audio rooms
Amethystは今週57本のPRをマージし、Marmot encrypted groupの準拠作業、community support、live stream向けzap goals、Media over QUICベースaudio roomをまとめて押し進めました。PR #2462は埋め込みMDKをMIP-01とMIP-05 wire formatへ合わせ、VarInt encodingとMDK test vectorによるround-trip validationを追加しました。PR #2435はMIP-00 KeyPackage Relay List supportを加え、PR #2436はWhite Noiseとのcross-client testingで見つかったadmin gateとmedia handlingの差分を埋めました。PR #2466とPR #2471はMLS commit framingとouter-layer復号の正しさを修正し、PR #2477とPR #2493はさらにcommit pathとmessage encryptionの整合性を詰め、reference vectorに対するcryptography validatorを追加しました。PR #2488は、Marmot/MLS group操作をscriptableに扱えるCLIのamyも出荷しています。
community側では、PR #2468がkind 34550定義の作成、moderator追加、relay hint設定、aタグによる投稿、kind 4549 approval event管理を含むNIP-72 supportを追加しました。絵文字ではPR #2458とPR #2473がemoji set supportと完全なNIP-30 emoji-pack管理UIを追加しました。live surfaceでは、PR #2469がNIP-53 Live Activities画面へNIP-75 zap goalsを統合し、goal header、progress bar、one-tap zap、top-zappers leaderboardを導入しました。PR #2486は専用のLive Streams feed、PR #2491はproof-of-agreementとevent builder、PR #2461はfeed内lowest-resolution HLS、picture-in-picture、full-screen時の自動解像度選択を追加しています。
もっとも野心的なのはreal-time audioです。PR #2494はMedia over QUIC transport clientとaudio room supportを追加しました。MoQのpub-sub modelは、WebSocket relayよりライブ音声に向いており、trackやpriorityごとのsubscriptionを可能にします。PR #2487のPublic Chats画面と組み合わせると、Amethystはpublic audio roomとMarmot encrypted messagingを並行して持つことになります。PR #2485とPR #2490はFollow Packs discovery feedとonboarding統合を追加し、PR #1983はMarmot DMやmentionのためのalways-on notification serviceを導入し、PR #2480はadaptive cache sizing付きHLS video cachingを加えました。
TollGate v0.1.0 stabilizes pay-per-use internet over Nostr and Cashu
TollGateは4月21日にv0.1.0 releaseを出し、pay-per-use network access向け仕様群に最初のtag付きsnapshotを与えました。WiFi router、Ethernet switch、Bluetooth tetherのような接続制御デバイスが価格を広告し、Cashu ecash tokenを受け取り、sessionを管理できます。数satsを持つlocal Cashu walletがあれば、accountもsubscriptionもKYCもなく、その場で次の1分または1MBの接続を買えます。
releaseは3層構造を固定しています。TIP-01はAdvertisement、Session、Noticeの3つの基本event shapeを定義し、TIP-02はCashu payment layerを追加して、gateが広告する任意mintからcustomerがtokenを償還できるようにします。上位のinterface layerではHTTP-01からHTTP-03が制限的OS向けplain HTTP surfaceを定義し、NOSTR-01がWebSocketを張れるclient向けのNostr transportを定義します。medium layerではWIFI-01がcaptive portal routingを扱います。payment assetがcredentialではなくbearer tokenなので、customerは事前ネット接続なしで最初の接続を購入でき、TollGate同士がuplinkを買い合うmulti-hop構成も可能です。詳しくは新しいTollGate topic pageにまとめました。
nostream merges 53 PRs for NIP-45, NIP-62, compression, and query hardening
nostreamは、TypeScript relay implementationとして今週53本のPRをマージしました。feature面では、PR #522がNIP-45 COUNT supportを追加し、PR #544がNIP-62 right-to-vanishをadvertised feature listへ加え、PR #548は最近のtag-case conventionに沿って#Aから#Zのuppercase tag filterを受け入れるようにし、PR #514はevent import/exportにgzipとxz compressionを追加しました。
query performanceとcorrectnessも強化されています。PR #534はbenchmark harnessとfilter-to-SQL translationの最適化を導入し、PR #524はwhitelist/blacklist pubkeyのprefix match bugをexact-matchへ修正し、PR #553は同一created_at時のconcurrent insert raceを避けるdeterministic tie-breakerをupsertManyへ追加しました。PR #493はX-Forwarded-Forをtrusted proxyだけに限定し、PR #557はretention、authentication hint、optional field整理を含めて完全なNIP-11 parityを達成しました。
Shipping This Week
Primal Android ships Explore tab, NIP-05 verification, and audio player
Primal Androidは先週のfeed redesignに続き11本のPRを積みました。PR #1021はpopular user、follow pack、curated feedを軸にしたExplore tabを導入し、PR #1015はPrimalのAdvanced Search DSLから初期値を作るfeed editorを追加しました。PR #994はprofile向けNIP-05 verification UIを追加し、PR #997はin-feed audio playerを埋め込み、audio attachmentをその場で再生できるようにしています。PR #1018はwallet QR scanner経由のNIP-46 nostr-connect pairingも追加しました。
strfry adds Prometheus write-path metrics and fixes NIP-42 AUTH envelope
strfryはoperator向け改善をまとめて出しました。PR #194は専用Prometheus write-path metrics exporterとconnection gaugeを追加し、PR #197はconnectionごとのup/down bytesとcompression ratioをlogへ出すようにしました。PR #192はfilter tag limitをruntime-configurable optionへ昇格させ、PR #201はNIP-42 AUTH failure responseをNOTICEからNIP準拠のOK envelopeへ修正しました。
Shopstr hardens storefront security across 13 PRs
Shopstrは今週13本のPRをマージし、storefront security fixが大半を占めました。PR #434はseller-to-visitor script executionを許していたstored JavaScript holeを閉じ、PR #417はreflected XSSを防ぐためstorefront policy HTML renderingをescapeし、PR #418は未認証cached-event deletion APIを閉じました。PR #433、PR #419、PR #435、PR #414も認証とSSRF関連の穴を塞いでいます。機能面では、PR #421がfailed relay publish queueのreplay safetyを改善し、PR #425がwallet event fetchを修復し、PR #392がcheckout前にstored cart discountを再検証するようにしました。
Nostria v3.1.26 through v3.1.28 add background music playback on Android
Nostriaは今週v3.1.22からv3.1.28まで6リリースを出しました。中心はv3.1.26のAndroid background music playbackで、audio再生中にappが生き続け、notification barやlock screenからmedia controlを行えます。続くv3.1.27とv3.1.28はこの新しいmedia-service surfaceをhardeningしました。Newsletter #18では、その直前のlocal image generation releaseを扱っています。
Wisp v0.18.0-beta adds Normie Mode, For You feed, and NIP-29 group config
Wispは4月16日にv0.18.0-betaを出しました。PR #462は法定通貨建て表示を増やすNormie Modeを追加し、PR #464はtopic pickerとfirst-post coach付きのonboarding刷新を行い、PR #469はextended follow、trending event、followed hashtagを混ぜるFor You feedを加えました。protocol面ではPR #471がNIP-29 group configurationを実装し、PR #478がNIP-42 AUTH完了前にgroup 9021、9007、9009を送らないよう順序を修正し、PR #481はmentionされたpubkeyのNIP-65 inbox relayへnoteをbroadcastするようにしました。
NoorNote v0.8.4 adds Scheduled Posts and live stream zapping
NoorNoteはv0.8.4とv0.8.5を出しました。v0.8.4の中心はScheduled Posts add-onで、appは署名済みイベントをNoorNote運営relayへ渡し、指定時刻に公開させます。秘密鍵は端末外へ出ません。同じreleaseはNIP-53経由でstream chat overlayへsatsが現れるone-tap live stream zapも追加し、fiat-rate APIが一時停止してもwallet balanceを表示し続けるようにしました。v0.8.5では長いAndroid scrollでpostが重複するtimeline deduplication bugが修正されています。
topaz v0.0.2 ships a Nostr relay for Android
topazは、fiatjafによるAndroid phone上で動く新しいNostr relayで、2026-04-17にv0.0.2を公開しました。現段階ではscopeは狭く、インストール可能なAndroid packageとして動作するrelayを提供することが主眼です。
StableKraft v1.0.0 ships the first stable music-and-podcast PWA release
StableKraftは、podcast feed由来のmusicを発見、整理、再生するNext.js PWAで、authとsocial featureにNostr、V4V paymentにLightningを使います。2026-04-18にv1.0.0へ到達しました。同週には、15-minute OPML cacheとillegal XML strippingでfeed ingestionを改善し、follow-up fixでnightly reparse windowを720時間から24時間へ縮め、新規feedのself-healを速めています。
NipLock ships a NIP-17-based password manager
NipLockは、credentialをNIP-17 gift-wrapped DMとして保存し、device間で同期するpassword managerです。各password entryは自分の鍵から自分自身へのNIP-17 DMであり、同じ鍵で認証した任意deviceへ同じイベントが複製されます。署名はraw nsec、nos2xのようなbrowser extension、またはNIP-46経由のAmberで行えます。
flotilla-budabit polishes its NIP-34 repo surface
Budabit communityによるFlotilla fork、flotilla-budabitは、NIP-34 git-over-nostr workflow周辺のfixをまとめて出しました。repo discussion controlの復元、detail pageでのsticky repo tab保持、saved GRASP relayからのrepo announcement読み込み、maintainer適用patch statusの同期などが含まれます。upstream Flotillaと近い状態を保ちながら、Budabit contributor向けrepo viewを優先しています。
rx-nostr 3.7.2 through 3.7.4 add default verifier and optional constructor args
rx-nostrは、RxJSベースのNostr libraryで、3.7.2、3.7.3、3.7.4を出しました。PR #192はdefault Schnorr verifierを追加し、paired releaseのcrypto@3.1.6が@noble/curves利用bugを修正しました。PR #195はcreateRxNostr()の引数をoptionalにし、zero-configでのquick integrationを可能にしています。
Keep Android v1.0.0 ships with reproducible builds and zero trackers
Keepは、Nostrネイティブなpassword and secret managerで、hardening PRの積み上げの後、4月21日にv1.0.0を出しました。PR #241はpinnedかつverifiedなtoolchainを使うreproducible build recipeを追加し、PR #248はGoogle ML KitをZXingへ置き換えてGoogle Play Services依存を外し、PR #252はv1.0.0 buildのtrackerがゼロであることを示すExodus Privacy scanを公開しました。PR #256はZapstore配布向けzapstore.yaml manifestも追加しています。
Flotilla 1.7.3 and 1.7.4 add kind-9 wrapping for richer NIP-29 rooms
Flotillaは、hodlbodによるNIP-29 groups clientで、1.7.3と1.7.4を出しました。中心となるprotocol changeは、calendar eventやpollのようなnon-chat contentをkind 9で包むことです。これにより、それらをgroupへ送ったときroom contextが保たれます。同じrelease lineではpoll、Aegis URL schemeによるNIP-46 login、space inviteのnative share、room mention、mobile clipboard image paste、draft、video in call、feed pagination改善も入りました。
WoT Relay v0.2.1 migrates eventstore to LMDB
WoT Relayは、bitvoraによるweb-of-trust filtered relayで、2026-04-22にv0.2.1を出しました。PR #97はeventstoreをLMDBへ移行し、初期trust graph構築時にupstream read budgetを使い切らないようWoT bootstrap fetchを調整し、PR #99はgolang.org/x/cryptoをv0.45.0へ上げ、PR #100はreleaseに合わせてadvertised NIP-11 software URLとversion stringを更新しました。
Formstr suite: Pollerama security pass, Forms i18n, Calendar RRULE support
Formstr suiteは今週26本のPRをマージし、Pollerama、Forms、Nostr Calendar全体で明確なsecurityテーマが見えました。Polleramaでは、PR #182がlogout時のcached DM失効、PR #175がsecure browser storageへのlocal key移動、PR #171がkind 0 profile contentのJSON.parse防御を行い、product面ではPR #186がHTTPS deep linking、PR #169がpoll result上のauthor名clickable化を追加しました。
Formstr側では、PR #475がaudio/video URL support、PR #439がi18n、PR #466がGoogle Forms importer、PR #463がsensitive key logのconsole出力削除を行いました。Nostr Calendar by Formstrは同日にv1.3.0とv1.4.0を出し、PR #107で複数およびcustom RRULE support、PR #101でRFC 5545に従うfloating RRULE dateのUTC解釈、PR #97でshared event追加、PR #86でlist-level notification preference、PR #112でlogin/loading path再設計を行いました。3つのprojectはすべてNIP-52 eventを基盤にしています。
Also shipped: notedeck, nostr.blue, cliprelay, Captain’s Log
大きな見出し機能はないものの、複数clientが小刻みなreleaseを出しました。notedeckはv0.10.0-beta.4でcolumn renderingとrelay pool fixを出し、nostr.blue v0.8.6はDioxus 0.7.5を取り込み、native audio bridgeをmanganis::ffi pluginへ変えてAndroid buildを復旧しました。cliprelayはDesktop v0.0.3とAndroid v0.0.4を出し、clipboard sync loopを引き締め、32-bit Android variantを落としました。Captain’s Logは、sync relayのliveness detectionを含む3つのalpha buildを公開しています。
In Development
whitenoise-rs refactors to session-scoped account views
whitenoise-rsは、Marmot clientのRust daemonとして、global singletonからaccountごとのAccountSession viewへ移る15本のPRをマージしました。PR #743がAccountSessionとAccountManagerの土台を置き、PR #753がscoped relay handleを追加し、続くphaseでdraftとsetting、message operation、group read/write、membership、push notification、key-package read、group creationを順に移し、PR #770でevent dispatchまでsession所有へ移しました。目標は、shared monolithを副作用の漏れにくいper-account surfaceへ分解することです。
White Noise app adds block/unblock UI, leave-group, and offline notices
White Noiseは、missingだったgroup lifecycle controlを追加しました。PR #578はblock/unblock UIを出し、PR #571とPR #572はRust側のclear_chat、delete_chat、leave_and_delete_groupをappへ結び、PR #569とPR #576はchatとsettings画面へoffline noticeを追加しました。PR #585は「全key package削除」を「legacy key package削除」へ狭め、migration時にcurrent keyまで消えないようにしています。
MDK adds mixed-version invite support and SelfUpdate convergence
MDKは7本のPRをマージしました。PR #261はinvitee capabilityのLCDとしてRequiredCapabilitiesを計算し、AmethystとWhite Noise間のmixed-version inviteを可能にしました。PR #264はSelfUpdate wire formatを実装間で収束させ、PR #262はmalformed inviteeがstray stateを残さないようkey package parse順を修正し、PR #256とPR #259はrobustnessを強化し、PR #265はgroup_required_proposals accessorを公開しました。
nostter adds NIP-44 encryption across people lists, bookmarks, and mutes
nostterは10本のPRをマージしました。PR #2088はmute listへ、PR #2089はbookmarkへ、PR #2090はpeople listへNIP-44 encryptionを追加し、適用可能な箇所ではNIP-04から移行しました。PR #2087は、encrypted kind-10000 flowが安定したためlegacy kind-30000 mute migration pathを削除しています。
zap.cooking ships Nourish scoring and a reusable comment thread
zap.cookingは今週20本のPRをマージしました。中心機能は新しいNourish recipe scoring moduleで、PR #317とPR #319がrecipeを栄養軸で評価します。同時にPR #299からPR #302までの4段階refactorでComments moduleが再利用可能なCommentThreadへ抽出されました。加えてrecipe scaling、media upload button統一、profile Replies tabも入りました。
ridestr extracts shared rider coordinator
ridestrは10本のPRをマージし、Compose screenをfocused componentへ分割しつつ、rider/driver protocol logicを共有:common coordinator moduleへ抽出しました(PR #70)。PR #60はRoadflare側向けkind 3189 driver-ping receiverを追加しています。
Blossom drafts a BUD-01 Sunset header for blob expiration
Blossomは、SHA-256 hashでkey付けされたHTTP blob storage protocolで、PR #99を開き、BUD-01へSunset headerを追加する案を提示しました。serverはこのheaderでblobがいつ配信終了になるかを未来timestampとして広告でき、clientは404へ当たる前にretention制限を把握できます。標準RFC 8594 semanticsを使い、serverは助言として長めに保持しても、best-effortで宣言通り期限を守ってもよい設計です。
New Projects
Forgesworn publishes a 29-repo cryptographic toolkit for Nostr
Forgeswornは、5日間で29本のopen-source repositoryを公開し、signing、identity、attestation、web of trust、paid API discoveryをまとめたstackを提示しました。signing stackの中心は、1つのmaster secretから無制限のunlinkable Nostr identityを導くnsec-treeと、Tor default-onのRaspberry Pi向けNIP-46 remote signerであるHeartwoodです。SapwoodはHeartwoodのweb management UIで、heartwood-esp32はHeltec WiFi LoRa 32 board上の同種token logic実験です。nsec-tree-cliはoffline-first operation向けにderivation、proof、Shamir recovery flowを公開します。
identityとtrustでは、Signetがv1.6.0へ到達し、QR pairing flowとsession pubkey pinningを備えたdecentralized identity verification protocolを提供します。nostr-attestationsは、credential、endorsement、vouch、provenance、licensing、trustを1つのkind 31000イベントへ統合し、nostr-veilはNIP-85 assertionをsecp256k1上のLSAG ring signatureで支えるprivacy-preserving web of trustを構築します。monetization側では、toll-boothがExpress、Hono、Deno、Bun、Cloudflare Workers向けL402 middlewareを提供し、toll-booth-dvmがそれをNIP-90 DVMとして公開し、toll-booth-announceがkind 31402のHTTP 402 service discoveryへつなぎます。全体はTypeScript中心、zero-dependency志向で、anvilというbash-only supply-chain-hardened release toolで出荷されています。
ShockWallet ships Nostr-native Lightning wallet sync and multi-node connections
ShockWalletは、self-custodial Lightning nodeとの接続transportとしてNostrを使うLightning walletです。appは1つ以上のLightning.Pub nodeとnprofile経由でpairし、walletとnodeの間でpayment authorizationをend-to-endで署名します。PR #608はchannels dashboard UIを改善し、PR #606は新規PUB user向けadmin-invite-link QR flowを追加し、PR #607はmetrics dashboardの可読性を上げました。
ShockWalletは、multi-device wallet state syncにNIP-78 application-specific data eventを使います。これによりdesktop browserとphoneのwallet viewをcentralized sync serverなしで一致させます。これはNIP-47のさらに下の層にあり、NIP-47が既存walletへ支払いを依頼するinterfaceであるのに対し、ShockWalletはwallet自身のaccount/session transportとしてNostrを使っています。並行して、teamはwallet-to-app connection向けsession pairing protocolのCLINKも進めています。
Nostrability issues migrate to git over Nostr after GitHub censorship
Nostrabilityは、elsatによるNostr client/relay interop trackerで、GitHub organizationが停止された後、issue workflowをgit over Nostrへ移しています。issue trackerは現在GitWorkshop/ngit上にあり、既存issueも引き継がれ、今後のinterop reportをNostrネイティブなinfrastructure内で扱えるようになりました。
nowhere encodes full websites into URL fragments and routes orders through Nostr
nowhereは、site全体をURL fragmentにserializeし、dictionary substitutionとraw DEFLATEで圧縮し、base64urlで符号化する新しいAGPL-3.0 projectです。HTTPではfragmentがserverへ送られないため、pageを配るhostは中身を見ず、site自体もserverへ保存されません。projectはevent、fundraiser、store、petition、message、drop、art、forumの8種類を用意し、creatorによる署名とURL単位のpassword encryptionもサポートします。store、forum、petitionではlive communicationが必要で、その通信はephemeral keyとNIP-44 encryptionを使ってNostr relay越しに流れます。nowhr.xyz readerにより、短いstore URLはprintable QR codeとしても実用的です。
Small new surfaces: relayk.it and Brainstorm Search
relayk.itはSoapbox teamのsamが作った、Shakespeareベースのrelay discovery clientで、完全にbrowser内で動作します。Brainstorm Searchは、network全体のcontent surfacingに焦点を当てたsingle-page Nostr search UIとして公開されました。
Protocol and Spec Work
NIP Updates
NIPs repositoryでの最近のproposalとdiscussionです。
Open PRs and Discussions:
- NIP-67: EOSE Completeness Hint(PR #2317):relayがfilterに一致する保存済みイベントをすべて返し切ったかどうかを示す、任意の3番目要素を
EOSEへ追加する提案です。relay上限によって途中で切られたのか、本当に全部なのかをclientが区別できるようにします。 - NIP-5D: Nostr Applets(PR #2303):NIP-5Aの静的websiteと、進行中のNIP-5CのWASM scrollの中間にあたる、sandboxed iframe/WebViewで動くinteractive applet配布の提案です。
- NIP-29: Subgroups spec(PR #2319):1つのgroup内に複数parallel channelを持てるsubgroup hierarchyを追加し、旧client向けの単一
hタグ形を保つ案です。 - NIP-29: Explicit role permissions on kind 39003(PR #2316):kind
39003role eventへ明示permission schemaを導入し、moderatorのようなroleがrelayごとに別意味になる問題を減らす提案です。 - NIP-11: access_control field for gated-relay discovery(PR #2318):relayのgating modeとaccess request endpointを示す
access_controlobjectを追加する案です。 - NIP-63a: Minimal Payment Gateway Descriptor(PR #2315):先週扱ったkind
10164payment gateway descriptorのfield layout調整が続いています。 - NIP-XX: Agent Reputation Attestations (Kind 30085)(PR #2320):Nostr上のautonomous agentやserviceについて、reliabilityやhonest advertisingを署名付きで評価するkind
30085addressable eventを提案します。 - NIP-TPLD: Transient Private Location Data(PR #2309):kind
20411、recipientごとのNIP-44 encryption、ttltag semanticsの議論が続いています。 - marmot-ts 0.5.0 release PR(PR #70):TypeScript Marmot clientのbreaking change群をまとめたrelease PRで、legacy kind
443と新kind30443両対応、constructorとstorage layerの見直しが含まれます。
NIP Deep Dive: NIP-72 (Moderated Communities)
NIP-72は、topic-based communityをNostr上で扱うためのモデルです。relayがmembershipとmoderationのauthorityになるNIP-29とは異なり、NIP-72 communityは通常のNostr eventとして存在し、関係するkindを運べるrelayならどこでも配信できます。誰でも投稿でき、認識済みmoderatorが承認した投稿だけがcommunity feedに表示されます。
communityはkind 34550のaddressable eventで定義されます。dタグが安定slugになり、name、description、image、rulesタグが表示用metadataを持ち、pタグにmoderator markerを付けてmoderator pubkeyを列挙します。relayタグにはauthor、requests、approvalsといったmarkerを付けて、どこへどの種別のイベントを出すべきかのhintを載せられます。ユーザーはkind 1 noteやkind 30023 articleなど任意の通常イベントへ、community coordinateである34550:<creator_pubkey>:<slug>を値に持つaタグを追加して投稿します。その投稿はそれ単体でも有効なNostr eventですが、community-aware clientは認識済みmoderatorのapprovalが付いたものだけをcommunity feedへ出します。
approvalはmoderatorが公開する別個のkind 4549イベントです。そこにはsubmissionを指すeタグ、投稿者を指すpタグ、communityを指すaタグが入り、contentにはstringifyされたsubmission eventがcache copyとして埋め込まれます。これにより、元投稿が後で消されても承認済みpostをrenderできます。approval modelの利点は3つあります。moderation判断が透明でaudit可能であること、同じ投稿が複数communityで承認され得ること、そしてkind 34550からmoderatorが外されれば、そのmoderatorの古いapprovalがread layerで無効化されることです。NIP-72は、spamをwireに流したくないclosed spaceより、curated front page的なpublic topic communityに向いています。
NIP Deep Dive: NIP-57 (Zaps)
NIP-57は、Lightning paymentをNostr identityやeventへ結び付け、かつ検証可能な支払いreceiptをrelayへ戻す方法を定義します。senderが誰で、いくらを、誰へ、どの対象のために支払ったかをNostr clientが検証可能な形で見られるようにする仕様で、LNURL、Lightning、Nostrの3層をまたいでいます。
flowには4つのactorがいます。senderのclientは、recipientのkind 0 profile metadataのlud06またはlud16、またはzap対象イベントのzapタグからLNURL endpointを見つけます。そのclientは意図した支払いを記述するkind 9734 zap requestを署名し、relayではなくrecipientのLNURL callbackへ送ります。recipient側のLNURL serverはrequestを検証し、description hashがrequest eventの文字列表現へコミットするLightning invoiceを返し、senderが支払うとsenderが指定したrelay setへkind 9735 zap receiptを公開します。zap requestにはpタグ、任意のeまたはaタグ、amount、relays、任意のmessageを入れるcontent、対象kindを示すkタグが入ります。zap receiptにはdescriptionタグ内のrequest全文、bolt11、preimageが入り、recipientのLNURL responseでadvertiseされたnostrPubkeyでwallet serverが署名します。
clientがkind 9735 receiptをzapとして表示するなら、4点を検証すべきです。receipt署名がLNURL nostrPubkeyと一致すること、bolt11金額が埋め込みrequestのamountと一致すること、invoiceのdescription hashがstringified requestへコミットしていること、preimageがinvoiceのpayment_hashへハッシュされることです。これをしないzap count集計は簡単に偽造されます。private zapではcontentを暗号化してanonタグを付け、anonymous zapではephemeral keypairまで新しく生成します。NIP-57はさらにNIP-75 zap goalの土台にもなっており、AmethystのPR #2469はこの週、NIP-53 Live Activities画面でgoal progressとtop-zapper leaderboardを描画するようにしました。付録で定義されるzap splitにより、1回のzapを複数recipientへweight付きで分配することもできます。
今週は以上です。何か作っているものがある、または共有したい更新がある場合は、NostrでDMを送るか、nostrcompass.orgで見つけてください。