Nostr Compass #14
Nostr Compassへようこそ。Nostrの週刊ガイドです。
今週の内容: Amethystが完全なNIP-47(Nostr Wallet Connect)メソッドサポートを実装、Alby Hubがv1.21.6で複数relayサポートを追加、Amberが組み込みTorとより細かい署名者権限を備えたv4.1.3を出荷、ZeusがPR #3835でリスクのあるNWC keysendパスを削除。Notedeckがv0.8.0-rc2でNIP-94(ファイルメタデータ)イベントを通じてリリースを発見する署名付きアップデーターを出荷、Damusが古いNIP-65(Relayリストメタデータ)状態を修正、Nostrability Outboxが修正データでベンチマーク結果を改訂、Primal iOSがDM用の直接relayサブスクリプションをテスト。Primal Androidが3.0.7を出荷、Route96がv0.6.0を出荷、OpenChatがv0.1.0-alpha.11でMarmot相互運用性を強化、Pikaがpika/v1.1.1でランタイムを統合、NostriaがNIP-85(Trusted Assertions)Web of Trustフィルタリングを追加。NIPsリポジトリがNIP-54(Wiki)DjotマークアップとNIP-19(Bech32エンコードエンティティ)の5000文字入力上限をマージ。
ニュース
Wallet Connectサポートが拡大し、ウォレットクライアントが障害パスを強化
vitorpaplonaがメンテナンスするAndroidクライアントのAmethystがPR #1828をマージし、NIP-47実装をほぼ完全なプロトコルカバレッジに近づけました。このパッチはmake_invoice、lookup_invoice、list_transactions、get_balance、get_info、ホールドインボイスメソッド、TLVレコード付きkeysendサポート、kind 13194による機能ディスカバリー、NIP-44(暗号化ペイロード)を使用したkind 23197の通知イベントを追加します。これにより、アプリ固有の拡張に頼ることなく、クライアントのNWCサーフェスが大幅に拡大されました。
周辺のウォレットスタックも同じ方向に動きました。多くのNWCデプロイメントを支えるセルフカストディアルLightningノードおよびウォレットサービスのAlby Hubが、複数relayサポートとよりシンプルな接続・スワップフローを備えたv1.21.6を出荷しました。モバイルLightningウォレットのZeusが、そのフローにおけるサイレントな資金流出パスを特定した後、NWC keysendサポートを削除するPR #3835をマージし、同時にペンディングイベントとCashuアクティビティの処理も修正しました。Nostr上のウォレット接続は広がっており、実装者はセキュアにしにくいフローを削除しています。
Notedeckがリリース発見をNostr上に移行
先週のNotedeck記事に続き、DamusチームのネイティブデスクトップクライアントNotedeckがPR #1326をマージした後、v0.8.0-rc2を出荷しました。新しいアップデーターは署名されたkind 1063リリースイベントを購読し、ローカルプラットフォームと照合し、参照されたバイナリをダウンロードして、インストール前にSHA256ハッシュを検証します。リリースメタデータはもはやGitHub APIやプロジェクトウェブサイトから取得する必要はありません。信頼されたリリースpubkeyとrelay接続で十分です。
同じパッチは、GitHubリリースアーティファクトからこれらのイベントを公開するnotedeck-release CLIも追加しており、リリースパイプラインにNostrネイティブの公開パスと発見パスの両方が備わったことになります。また、DamusとNotedeckのアップデーターモデルをZapstoreのrelay公開署名リリースフローにかなり近づけました。Zapstoreのzspツールは既にソフトウェアアセットをkind 1063または3063イベントとして処理しているため、このパスは1つのクライアントや1つのパブリッシャーに固定されていません。リリース候補の残りはフォローカラム、プロフィール「View As User」、NIP-59(Gift Wrap)サポート、リアルタイムノート統計、NIP-11(Relay情報ドキュメント)制限処理など、実用的なデスクトップ作業ですが、アップデーターがこの1つのリリースサイクルを超えて存続する可能性が最も高い部分です。
Relay状態がランタイム動作に近づく
DamusがPR #3665をマージし、古い保存済みrelayリストイベントIDを最新のkind 10002イベントの直接データベースクエリに置き換えました。古い値が古くなると、relay追加・削除操作がブートストラップや1年前のリストにフォールバックし、一部のrelay変更が成功したように見えても実際のアクティブ状態は変わらないままになる可能性がありました。PR #3690はLMDBコンパクション中に古いlock.mdb状態を削除することで2番目の障害パスを修正し、次回起動時にアプリがSIGBUSでクラッシュしなくなります。
Primal iOSがPR #194をオープンし、会話中にチャット相手のNIP-04(暗号化ダイレクトメッセージ)書き込みrelayに直接サブスクライブし、キャッシュサーバーをフォールバックとして維持します。NosturがPR #53をオープンし、ランダム化されたrelayスコアリング、nostr.watchのNIP-66稼働状況フィルタリング、Thompson Samplingを組み合わせて、relay選択を固定ヒューリスティックから学習ポリシーに変更します。クライアントは長い間relay選択をセットアップデータとして扱ってきましたが、より多くのアプリがそれを測定と修復ロジックが必要なライブ状態として扱うようになっています。
リリース
Primal Android 3.0.7
Primalの AndroidクライアントPrimal Androidが、新しいポールとウォレットサイクルを含む3.0.7を出荷しました。PR #945がzapベースのポール投票を追加、PR #948が投票読み込みをページネーションし大規模なポールの使いやすさを維持、PR #965がすべてのトランザクションのzapレシートを取得します。同リリースではPR #968でサポートされるイベントにNIP-89(推奨アプリケーションハンドラー)クライアントメタデータをタグ付けし、ダウンストリームクライアントがイベントの出所をよりクリーンに属性付けできるようになります。
Amber v4.1.3
先週のAmber記事に続き、NIP-55フロー用のAndroid署名者アプリAmberがv4.1.3を出荷しました。このリリースは最近のNIP-42relay認証作業の上に、より多くの運用強化を施しています。PR #327がOrbotサポートに加えて組み込みTorを追加、PR #324が粗いNIPベースの暗号化権限をコンテンツタイプ固有のルールに置き換え、PR #336がオフラインフレーバーからネットワーク権限を削除し、PR #335がそれを維持するためのCIチェックを追加します。PR #322もPINストレージを暗号化DataStoreに移行しました。
このリリースは署名者の境界自体を強化します。実際の鍵やrelay認証の判断をAmberに渡すAndroidフローにとって、難しい部分は署名者に何ができるかだけではなく、どれだけ狭くスコープを制限できるかでもあります。
Route96 v0.6.0
先週のRoute96記事に続き、BlossomとNIP-96(HTTPファイルストレージ)をサポートするメディアサーバーのRoute96がv0.6.0をリリースしました。このリリースは設定とホワイトリスト状態をホットリロード付きでデータベースに移動し、コールドまたは古くなったファイル向けの保持ポリシーを追加します。また、より豊富なGET /user/filesエンドポイントに加え、ダウンロードとエグレスのファイル統計追跡も追加し、オペレーターにストレージサーバーの使用状況に関するより多くの可視性を提供します。
OpenChat v0.1.0-alpha.11
先週のOpenChat記事に続き、Marmotスタック上に構築されたAvaloniaベースのチャットクライアントOpenChatが、1週間の高速プロトコル作業の後にv0.1.0-alpha.11を出荷しました。コミット c33895dがWelcomeイベントをNIP-59 gift wrapでラップし古いMIP-00タグ正規化シムを削除、コミット 2738ff4がMIP-02準拠監査を完了、コミット 8e470cfがMIP-03グループメッセージ暗号化について同様に完了しました。コミット 129ca37もNIP-44処理を共有marmot-cs実装に統合し、クライアントサイドの暗号ドリフトのリスクを低減しました。
nak v0.19.0 および v0.19.1
fiatjafのコマンドラインNostrツールキットnakがv0.19.0とv0.19.1を出荷しました。0.19シリーズはコミット 5f4efdbでグループフォーラムUIを追加、コミット da0b753でグループメタデータ編集を完全置換フローに切り替え、コミット bef67d3で古いno-text処理をsupported_kindsに置き換えました。グループ実装者にとって、これによりCLIがグループ仕様とクライアントが向かう方向と整合します。
プロジェクトアップデート
Amethyst
先週のAmethyst記事に続き、Nostrで最も広いプロトコルサーフェスの1つを持つAndroidクライアントAmethystは、NIP-47パッチ後もウォレットとrelay作業の構築を続けました。PR #1853がrelay管理画面全体にNIP-45(イベントカウント)COUNTクエリを追加し、各relayがホームフィード、通知、DM、インデックスデータについて実際にどれだけのイベントを保持しているかをユーザーが確認できるようになりました。PR #1849がNIP-17(プライベートダイレクトメッセージ)チャット用の暗号化ファイルアップロードを追加し、ストレージホストが暗号化バージョンを拒否した場合の非暗号化アップロードへのリトライパスも備えています。
PR #1791も完全なNIP-46(Nostr Connect)デスクトップバンカーログインをハートビートインジケーター付きで実装しました。これが重要なのは、リモート署名の失敗がユーザー側からはランダムなUI破損のように感じられることが多いためです。クライアントは署名者が生きているかどうかと最近いつ応答したかを表示し、現在のセッションがバンカーを使用している場合もそれを明確にします。
Nostria
ローカルファーストスタックを中心に構築されたマルチプラットフォームクライアントのNostriaが、フィードとスレッドリプライのWeb of Trustフィルタリングを追加するPR #561をマージしました。この機能は既存のtrust-serviceランクデータを使用し、フィードフィルターとリプライフィルターの両方として公開し、閾値をクリアしないランクの著者を非表示にしつつ、信頼された子孫が存在する場合はスレッド構造を保持します。これにより、「全員を表示」とハードコードされたリストベースのキュレーションの中間レイヤーがユーザーに提供されます。
同じ週にPR #563も実装され、サマリーページにコンテンツフィルタリングとリポストサポートが追加されました。追跡されたPRリスト外では、Nostriaはパワーユーザーサーフェスの充実も進めています。最新のBrainstorm Web of Trustサービスへのアプリ内サインアップ、NWCとBOLT-11インボイスを使用したDMでの送金・受金フロー、絵文字NIPを通じたNostrネイティブのGIF処理、ポッドキャストフィードから既存のLightningスプリットを取り込める強化されたRSSインポートパスも追加されました。Nostriaはランキング、メディア、ペイメント、パブリッシングを1つの接続されたアプリサーフェスとして扱っています。
Nostur
nostur-comがメンテナンスするiOSクライアントのNosturが、アウトボックスルーティングを固定プランからスコア付きポリシーに変更するPR #53をオープンしました。このパッチはランダム化されたrelayスコアリング、キャッシュされたnostr.watchフィードによるNIP-66 relay稼働状況フィルタリング、Thompson Samplingを追加し、relayの成功・失敗データが将来の選択を変更するようにします。設計はフィルタリングされるrelayが多すぎる場合のセーフティバルブを保持し、.onion relayも保持します。これは、relay選択を適応型システムとして扱うクライアントの最も明確な現在の例の1つです。
Nostrability Outbox
以前のOutboxベンチマークレポートに続き、NIP-65とNIP-66クライアントルーティングに焦点を当てたベンチマーク・分析プロジェクトのNostrability Outboxは、今週自身の主張を精緻化しました。PR #35がインフレートされたThompson Samplingの結果を1,511回のランにわたる完全な再ベンチマークに置き換え、NDKスタイルルーティング向けにCG3バリアントを推奨しました。PR #43が減衰とユースケース比較を追加し、0 followsキャッシュポイズニングバグを修正し、キャッシュTTLを固定した後にTellurideデータセットを再実行しました。
これは通常の意味でのプロダクト作業ではありませんが、プロジェクトの数値がよりシャープになり、以前過大に主張していた部分ではより控えめになったため、クライアント作者にとって重要です。修正された結果は依然として有用です。ランダム化された選択はOutboxが関心を持つケースにおいて純粋に決定論的なルーティングに勝ち続けており、Thompson型の学習はクライアントが有用なrelay履歴を永続化する場合にカバレッジを実質的に改善でき、NIP-66稼働状況フィルタリングはデッドrelayへの無駄な時間を削減します。この作業はNDK #387、Nostur #53、Amethyst #1833、rust-nostr #1282、welshman #53、applesauce #54とapplesauce #55を含む具体的な実装提案にも発展しています。
White Noiseバックエンド
White Noiseやその他のMarmotツーリングが使用するRustバックエンドのwhitenoise-rsが、Blossomメディア処理周辺の境界強化パッチ2件をマージしました。PR #637がBlossom URLにHTTPSを強制しアップロードタイムアウトを追加、PR #642がBlobダウンロードを100 MiBに上限設定し、過大なメディアプルがサービス拒否パスに変わることをブロックします。プライベートメッセージングソフトウェアにとって、メディアURLは暗号化されたアプリケーションロジックと信頼できないネットワークインフラストラクチャの間の最も鋭いインターフェースの1つです。今週チームはそのエッジを強化しました。
rust-nostr
Rustプロトコルライブラリのrust-nostrが、LocalRelayBuilderNip42のコンビニエンスコンストラクターを追加するPR #1280をマージしました。新しいreadとwriteヘルパーは、埋め込みrelayやテストセットアップにNIP-42認証ポリシーをコードに変換するためのより明確な方法を提供します。これは小さなライブラリパッチですが、毎回ボイラープレートを繰り返さずに認証を有効にする必要があるローカルまたはアプリバンドルrelayを構築するチームにとって重要です。
Pika
以前のPika記事に続き、MarmotベースのメッセージングアプリPikaが、ランタイム統合に焦点を当てたリリースサイクルでpika/v1.1.1とpikachat-v1.1.1を出荷しました。PR #542がCLIとサイドカー用の共有Marmotランタイムファサードを導入し、アプリホストも同じサーフェスに移行します。PR #556がOpenClawエージェントのライフサイクルとプロビジョニング状態を強化、PR #600がバックアップからの復元と管理環境向けのより厳格な回復安全性を追加しました。
直接的なユーザー向けサーフェスは前回のPika記事よりも小さいですが、アーキテクチャの変更は意味があります。グループ、メディア、通話、セッションロジックを1つの共有ランタイムの背後にまとめることで、Marmotスタックの成長に伴ってアプリとデーモンが乖離する可能性が減少します。
NIPアップデート
NIPsリポジトリへの最近の変更:
マージ済み:
NIP-54(Wiki): AsciidocからDjotへの切り替え(PR #2242):kind
30818のWikiコンテンツがDjotを正規マークアップ形式として使用するようになりました。マージされたテキストは明示的なwikilink動作、kind818のマージリクエスト例、kind30819のリダイレクト例、dタグの非ラテンスクリプト正規化例を追加します。これにより、実装者はAsciidocよりもクリーンなパースターゲットを得られ、Ruby中心のツールチェーンに依存するスペックパスが1つ削除されます。NIP-19(Bech32エンコードエンティティ): 入力制限の追加(PR #2264):仕様がBech32エンコードエンティティ文字列を5000文字で上限設定することを推奨するようになりました。NIP-19文字列はQRフロー、ディープリンク、共有シート、多くのクライアントにわたるユーザー貼り付け入力に表示されるようになったため、これは実際のパーサー価値を持つ小さな変更です。
オープンPRとディスカッション:
NIP-49(秘密鍵暗号化)向けNostrキーファイル(PR #2269):パスワード暗号化された鍵のエクスポートとインポート用の
.nostrkeyファイル形式を提案しています。マージされれば、生のncryptsec文字列をコピーするよりも通常のファイルベースのバックアップパスをクライアントに提供します。NIP-43(Relayアクセスメタデータとリクエスト)のメンバーシップ状態の一貫性(PR #2267):relayがpubkeyごとに1つの権威あるメンバーシップ状態を維持すべきであることを明確にするセクションを追加します。メンバーシップの変更やリプレイされた履歴に関するグループクライアントロジックを簡素化します。
NIP-17(プライベートダイレクトメッセージ)の削除ガイダンス(PR #2260):gift wrapされた削除イベントを通じたプライベートメッセージの編集と削除のための具体的なパスを提案しています。作業はまだオープンですが、NIP-17が古いDMフローを完全に置き換えるには、クライアント作者にここでの答えが必要です。
NIP-222向け共有インテントURI(PR #2266):モバイルおよびデスクトップアプリが共有コンテンツをNostrクライアントに渡す方法を標準化するドラフトです。現在のアプリ間フローで最も粗い相互運用エッジの1つです。
NIPディープダイブ: NIP-94(ファイルメタデータ)
NIP-94はkind 1063をファイルのファーストクラスメタデータイベントとして定義します。仕様はイベントに人間が読めるcontentと、ダウンロードURL、MIMEタイプ、ハッシュ、寸法、プレビュー、フォールバック、ストレージサービスヒントの機械可読タグを提供します。これが重要なのは、ファイルがrelayで独自のオブジェクトとしてクエリ可能になるためです。クライアントはファイルが何であるかを理解するために周囲のコンテンツからメタデータをスクレイプする必要がありません。
{
"id": "6a92ef8d7c3a1b5d4e8f9a0b1c2d3e4f567890abcdef1234567890abcdef1234",
"pubkey": "f1e2d3c4b5a697887766554433221100ffeeddccbbaa99887766554433221100",
"created_at": 1742342400,
"kind": 1063,
"tags": [
["url", "https://downloads.example.org/notedeck/v0.8.0-rc2/notedeck-macos-universal.tar.gz"],
["m", "application/gzip"],
["x", "4a5b6c7d8e9f00112233445566778899aabbccddeeff00112233445566778899"],
["ox", "4a5b6c7d8e9f00112233445566778899aabbccddeeff00112233445566778899"],
["size", "48392011"],
["dim", "0x0"],
["magnet", "magnet:?xt=urn:btih:00112233445566778899aabbccddeeff00112233"],
["i", "00112233445566778899aabbccddeeff00112233"],
["blurhash", "LEHV6nWB2yk8pyo0adR*.7kCMdnj"],
["thumb", "https://downloads.example.org/notedeck/v0.8.0-rc2/thumb.png", "bbccddeeff00112233445566778899aabbccddeeff0011223344556677889900"],
["image", "https://downloads.example.org/notedeck/v0.8.0-rc2/screenshot.png", "ccddeeff00112233445566778899aabbccddeeff001122334455667788990011"],
["summary", "Signed macOS release artifact for Notedeck v0.8.0-rc2"],
["alt", "Notedeck desktop release archive"],
["fallback", "https://mirror.example.net/notedeck/v0.8.0-rc2/notedeck-macos-universal.tar.gz"],
["service", "nip96"]
],
"content": "Notedeck macOS universal build",
"sig": "11aa22bb33cc44dd55ee66ff77889900aabbccddeeff0011223344556677889911aa22bb33cc44dd55ee66ff77889900aabbccddeeff00112233445566778899"
}
タグは見た目以上の仕事をしています。xは配信されるファイルを識別し、oxはサーバーサイドの変換前のオリジナルファイルを識別します。プレビュータグによりクライアントは完全なアセットをダウンロードせずにブラウズ可能なファイルインデックスを構築でき、summaryはそれらの横に短い抜粋を付けられます。fallbackはメインURLが失敗した場合の第2のソースを提供し、serviceはNIP-96や別のホストなど、ファイル背後のストレージプロトコルをヒントとして示します。したがってNIP-94はソーシャル投稿の下で、生のストレージの上に位置します。ファイル自体を記述し、ファイルに関する会話を記述するものではありません。
今週のNotedeckアップデーターが興味深い理由がここにあります。PR #1326はソフトウェアリリース発見に署名されたkind 1063イベントを使用し、ダウンロードしたバイナリを公開されたSHA256と照合して検証します。同じイベント形状でソフトウェアアーティファクトもメディアアップロードも記述できます。NIP-94は安定するほど古くなっていますが、より多くのプロジェクトがメタデータイベントを人のための装飾としてだけでなく、機械のためのトランスポートとして扱っているため、成長の余地があります。
NIPディープダイブ: NIP-54(Wiki)
NIP-54はkind 30818をWiki記事イベントとして定義します。仕様はdタグを正規化された記事トピックとして扱い、多くの著者が同じ主題のエントリを公開できるようにします。記事本文はcontentに格納され、タグは正規化されたアイデンティティ、表示タイトル、要約、以前のバージョンへの参照を処理します。つまりNIP-54は単なるコンテンツ形式ではなく、取得とランキングの問題でもあります。各クライアントはどの記事バージョンを表示するかを決定する必要があるためです。
{
"id": "8c94e5d1f2a300112233445566778899aabbccddeeff00112233445566778899",
"pubkey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"created_at": 1742342400,
"kind": 30818,
"tags": [
["d", "nostr-wiki"],
["title", "Nostr Wiki"],
["summary", "Djot-formatted reference article about Nostr wiki events"],
["a", "30818:11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff:nostr-wiki", "wss://relay.example.org", "fork"],
["e", "11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff", "wss://relay.example.org", "fork"]
],
"content": "Nostr is a [protocol][] for carrying events across relays.\n\n[protocol]: nostr:nevent1example",
"sig": "33cc44dd55ee66ff77889900aabbccddeeff0011223344556677889900112233cc44dd55ee66ff77889900aabbccddeeff00112233445566778899001122"
}
今週のマージはPR #2242で正規マークアップをAsciidocからDjotに変更しました。これが実装者にとって重要なのは、Djotがより厳密な独立した仕様と言語間でよりシンプルなパーサーストーリーを持つためです。マージされたテキストはリファレンススタイルwikilinkの解決方法、kind 818のマージリクエストの使用方法、kind 30819のリダイレクトの使用方法、非ラテンスクリプトのdタグ正規化の動作方法も明確にしています。これらは2つの独立したクライアントがリンクの指す先の記事について合意する部分です。
NIP-54はプロトコル内で特殊な位置にもあります。Wikiクライアントはコンテンツレンダリングを必要としますが、ランキングポリシーも必要です。リアクション、relayリスト、コンタクトリスト、明示的な委譲シグナルはすべて、特定のトピックでどの記事が勝つかに影響します。Djotへの切り替えはこのランキング問題を解決しませんが、その下にあったパーサーの曖昧さの1つを取り除きます。今このマージが重要な理由がここにあります。変更はより見栄えの良い散文フォーマットについてではなく、マルチクライアントWiki動作を一貫して実装しやすくすることについてです。
何か作っていますか、それとも取り上げてほしいことがありますか?NostrでNIP-17 DMをnpub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923宛にお送りください。