Concordは、Nostr上のend-to-end encryptedなコミュニティとチャンネル向けの、MITライセンスのオープンなプロトコルで、CORD-01からCORD-07までの仕様で定義されています。Vectorはv0.4.0以降、Group Chats機能のデフォルトのtransportとしてこれを採用し、自身のリリースノートでは「独自のメッセージングプロトコル」と呼んでいますが、仕様そのものはVectorとは別に公開されており、すでに独立した実装が存在します。

仕組み

Concordは、Discord風のコミュニティサーバーが通常担う機能を、誰も信頼する必要のない部品へと分割します。relayは常に、rotateするラベル宛てに暗号化されたblobのみを保持し、部屋の鍵を保持していることがメンバーである証となり、role、kick、banに対する権限は、owner のidentityに根ざした署名済みrosterで、これを各clientがサーバーに強制を委ねる代わりにローカルで検証します。永続的なeventはすべて、同じ3層のenvelopeに乗ります。planeそれ自身の導出したstream keyで署名されたkind 1059のwrapが、authorの本物の鍵で署名されたsealを含み、そのsealが機能的なeventを運ぶ署名なしのrumorを含みます。chat messageのrumorは、素のkind 9 eventです。

{
  "kind": 9,
  "pubkey": "<author>",
  "content": "Hey chat!",
  "tags": [
    ["channel", "<channel_id>"],
    ["epoch", "0"]
  ]
}

control、chat、guestbookの各トラフィックは、それぞれ独自のNIP-59 gift-wrappedなplaneを得るため、3種すべてを保持するrelayでも、部屋の鍵なしにはcontrol messageとchat messageとguestbook entryを区別できません。仕様は7つのCORDドキュメントに分かれています。private stream(01)、communityとmembership(02)、channel(03)、role(04)、invite(05)、削除されたメンバーを締め出すためのrekeyingと再創設(06)、そしてblind token brokerを介したaudio/video(07)です。membershipそのものにはサーバー側のリストがありません。planeを復号できる者がメンバーであり、誰かを本当に削除するとは、テーブルから行を削除するのではなく、communityを新しいkey epochへ巻き上げ、残った者だけに鍵を渡すことを意味します。

Marmotとの違い

ConcordとMarmotは、異なるグループの形に対して異なる暗号技術で、Nostr上の暗号化グループメッセージングを解きます。Concordプロジェクト自身の比較は、この分担を明示しています。Marmotは、forward secrecyとpost-compromise securityのためにNostrの上にMLSを重ね、per-device key packageと、グループ全体を足並みそろえて進める順序付きのcommitを使います。これは強い保証を得ますが、そのコストはmembershipの変更とともに増大するため、参加や離脱がまれな、小規模で高リスクなグループに適しています。Concordは代わりに、すべてのメンバーに同じ部屋の鍵を与え、commitごとにratchetする代わりに削除時に部屋全体をre-keyし、MLSの暗号的保証の一部を手放す代わりに、communityが数百から数千の、カジュアルで入れ替わりの激しいメンバーへと成長してもコストが安いままのモデルを取ります。これはDiscord風のcommunityが実際に取る形です。

なぜVectorは切り替えたのか

Vector自身のv0.4.0リリースノートは、Group Chats向けのConcordを「独自のメッセージングプロトコル」とだけ説明し、理由を直接述べていません。それでも、Concord自身の公開された論拠との整合性は明確です。VectorのようなclientにおけるGroup Chatsは、Marmotのper-device MLS stateがより高コストな経路となる、まさに大規模で開かれた、membershipが頻繁に変わるケースであり、Concordの非同期でいつでも畳み込める設計は、そのケースのために作られています。Vector v0.4.0はGroup ChatsでMarmotを退け、Concordを採用し、既存のMarmotグループ履歴はこの切り替えで引き継がれませんでした。v0.4.1は4日後に、プライバシーと安定性の改善を伴う「Concord v2」を出荷しました。同じ週のうちに、Amethystは独自のclean-roomでwire互換なConcord実装をマージし、SoapboxのDiscord風client Armadaはすでに、reference実装として同じ仕様の上にCommunities機能を築いています。3つの独立したclientが数日のうちに1つのオープンな仕様へ収束することは、実際のcross-client interopへの速い経路であり、残りのNostrのグループチャットclientがどれだけMarmotに留まるかと照らして追う価値があります。

実装

  • Vector - single-binaryでprivacy-firstなNostrメッセンジャー。Concordを最初に出荷したclientで、v0.4.0にて
  • Armada(Soapbox) - Discord風のcommunity client。reference実装で、backendは別のarmada-relayリポジトリに
  • Amethyst - 機能豊富なAndroidおよびマルチプラットフォームのNostr client。Armadaとwire互換なclean-room再実装(PR #3566)

Primary sources:

Mentioned in:

See also: