Nostr Compassへようこそ。Nostrの週刊ガイドです。

今週の内容: BitchatがCure53による専門的なセキュリティ監査を受けました。Cure53はSignalやNIP-44の監査も行った同じ企業で、重大な発見を修正する17以上のPRがすでにマージされています。NIP-71がマージされ、アドレス可能な動画eventがプロトコルに導入されました。ポスト量子暗号NIPが量子攻撃に対するNostrの将来的な防御について議論を開始しました。Amethyst v1.05.0がブックマークリスト、ボイスノート、および初期デスクトップリリースを提供し、Nostur v1.25.3がNIP-17 DMのリアクションとリプライを改善しました。ライブラリ関連では、rust-nostrがSQLiteとLMDBバックエンド全体でNIP-62サポートを拡大し、NDKがサブスクリプション追跡のバグを修正しました。

ニュース

BitchatがCure53セキュリティ監査を完了

NostrとCashuを組み合わせたiOS暗号化メッセンジャーであるBitchatが、業界で最も信頼されているセキュリティ企業の一つであるCure53による専門的なセキュリティ監査を受けました。Cure53は以前、Signal、Mullvad VPN、そして特に現代のNostrプライベートメッセージングの基盤となるNIP-44暗号化仕様の監査を行いました。

監査では12以上のセキュリティ問題(BCH-01-002からBCH-01-013)が発見されました。Bitchatチームは17以上のプルリクエストで対応しました。主な修正は以下の通りです:

Noise Protocol DH Secretのクリア - PR #928は、鍵合意後にDiffie-Hellman共有シークレットがゼロ化されていなかった6箇所を修正し、前方秘匿性の保証を回復しました。シークレットが必要以上に長くメモリに残ると、メモリダンプやコールドブート攻撃によって過去の通信が危険にさらされる可能性があります。

署名検証 - 複数のPRが暗号化検証パスを強化し、不正な入力によるメッセージ認証チェックのバイパスを防止しています。

スレッドセーフティ - PR #929はNostrTransportの既読レシートキューにバリア同期を追加し、大量のメッセージ処理時にデータ破損やクラッシュを引き起こす可能性のある競合状態を防止しています。

メモリセーフティ - PR #920は、メモリ枯渇を避けながら高メッセージスループットでのパフォーマンスを向上させるためにメッセージ重複排除機能を最適化しています。

入力検証 - PR #919は、サービス拒否攻撃の一般的な攻撃ベクトルである不正な入力によるクラッシュを防ぐため、16進文字列のパースを強化しています。

BitchatはCashu ecashを扱うため、専門的なセキュリティレビューが不可欠です。この監査は、昨年のMarmot Protocol監査と、暗号化レイヤーを検証したNIP-44監査に続くものです。

NIPアップデート

NIPsリポジトリへの最近の変更:

マージ済み:

  • NIP-71 - アドレス可能な動画event(#1669)は、アドレス可能なeventとしてkind 34235(横向き動画)とkind 34236(縦向き動画)を導入しています。必須のdタグが一意の識別子を提供するため、event全体を再公開せずに動画メタデータを更新できます。オプションのoriginタグはインポート元を追跡します。Amethystとnostrvineですでに実装済みです。

オープンPR:

  • ポスト量子暗号 - PR #2185は、Nostrに量子耐性暗号アルゴリズムを追加することを提案しています。この仕様では、個人ユーザーではなくアプリケーションや認証局などの「超高価値event」を対象として、デジタル署名用のML-DSA-44とFalcon-512を導入しています。NIP-44の対称暗号(ChaCha20)は量子耐性がありますが、鍵交換はShorのアルゴリズムに対して脆弱なsecp256k1 ECDHを使用しています。この提案では、このギャップに対処するため鍵合意用のML-KEMを含んでいます。これはNostrの長期的なセキュリティのための暗号アジリティについて議論を開始する初期段階の提案です。
  • NIP-47用BOLT12 - 137件のコメントと広範な議論の後、コミュニティはBOLT12 offerをNIP-47の拡張ではなく独自の仕様とすることを決定しました。BOLT12 offerはBOLT11 invoiceに比べて、再利用性、ブラインドパスによるより良いプライバシー、およびオプションの支払者情報など大幅なアップグレードを提供します。新しいNIPは、Nostr Wallet Connect実装用のmake_offerpay_offerlist_offersなどのメソッドを定義します。
  • Audio Track NIP - PR #1043は、音楽トラック用のkind 32100とポッドキャストエピソード用のkind 32101を提案し、NIP-71が動画に提供するのと同じファーストクラスの扱いをオーディオコンテンツに与えます。現在、Wavlake、Zapstr、Stemstrなどのオーディオプラットフォームはそれぞれ独自のeventフォーマットを使用しており、エコシステムが分断されています。共通の標準により、ユーザーが互換性のあるどのクライアントからでもオーディオを発見して再生できる相互運用性が実現します。
  • NIP-A3 Universal Payment Targets - PR #2119は、RFC-8905 payto: URIを使用してkind 10133 eventで複数のネットワークにわたる支払いオプションを公開することを提案しています。Bitcoin、Lightning、Cashu、または従来の決済レールごとに個別のevent kindを作成するのではなく、この抽象化によりクライアントは標準化されたタグを解析してネイティブの支払いハンドラーを呼び出すことができます。新しい支払い方法はpayto: URIスキームだけが必要なため、このアプローチは将来にも対応しています。

NIP詳細解説:NIP-51とNIP-65

今週は、ユーザー設定を保存する2つのNIPを取り上げます:コンテンツを整理するためのNIP-51と、relay接続を整理するためのNIP-65です。どちらも置換可能なeventを使用しており、新しい公開ごとに以前のバージョンを上書きします。

NIP-51:リスト

NIP-51は、event、ユーザー、ハッシュタグ、その他のコンテンツへの参照を整理するための複数のリストタイプを定義しています。Amethyst v1.05.0がブックマークサポートを追加したので、リストがどのように機能するかを理解するのに良い機会です。

この仕様では、それぞれ異なる目的を持つ複数のリストkindが定義されています。Kind 10000はユーザー、スレッド、または単語を非表示にするためのミュートリストです。Kind 10001はプロフィールに表示するeventをピン留めします。Kind 30003はブックマークを保存し、これがAmethystがサポートするようになったものです。その他のkindは、フォローセット(30000)、キュレーションされた記事コレクション(30004)、ハッシュタグの興味(30015)、カスタム絵文字セット(30030)を扱います。

リストはタグを通じてコンテンツを参照します。ブックマークリストは特定のevent用にeタグを使用し、記事などのアドレス可能なコンテンツ用にaタグを使用します:

{
  "id": "ae3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "pubkey": "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
  "created_at": 1736784000,
  "kind": 30003,
  "tags": [
    ["d", "saved-articles"],
    ["e", "abc123def456...", "wss://relay.example"],
    ["a", "30023:author-pubkey:article-id", "wss://relay.example"]
  ],
  "content": "<encrypted-private-bookmarks>",
  "sig": "908a15e46fb4d8675bab026fc230a0e3542bfade63da02d542fb78b2a8513fcd0092619a2c8c1221e581946e0191f2af505dfdf8657a414dbca329186f009262"
}

dタグは一意の識別子を提供するため、同じkindの下で「saved-articles」、「read-later」、「favorites」のような複数のブックマークセットを維持できます。

リストは公開アイテムと非公開アイテムの両方をサポートしています。公開アイテムはタグ配列に表示され、eventを取得する誰もが見ることができます。非公開アイテムはcontentフィールドに入り、NIP-44を使用して自分自身に暗号化されます。この二重構造により、公開ブックマークを維持しながら非公開メモを添付したり、ミュートした相手を明かさずにミュートリストを維持したりできます。自分自身に暗号化するには、自分のpubkeyを受信者としてNIP-44を使用します。

10000シリーズのkindは置換可能で、relayはpubkeyごとに1つのeventのみを保持します。30000シリーズはパラメータ化された置換可能で、pubkeyとdタグの組み合わせごとに1つのeventを許可します。どちらの場合も、リストの更新は完全な置換を公開することを意味し、増分変更を送信することはできません。クライアントは、他のアプリケーションによって追加されたデータを上書きしないよう、リストを変更する際に不明なタグを保持する必要があります。

NIP-65:Relay List Metadata

NIP-65は、ユーザーが読み取りと書き込みに使用するrelayを通知するkind 10002 eventを定義しています。これにより、他のユーザーやクライアントがあなたのコンテンツを見つけやすくなります。

{
  "id": "bd2217a96b5835b59f9a6a42d8d8a36f8c9b7d4e5f0a1b2c3d4e5f6a7b8c9d0e1",
  "pubkey": "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
  "created_at": 1736784000,
  "kind": 10002,
  "tags": [
    ["r", "wss://relay.damus.io", "read"],
    ["r", "wss://nos.lol"],
    ["r", "wss://relay.nostr.band", "write"]
  ],
  "content": "",
  "sig": "f1c2d3e4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2"
}

rタグにはrelay URLとオプションのマーカーが含まれています。writeマーカーはあなたのoutboxを指定します:あなたがコンテンツを公開するrelayです。readマーカーはあなたのinboxを指定します:メンション、リプライ、タグを確認するrelayです。マーカーを省略すると両方を示します。

AliceがBobの投稿を見つけたい場合、彼女のクライアントはBobのkind 10002を取得し、彼のwrite relay(彼のoutbox)を抽出して、そこでサブスクライブします。AliceがBobに返信する場合、彼女のクライアントは彼のread relay(彼のinbox)に公開して、彼がメンションを見られるようにします。このrelay対応のルーティングが「outboxモデル」であり、全員を少数の中央サーバーに集中させるのではなく、ユーザーを多くのrelayに分散させます。

NIP-65は公開コンテンツのルーティングを処理しますが、プライベートメッセージは別のリストを使用します。NIP-17rタグの代わりにrelayタグを使用して、DM inbox relay用のkind 10050を定義しています。誰かにプライベートメッセージを送信する際、クライアントは受信者のkind 10050 eventを探し、暗号化されたgift-wrappedメッセージをそこに公開します。この分離により、DMルーティングは公開コンテンツのルーティングとは別に保たれ、ユーザーはプライベート通信と公開通信で異なるrelayを指定できます。

outboxモデルは検閲耐性を向上させます。単一のrelayが全員のコンテンツを保存または提供する必要がないためです。クライアントはフォローしているユーザーのNIP-65 eventにリストされているrelayへの接続を維持し、新しいアカウントを発見すると動的に新しいrelayに接続します。NIP-65は他のNIPで見つかるrelayヒントを補完します。["p", "pubkey", "wss://hint.relay"]で誰かをタグ付けすると、ヒントはその特定の参照をどこで探すべきかをクライアントに伝えます。NIP-65は権威ある、ユーザー制御のリストを提供し、ヒントは個々のeventに埋め込まれたショートカットを提供します。

最良の結果を得るために、relayリストを最新に保ってください。古いエントリがあると見つけにくくなります。仕様ではカテゴリごとに2〜4個のrelayを推奨しています。リストに多すぎるrelayを載せると、あなたのコンテンツを取得したいすべてのクライアントの負担となり、体験が遅くなりネットワーク負荷が増加します。クライアントはNIP-65 eventをキャッシュし、ユーザーが設定を更新すると定期的に更新して最新の状態を維持します。

リリース

Amethyst v1.05.0 - 人気のAndroidクライアントがメジャーアップデートを提供し、いくつかの主要機能を搭載しています。NIP-51 kind 30003ブックマークリストにより、ユーザーは後で参照するために投稿を保存でき、互換性のあるクライアント間で同期されます。ボイスノートがDMと通常の投稿で機能するようになり、波形表示、メディアサーバー選択、アップロード進捗インジケーターが付いています。Web of Trustスコアがインターフェースに表示されるようになり、アルゴリズムがソーシャルグラフに対してアカウントをどのように評価するかをユーザーが理解できるようになりました。Quartzデータベース移行により、OpenSatsが資金提供したKotlin Multiplatform作業の一環としてクエリパフォーマンスが向上しています。Compose Multiplatformを介したWindows、macOS、Linux向けの初期デスクトップリリースで、Androidアプリと同じコードベースを共有しています。新規ユーザーのオンボーディングフローにより、初めてNostrを使用するユーザーの体験がスムーズになります。

Nostur v1.25.3 - iOSおよびmacOSクライアントがNIP-17の改善を含むプライベートメッセージングに焦点を当てています。DMの会話でリアクションとリプライがサポートされるようになり、暗号化されたメッセージに公開投稿のインタラクティブ性がもたらされました。会話ビューがより良いスレッド表示で作り直され、複数メッセージのやり取りが追いやすくなり、DMリストではタイムスタンプが「〜前」と表示されて素早く確認できます。デスクトップユーザーは複数のフィードや会話を並べて表示するマルチカラムレイアウトを利用できます。NIP-46リモートサイナーサポートにより、ユーザーはAmberやnsec.appなどの専用サイナーアプリに秘密鍵を保管できます。追加の修正により、iOS 15およびiOS 16でのDM機能が復元され、通知の遅延が解決され、公開されたDMがどのrelayに送信されるかを設定する機能が追加されました。

注目のコードとドキュメント変更

これらはオープンプルリクエストと初期段階の作業であり、マージ前にフィードバックを得るのに最適です。興味を引くものがあれば、レビューやコメントを検討してください!

Citrine(Android Relay)

PR #89は、Android個人relayアプリのSQLインジェクション脆弱性を修正しています。この問題により、不正なeventデータが任意のデータベースクエリを実行できる可能性がありました。これは、信頼されていない入力を保存して処理するすべてのアプリにとって深刻な欠陥です。修正では、パラメータ化されたクエリを使用してすべてのデータベース操作を適切にサニタイズしています。まだリリースがタグ付けされていないため、ユーザーは次のバージョンを待つかソースからビルドする必要があります。PR #90は、データベースレベルのフィルタリングとページネーションでContentProviderクエリのパフォーマンスを最適化し、Amethystなどの外部アプリがAndroidのプロセス間通信レイヤーを介してCitrineのeventデータベースにアクセスする際のレイテンシを削減しています。

rust-nostr(ライブラリ)

NIP-62(Vanish Requests)サポートがrust-nostrのデータベースバックエンド全体に拡大しています。2週間前にマージされたPR #1180は、データベースレイヤーが特定のrelay URLを知らないため、ALL_RELAYS vanishリクエストを処理するSQLiteへのNIP-62サポートを追加しました。PR #1210はこれをLMDBバックエンドに拡張し、vanishリクエストがディスクに永続化されrelayの再起動後も維持されるようにしています。ブラウザ環境用のIndexedDB実装も進行中です。これらの変更により、開発者はSQLite、LMDB、そして間もなくブラウザストレージ全体で一貫したNIP-62サポートを得られます。

NDK(Nostr Development Kit)

PR #375は、seenEvents追跡システムのバグを修正しています。この問題により、特定のサブスクリプションパターンがeventを誤って既読としてマークし、ユーザーが新しいサブスクリプションを開いたりrelayに再接続したりするとコンテンツが見逃される原因となっていました。修正により、サブスクリプションのライフサイクル全体でeventが正確に追跡されるようになります。これは、ユーザーのナビゲーションに基づいて動的にサブスクライブおよびアンサブスクライブするアプリケーションにとって特に重要です。NDKはこの修正を含むbeta.70にバンプされました。

Damus(iOS)

PR #3515は、iOS 17ユーザーに影響する起動時クラッシュを修正しています。この問題は、Swift MutexがiOS 17で利用できないために使用されるフォールバッククラスであるNdbUseLockでの算術オーバーフローに起因していました。修正では、以前の同期アプローチをiOS 17で利用可能で残りの競合状態を適切に処理するNSLockに置き換えています。iOS 18以降のユーザーはネイティブのSwift Mutex実装にアクセスできるため影響を受けませんでした。

別途、PR #3509を通じて長文記事の改善がまとめてランディングしました。読書進捗バーが記事内の位置を追跡し、プレビューに推定読書時間が表示され、調整可能な行の高さ設定を備えたセピアモードがより快適な読書を提供します。フォーカスモードは下にスクロールするとナビゲーションクロームを自動的に非表示にし、タップで復元することで、気が散らない読書のための視覚的な乱雑さを減らします。いくつかの修正により、マークダウンコンテンツ内の画像表示が対処され、記事が途中ではなく最初から開くようになりました。

Zap.stream(ライブストリーミング)

YouTubeとKickのチャット統合により、外部ストリーミングプラットフォームからのメッセージがNostrにブリッジされます。YouTube、Kick、Zap.streamにマルチキャストするストリーマーは、各プラットフォームからのメッセージがネイティブのNostrコメントと一緒に表示される統合ビューですべてのチャットメッセージを見ることができます。これにより、ストリーミングにNostrを使用したいが既存のプラットフォームの視聴者を放棄できないクリエイターにとっての大きな摩擦点が取り除かれます。統合では、各メッセージがどのプラットフォームから発信されたかが表示され、外部アカウントを接続するための認証フローが処理されます。

Chachi(NIP-29 Groups)

NIP-29グループチャットクライアントが今週6つのマージされたPRを提供しました。セキュリティアップデートは、オープンリダイレクト攻撃を可能にする可能性のあるreact-routerのXSS脆弱性であるCVE-2026-22029に対処しています。修正ではreact-router-dom 6.30.0にアップデートしています。PR #92は、グループチャットにページ分割されたメッセージ読み込みを追加し、長い会話が一度にすべてではなく段階的に読み込まれるようにしています。PR #91は、初回読み込み時にグループ名が空白になる競合状態や、メンバービューをクラッシュさせる未定義の参加者リストなど、いくつかのNIP-29バグを修正しています。翻訳カバレッジは現在、サポートされている31のロケールすべてで各1060キーに及んでいます。

0xchat(メッセージング)

Telegramスタイルのメッセージングクライアントは、外部署名アプリを使用する際にサイナーパッケージ名を適切に保存することでNIP-55コンプライアンスを改善し、アプリが再起動後にどのサイナーを使用するかを見失う問題を修正しました。NIP-17のリプライ処理は、スレッド用のeタグを正しく含めるようになり、クライアント間でリプライが正しい会話コンテキストに表示されるようになりました。パフォーマンスの最適化により、長いチャット履歴を読み込む際の一般的な問題点であるメッセージリストのスクロールラグに対処しています。下書きの自動保存により、作成中にナビゲートしてもメッセージが失われるのを防ぎ、ファイルストレージオプションにはデフォルトのFileDropServerとBlossomServerエンドポイントが含まれるようになりました。

Primal(iOS)

NIP-46リモートサイナーサポートがPR #184を介してiOSに到着し、数週間前にAndroidで始まったクロスプラットフォーム展開が完了しました。ユーザーは秘密鍵をnsec.appや自己ホスト型のnsecBunkerインスタンスなどの専用バンカーサービスに保管し、Nostr relay経由で接続してクライアントアプリに鍵を公開せずにeventに署名できるようになりました。この分離により、より厳格な鍵管理プラクティスを維持しながらPrimalの機能を使用したいユーザーのセキュリティ態勢が改善されます。実装にはバンカー接続URI用のQRコードスキャンが含まれ、暗号化されたrelayメッセージを介したNIP-46リクエスト/レスポンスフローを処理します。


今週は以上です。何か構築中ですか?共有したいニュースがありますか?あなたのプロジェクトを取り上げてほしいですか?NIP-17 DMで連絡するか、Nostrで見つけてください。