アプリの下には、それぞれが明確な一つの役割を担う少数の部品があります。すべての暗号化を行うアプリ、それを保存するノードのネットワーク、全体をつなぐ軽量なサービス、そしてリアルタイム動画のための独立した経路です。あえて分離されたこれらが組み合わさることで、あなたのコンテンツとそれを読むための鍵の両方を、どの部品も同時には持たない仕組みが生まれます。
各部品はそれぞれ一つの仕事だけを担います。封じられたコンテンツを読めるのはアプリだけであり、それ以外はすべて、保存し、運び、配信するために存在します。プライベートなものは、開くことのできない形のまま扱われます。
あなたのデバイス上のアプリは、システム全体の信頼の起点です。鍵を生成して保持し、すべての暗号化と復号をデバイス上で直接行います。読める形のデータがサーバーに渡されることは一切ありません。
フィード、チャット、通話、ライブ動画——実際にあなたが使うのはこのアプリです。そして、封じられたデータを読めるコンテンツに戻せるのは、Pixelmine の中でアプリだけです。
独立して運用される複数のノードが、ネットワークの記憶として働きます。各ノードは暗号化された投稿・メッセージ・ファイルのコピーを自ら保持し、変更を他のノードへ伝えることで、全員が最新の状態を保ちます。
ノードは誰でも運用できます。ノードが保持するプライベートなものはすでに封じられているため、ノードは自身のデータベースに完全にアクセスできても、その内容を読むことなく保存・配信・複製します。公開投稿は見られることを前提としているため、そのまま公開して配信します。
一つの軽量なサービスがネットワーク全体をつなぎます。アカウントを登録し、メッセージが宛先にたどり着くのを助け、新しい相手どうしが連絡を取り合うための封じられた鍵を受け渡し、通知を届けます。
このサービスはあえて最小限に保たれています。必要なルーティング情報だけを持ち、読めるコンテンツは一切持ちません。封じられた鍵は受け渡されると配送後に破棄されるため、価値あるものが一箇所に集まることはほとんどありません。
ライブ配信と通話はリアルタイムで届く必要があるため、遅延を可能な限り抑えるよう調整された独自の経路を通ります。保存されたコンテンツのある場所とは切り離されています。
可能な場合は参加者どうしで直接映像をやり取りし、視聴者が増えたときには配信に適した方式へ切り替えます。そのため、1対1の通話でも大勢の視聴者がいる部屋でも、配信は滑らかなまま保たれます。
盗まれるのを待つパスワードはサーバーにありません。そもそもパスワードが存在しないからです。あなたのアイデンティティはあなた自身が持つものであり、公開するものすべてにあなたの署名が付きます。
投稿ごとに保護を一から用意するのは、遅く無駄も多い方法です。そこで Pixelmine は、負荷の大きい処理を相手ごとに一度だけ行い、その後は個々の投稿やメッセージを、それぞれ専用の軽快な鍵で保護します。
誰かと初めてつながるとき——フォローが承認されたり、チャットが始まったりしたとき——あなたたち二つのデバイスは、共有鍵をひそかに取り決めます。この取り決めはその二人につき一度だけ行われ、繰り返す必要はありません。
すべての投稿やメッセージは、それぞれ真新しい鍵で施錠されます。その鍵は共有鍵を使って受信者ごとに個別に封じられ、コンテンツと一緒に届きます。そのため、正しい相手だけが開くことができます。
グループの会話では、誰かが参加または退出するたびに共有鍵が更新されます。そのため、記録はその場に実際にいた人たちのもとにとどまります。さらに、メッセージを振り分けるためのラベル——誰が会話に属するか、誰が送ったか、誰が読んだか——も施錠されます。表に残るのは素朴なルーティング用のタグだけで、ノードが中身も関係者も知ることなく何かを運ぶのにちょうど足りるだけです。
Pixelmine のすべてが秘密というわけではありません。公開投稿は読まれるためのものです。大切なのは、公開範囲をあなたが選ぶこと。そして、限られた相手に向けたものは封じられ、その相手だけが開けるようになっています。
あえて公開されています。公開投稿は誰に向けたものでもあるため、ネットワークは自由に運び、表示します。それこそが公開で投稿する目的です。
封じられています。一つひとつが専用の鍵で施錠され、その鍵は閲覧を許可されたフォロワーごとに個別に包まれます。
常に封じられ、会話に参加している人だけに向けられます。それ以外の誰にも開かれず、どんな設定であっても公開されることはありません。
投稿ごとに固有の鍵があるなら、フィードを開くのは、一文字が現れるまでに山のような処理が必要になりそうに思えます。実際はそうではありません。負荷の大きい処理は投稿ごとではなく相手ごとに一度だけ行われ、鍵は1ページ分ずつ届くからです。
ダイレクトメッセージとグループチャットは、一つの設計を共有しています。会話は、素朴なルーティング用のラベルと封じられたコンテンツとして保存されます。ネットワークがメッセージを正しい場所へ運ぶには十分ですが、その内容を理解するには決して足りません。
メディアはテキストとまったく同じ規則に従います。封じられた投稿に添付されたファイルはその投稿の鍵で施錠され、実際に見る瞬間に、閲覧者のデバイス上でのみ開かれます。
一つの企業のデータベースでは、単一の所有者が唯一のコピーを管理しているため、削除とは一行が消えることを意味します。独立したノードのネットワークには、そのようなてこはありません。すべてのマシンに手を伸ばして何かを消せる者は誰もいないのです。だからこそ削除は、当然のものと見なすのではなく、設計されなければなりません。
保存された投稿は、ネットワーク全体に行き渡るまで少し時間がかかっても構いません。ライブ配信や通話はそうはいきません。0.5秒の遅延が、会話になるか混乱になるかの分かれ目です。だからこそリアルタイム動画は、永続性よりも即時性のために作られた、独立した経路を通ります。
映像は可能な限り参加者どうしを直接行き来します。そのため通話は、いったんストレージを経由するのではなく、すぐに届くように感じられます。
視聴者が数人を超えると、配信は一つの経路をたどって多くの視聴者へ一度に届きます。そのため、部屋が埋まっていっても配信は滑らかなまま保たれます。
着信は、独自の通知システムを通じてあなたの端末に届きます。そのため、アプリが起動しているかどうかに関わらず着信音が鳴ります。
何が存在し、誰がオンラインかを教える中央のディレクトリはありません。ノードは互いに——絶えず、それぞれ自分のタイマーで——やり取りしながらそれを把握します。そのためネットワークは、ある一つのメッセージが適切な瞬間に届くことに頼るのではなく、自ら回復します。
ノードはただ、自分がここにいると他のノードに伝えます。存在は口づてに広まるため、誰も登録簿を管理することなく、ネットワークは誰がオンラインかを知ります。
各ノードはそれぞれの予定で起き、ピアと照合します。今取りこぼしたメッセージも次の巡回で拾われるため、完璧なタイミングに左右されるものは何もありません。
ノードは新しいものを取り込むと、ピアに次の順番を待たせるのではなく、見に来るよう促すことができます。
同期は一度に一方向で行われます。ノードは自分の側へ引き込みます。何かを押しつけられることはないため、何を受け入れるかは常にノード自身が決めます。
各ノードは同じ暗号化コンテンツのコピーを保持しているため、データベース全体をやり取りせずに同一の状態を保つ方法が必要です。ノードはコンパクトな指紋を比較し、本当の差分だけが残るまで絞り込みを続け、その差分だけを交換します。新しいノードも同じ方法で追いつき、また各ノードは、どれか一つを信頼するのではなく、複数のピアの間の合意に頼ります。
すべての記録は短い指紋を持ち、コレクション全体も一つの指紋を持ちます。それらは、物事が届いた順序が問題にならないように組み合わされます。
二つの指紋が異なるとき、データはより小さなグループに分割されて再び比較され、二つのノードが食い違う箇所へ素早く絞り込まれます。
差のあるグループの中で、個々の指紋を突き合わせ、どの記録が欠けている、あるいは変更されているのかを正確に突き止めます。
送られるのはその記録だけです。膨大な蓄積を同期しても、実際に変わった分しか動きません。そして合計値が一致することで、転送中に何も改ざんされていないことが確認されます。
見知らぬ相手からデータを受け取るノードは、その言い分をそのまま信じるわけにはいきません。だからこそ、すべての記録は自らを証明しなければなりません。そしてその証明は、誰の権威による裏づけも必要としない何かにたどり着くまで、下へと連鎖していきます。
変更がわずかなら記録を一つずつ比較すれば十分ですが、ノードにはまず、もっと大まかな問いを安価に投げかける方法が必要です。そもそも私たちは同一なのか、と。そこで、すべてのコレクションの指紋は、ノードが保持するすべてを表す一つの数値へとまとめ上げられます。
容量を増やすのに、誰かの許可は要りません。新しいノードは他のノードを見つけ、自己紹介をし、完全なコピーを持つまで共有された記録を追いかけ始めます。そして、負荷を分担し始めます。
ネットワークは今誰がオンラインかを絶えずゴシップし合っており、新しいノードは既存のノードを見つけて自分の存在を知らせます。
同じ指紋の比較を使って共有された記録を埋めていき、欠けているものだけを引き込んで、完全に最新の状態になるまで続けます。
ノードは、どれか一つのピアを信じるのではなく、複数に確認して多数派に従います。そのため、一つの悪意ある者が歴史をひそかに書き換えることはできません。
どの同期も同じ道筋をたどります。ノードは一つの指紋から始め、どの記録が異なるのかを正確に突き止めるまで絞り込みを続けます。そして、正当な署名の裏づけがないものは、記録に受け入れられることはありません。
各部品はそれぞれの持ち場にとどまり、封じられたデータを次から次へと受け渡します。ここでは同じ道のりを、あなたの側からではなく、各構成要素の側から説明します。
あなたのアプリはコンテンツを施錠し、その鍵のコピーを、受け取るべき一人ひとりのために封じます——そのすべてが、何かがデバイスを離れる前に行われます。
封じられたコンテンツはストレージネットワークに渡され、そこでノードがそれを保持し、互いに複製し合うことで、どこからでも利用できる状態を保ちます。
初めて連絡を取る相手には、調整サービスが必要な封じられた鍵を受け渡し、届いたのちにそれを破棄します。
受信者それぞれのアプリが、自分の鍵を使ってコンテンツを開きます。その間のどの部品も、読むことのできない封じられた状態のものしか扱っていません。