設計と実装

Pixelmine はこうして作られている。

アプリの下には、それぞれが明確な一つの役割を担う少数の部品があります。すべての暗号化を行うアプリ、それを保存するノードのネットワーク、全体をつなぐ軽量なサービス、そしてリアルタイム動画のための独立した経路です。あえて分離されたこれらが組み合わさることで、あなたのコンテンツとそれを読むための鍵の両方を、どの部品も同時には持たない仕組みが生まれます。

システムの全体像

四つの部品、
明確な役割。

各部品はそれぞれ一つの仕事だけを担います。封じられたコンテンツを読めるのはアプリだけであり、それ以外はすべて、保存し、運び、配信するために存在します。プライベートなものは、開くことのできない形のまま扱われます。

アプリ

あなたのデバイス上のアプリは、システム全体の信頼の起点です。鍵を生成して保持し、すべての暗号化と復号をデバイス上で直接行います。読める形のデータがサーバーに渡されることは一切ありません。

フィード、チャット、通話、ライブ動画——実際にあなたが使うのはこのアプリです。そして、封じられたデータを読めるコンテンツに戻せるのは、Pixelmine の中でアプリだけです。

鍵を保持デバイス上で暗号化コンテンツを読む

ストレージネットワーク

独立して運用される複数のノードが、ネットワークの記憶として働きます。各ノードは暗号化された投稿・メッセージ・ファイルのコピーを自ら保持し、変更を他のノードへ伝えることで、全員が最新の状態を保ちます。

ノードは誰でも運用できます。ノードが保持するプライベートなものはすでに封じられているため、ノードは自身のデータベースに完全にアクセスできても、その内容を読むことなく保存・配信・複製します。公開投稿は見られることを前提としているため、そのまま公開して配信します。

暗号化データを保存ピアへ複製内容は読まない

調整サービス

一つの軽量なサービスがネットワーク全体をつなぎます。アカウントを登録し、メッセージが宛先にたどり着くのを助け、新しい相手どうしが連絡を取り合うための封じられた鍵を受け渡し、通知を届けます。

このサービスはあえて最小限に保たれています。必要なルーティング情報だけを持ち、読めるコンテンツは一切持ちません。封じられた鍵は受け渡されると配送後に破棄されるため、価値あるものが一箇所に集まることはほとんどありません。

ルーティングと登録封じられた鍵を配送コンテンツは保存しない

ライブメディア経路

ライブ配信と通話はリアルタイムで届く必要があるため、遅延を可能な限り抑えるよう調整された独自の経路を通ります。保存されたコンテンツのある場所とは切り離されています。

可能な場合は参加者どうしで直接映像をやり取りし、視聴者が増えたときには配信に適した方式へ切り替えます。そのため、1対1の通話でも大勢の視聴者がいる部屋でも、配信は滑らかなまま保たれます。

リアルタイム動画低遅延独立した経路
アイデンティティとアカウント

あなたは鍵そのもの、
データベースの一行ではない。

盗まれるのを待つパスワードはサーバーにありません。そもそもパスワードが存在しないからです。あなたのアイデンティティはあなた自身が持つものであり、公開するものすべてにあなたの署名が付きます。

  • 登録すると、あなただけのものである鍵ファイルを受け取ります。これは、あなたしか知らない短いコードと対になっています。どちらか一方だけでは役に立ちません。
  • あなたの公開アイデンティティは鍵から導き出されるため、鍵を持たない者があなたになりすますことはできません。
  • パスワードを集めた中央の保管庫が存在しないため、攻撃者が一箇所で破れるようなものはありません。
  • ノードも同じ方法で識別されます。ノードの名前はそのノード自身の鍵から導き出されるため、別のノードになりすますことはできません。
  • トレードオフは現実にあります。あなたの鍵ファイルとコードを持つ者は、あなた自身になります。両方を失えばアカウントを失うことになります。誰も代わりに復元することはできないからです。
暗号化のモデル

一度だけ設定する鍵、
そしてメッセージごとの鍵。

投稿ごとに保護を一から用意するのは、遅く無駄も多い方法です。そこで Pixelmine は、負荷の大きい処理を相手ごとに一度だけ行い、その後は個々の投稿やメッセージを、それぞれ専用の軽快な鍵で保護します。

一度だけ確立

相手ごとの共有鍵

誰かと初めてつながるとき——フォローが承認されたり、チャットが始まったりしたとき——あなたたち二つのデバイスは、共有鍵をひそかに取り決めます。この取り決めはその二人につき一度だけ行われ、繰り返す必要はありません。

投稿・メッセージごと

毎回新しい鍵

すべての投稿やメッセージは、それぞれ真新しい鍵で施錠されます。その鍵は共有鍵を使って受信者ごとに個別に封じられ、コンテンツと一緒に届きます。そのため、正しい相手だけが開くことができます。

グループの会話では、誰かが参加または退出するたびに共有鍵が更新されます。そのため、記録はその場に実際にいた人たちのもとにとどまります。さらに、メッセージを振り分けるためのラベル——誰が会話に属するか、誰が送ったか、誰が読んだか——も施錠されます。表に残るのは素朴なルーティング用のタグだけで、ノードが中身も関係者も知ることなく何かを運ぶのにちょうど足りるだけです。

相手ごとに一度だけ設定 メッセージごとに新しい鍵 受信者ごとに封じる 将来のコンピューターにも耐える設計
投稿と公開範囲

選べば公開、
標準では封じる。

Pixelmine のすべてが秘密というわけではありません。公開投稿は読まれるためのものです。大切なのは、公開範囲をあなたが選ぶこと。そして、限られた相手に向けたものは封じられ、その相手だけが開けるようになっています。

公開投稿

あえて公開されています。公開投稿は誰に向けたものでもあるため、ネットワークは自由に運び、表示します。それこそが公開で投稿する目的です。

フォロワー限定の投稿

封じられています。一つひとつが専用の鍵で施錠され、その鍵は閲覧を許可されたフォロワーごとに個別に包まれます。

メッセージとグループ

常に封じられ、会話に参加している人だけに向けられます。それ以外の誰にも開かれず、どんな設定であっても公開されることはありません。

  • 公開範囲は、あなたが投稿した瞬間に決まります。フォロワーを外せば、その人が新しいものを受け取ることはなくなりますが、すでに開けた投稿はその人にとって読める状態のまま残ります。あとから共有を取り消すことは、どんなシステムも本当には約束できないのです。
封じられたフィードを開く

封じられていても、
スクロールは一瞬。

投稿ごとに固有の鍵があるなら、フィードを開くのは、一文字が現れるまでに山のような処理が必要になりそうに思えます。実際はそうではありません。負荷の大きい処理は投稿ごとではなく相手ごとに一度だけ行われ、鍵は1ページ分ずつ届くからです。

  • 投稿者との共有鍵は、その人の投稿を初めて開いたときに計算されます。フォローしている全員の分をあらかじめ用意するわけではありません。
  • これは投稿者ごとに一度だけ行われます。その後は鍵があなたのために保管され、サインインしたどのデバイスでも取り戻せます。
  • フィードの1ページが読み込まれるとき、アプリは投稿ごとに要求するのではなく、そのページ全体の鍵を一度の要求でまとめて求めます。
  • あとは解錠があなたのデバイス上で行う高速なローカル処理となるため、通信路上で読める形のものが一切なかったにもかかわらず、スクロールは滑らかなまま保たれます。
メッセージとチャンネル

できる限り何も
明かさない会話。

ダイレクトメッセージとグループチャットは、一つの設計を共有しています。会話は、素朴なルーティング用のラベルと封じられたコンテンツとして保存されます。ネットワークがメッセージを正しい場所へ運ぶには十分ですが、その内容を理解するには決して足りません。

  • 誰が会話に属するか、各メッセージを誰が送ったか、誰が読んだかは、すべて施錠されています。会話を識別するのは素朴なラベルだけで、それによってルーティングが可能になります。
  • グループチャットでは、誰かが参加または退出するたびに共有鍵が更新されます。そのため、新しく加わった人は自分より前のやり取りを読めず、退出した人はその後のやり取りを読めません。
  • 1対1のチャットは、単一の安定した鍵を保ちます。関わるのは常に二人だけで、メンバーが変わることはないからです。
  • 既読の通知や未読の件数さえ、施錠された目印から計算されます。そのため、誰が何を見たかもプライベートに保たれます。
ファイルとメディア

写真も動画も、
同じ扱い。

メディアはテキストとまったく同じ規則に従います。封じられた投稿に添付されたファイルはその投稿の鍵で施錠され、実際に見る瞬間に、閲覧者のデバイス上でのみ開かれます。

  • 大きなファイルは一度にではなく分割して施錠されるため、長い動画でも、端末に過大な負担をかけずに封じることができます。
  • ノードは、封じられたこれらのファイルを他の記録とまったく同じように保存し複製します。中身を見ることはできないまま、バイト列を保持します。
  • ファイルは、すべてを前もって解錠するのではなく、たどり着いたときに必要に応じて開かれます。
  • 各運用者は、自分のノードが提供するストレージの量に上限を設けられます。そのため、ノードを運用しても、際限のない負担を負うことにはなりません。
共有ネットワークでの削除

コピーだらけのネットワークから、
どう削除するか。

一つの企業のデータベースでは、単一の所有者が唯一のコピーを管理しているため、削除とは一行が消えることを意味します。独立したノードのネットワークには、そのようなてこはありません。すべてのマシンに手を伸ばして何かを消せる者は誰もいないのです。だからこそ削除は、当然のものと見なすのではなく、設計されなければなりません。

  • 削除はそれ自体が一つの記録です。アカウントが消えたことを示す署名付きの通知であり、他のどの記録ともまったく同じようにネットワークを巡ります。
  • それにはあなたの署名が付いているため、他の誰かがあなたのアカウントの削除を偽造することはできません。そしてノードは、それを自ら検証できます。
  • ノードはそれを受け取り、広まるにつれて対応します。中央の権威が命令する必要はありません。
  • トレードオフは率直で、本質的なものです。独立したコピーからなるネットワークは削除を広めることはできますが、単一の管理されたデータベースのような完全な消去を約束することはできません。
ライブ動画と通話

リアルタイムは、
独自の経路で。

保存された投稿は、ネットワーク全体に行き渡るまで少し時間がかかっても構いません。ライブ配信や通話はそうはいきません。0.5秒の遅延が、会話になるか混乱になるかの分かれ目です。だからこそリアルタイム動画は、永続性よりも即時性のために作られた、独立した経路を通ります。

できる限り直接に

映像は可能な限り参加者どうしを直接行き来します。そのため通話は、いったんストレージを経由するのではなく、すぐに届くように感じられます。

大人数にも対応

視聴者が数人を超えると、配信は一つの経路をたどって多くの視聴者へ一度に届きます。そのため、部屋が埋まっていっても配信は滑らかなまま保たれます。

閉じていても着信

着信は、独自の通知システムを通じてあなたの端末に届きます。そのため、アプリが起動しているかどうかに関わらず着信音が鳴ります。

  • ライブ動画は、保管されるのではなくその場で運ばれます。投稿のように封じて保存し複製するのではなく、リアルタイムの経路をたどります。仕事が違えば、トレードオフも違うのです。
ゴシップと交換

ノードはどう互いを見つけ、
新しいものを交換するか。

何が存在し、誰がオンラインかを教える中央のディレクトリはありません。ノードは互いに——絶えず、それぞれ自分のタイマーで——やり取りしながらそれを把握します。そのためネットワークは、ある一つのメッセージが適切な瞬間に届くことに頼るのではなく、自ら回復します。

ステップ 01

自分の存在を知らせる

ノードはただ、自分がここにいると他のノードに伝えます。存在は口づてに広まるため、誰も登録簿を管理することなく、ネットワークは誰がオンラインかを知ります。

ステップ 02

タイマーで照合する

各ノードはそれぞれの予定で起き、ピアと照合します。今取りこぼしたメッセージも次の巡回で拾われるため、完璧なタイミングに左右されるものは何もありません。

ステップ 03

変化があれば促す

ノードは新しいものを取り込むと、ピアに次の順番を待たせるのではなく、見に来るよう促すことができます。

ステップ 04

プルはしても、プッシュはしない

同期は一度に一方向で行われます。ノードは自分の側へ引き込みます。何かを押しつけられることはないため、何を受け入れるかは常にノード自身が決めます。

ネットワークを同期させ続ける

ノードはどうやって
同じデータに合意するか。

各ノードは同じ暗号化コンテンツのコピーを保持しているため、データベース全体をやり取りせずに同一の状態を保つ方法が必要です。ノードはコンパクトな指紋を比較し、本当の差分だけが残るまで絞り込みを続け、その差分だけを交換します。新しいノードも同じ方法で追いつき、また各ノードは、どれか一つを信頼するのではなく、複数のピアの間の合意に頼ります。

ステップ 01

データの指紋を取る

すべての記録は短い指紋を持ち、コレクション全体も一つの指紋を持ちます。それらは、物事が届いた順序が問題にならないように組み合わされます。

ステップ 02

比較して分割する

二つの指紋が異なるとき、データはより小さなグループに分割されて再び比較され、二つのノードが食い違う箇所へ素早く絞り込まれます。

ステップ 03

該当する記録を特定する

差のあるグループの中で、個々の指紋を突き合わせ、どの記録が欠けている、あるいは変更されているのかを正確に突き止めます。

ステップ 04

差分だけを交換する

送られるのはその記録だけです。膨大な蓄積を同期しても、実際に変わった分しか動きません。そして合計値が一致することで、転送中に何も改ざんされていないことが確認されます。

届いたものを検証する

届いたというだけで
信じられるものは何もない。

見知らぬ相手からデータを受け取るノードは、その言い分をそのまま信じるわけにはいきません。だからこそ、すべての記録は自らを証明しなければなりません。そしてその証明は、誰の権威による裏づけも必要としない何かにたどり着くまで、下へと連鎖していきます。

  • 複製されるすべての記録には、その記録自身の指紋に対して作られた、作成者の署名が付いています。たった一文字でも変えれば、署名はもう合わなくなります。
  • 作成者の鍵もまた、鵜呑みにされることはありません。それは、他のすべてと同じようにネットワークを巡ってきた、その作成者自身の記録に由来します。
  • そしてその記録は、自らを証明します。アイデンティティとは、まさにそれ自身の鍵の指紋であるため、自分のものではない鍵を主張することはできません。連鎖は、誰かが信頼しなければならない権威ではなく、自明な何かで終わります。
  • これらのいずれかを満たさない記録は、標準で即座に拒否されます。まず保存してから後で選別するのではありません。
  • そして、ノードがまだ知らない作成者から記録が届いた場合、それは推測で処理されることはありません。いったん脇に置かれ、その作成者自身の記録が追いついたのち、後の巡回で改めて提示されます。
ずれがないことを証明する

ノード全体を表す、
一つの数値。

変更がわずかなら記録を一つずつ比較すれば十分ですが、ノードにはまず、もっと大まかな問いを安価に投げかける方法が必要です。そもそも私たちは同一なのか、と。そこで、すべてのコレクションの指紋は、ノードが保持するすべてを表す一つの数値へとまとめ上げられます。

  • 各コレクションはそれぞれの指紋を持ち、その中の何かが変わった瞬間に再計算されます。
  • それらの指紋は組み合わされ、保存データもファイルも含め、ノードの記録全体を覆う一つの数値になります。
  • ノードはゴシップの際、その一つの数値だけをやり取りします。一致すれば両者は同一であり、ほかにすることはありません。
  • 一致しなければ、階層を一段ずつ下りていきます——コレクションへ、次にバケットへ、そして記録へ——すべてを交換することなく、正確な差分が浮かび上がるまで。
ネットワークに加わる

新しいノードはどうオンラインになり、
信頼を得るか。

容量を増やすのに、誰かの許可は要りません。新しいノードは他のノードを見つけ、自己紹介をし、完全なコピーを持つまで共有された記録を追いかけ始めます。そして、負荷を分担し始めます。

ステップ 01

見つけて知らせる

ネットワークは今誰がオンラインかを絶えずゴシップし合っており、新しいノードは既存のノードを見つけて自分の存在を知らせます。

ステップ 02

追いつく

同じ指紋の比較を使って共有された記録を埋めていき、欠けているものだけを引き込んで、完全に最新の状態になるまで続けます。

ステップ 03

信頼せず、突き合わせる

ノードは、どれか一つのピアを信じるのではなく、複数に確認して多数派に従います。そのため、一つの悪意ある者が歴史をひそかに書き換えることはできません。

ロジックを一歩ずつ

二つのノードの照合、
端から端まで。

どの同期も同じ道筋をたどります。ノードは一つの指紋から始め、どの記録が異なるのかを正確に突き止めるまで絞り込みを続けます。そして、正当な署名の裏づけがないものは、記録に受け入れられることはありません。

二つのノードがコレクションを比較 指紋は一致するか? はい すでに同一——完了 いいえ 256個のバケット指紋を比較 異なるバケットを切り分ける 記録の指紋を比較 欠けているものだけを要求 署名は正当か? いいえ 記録を拒否 はい 保存し、指紋を更新 両ノードが一致
照合ループの一巡
各部品はどう連携するか

一つの投稿を
システムを通して追う。

各部品はそれぞれの持ち場にとどまり、封じられたデータを次から次へと受け渡します。ここでは同じ道のりを、あなたの側からではなく、各構成要素の側から説明します。

ステップ 01

アプリが封じる

あなたのアプリはコンテンツを施錠し、その鍵のコピーを、受け取るべき一人ひとりのために封じます——そのすべてが、何かがデバイスを離れる前に行われます。

ステップ 02

ネットワークが保存する

封じられたコンテンツはストレージネットワークに渡され、そこでノードがそれを保持し、互いに複製し合うことで、どこからでも利用できる状態を保ちます。

ステップ 03

鍵が届けられる

初めて連絡を取る相手には、調整サービスが必要な封じられた鍵を受け渡し、届いたのちにそれを破棄します。

ステップ 04

受信者が開く

受信者それぞれのアプリが、自分の鍵を使ってコンテンツを開きます。その間のどの部品も、読むことのできない封じられた状態のものしか扱っていません。