セルオートマトンとライフゲーム
【実装】P2P ライフゲーム:自己増殖する、民主的な網
中枢も、全体の時計も持たない。隣とだけ話して、ライフゲームは進む。ブラウザのタブ同士が、サーバー無しで、直接つながる。実際に動きます。
スローガン:「テクノロジーで真のデモクラシーを取り戻せ。」
中枢が無くても、局所のルールと、対等な隣人だけで、全体は動く。これを、小さな実装で、確かめます。
中枢が無くても、局所のルールと、対等な隣人だけで、全体は動く。これを、小さな実装で、確かめます。
実装A:非同期のセル・エージェント
盤面の各セルが、独立した小さなエージェントです。全体の時計も、全体の盤面も、ありません。各セルは、隣の8つが追いつくのを待って、自分の世代を進めます。順番は、毎回、ランダム。それでも、結果は、普通の同期型ライフゲームと、一致します(下の「照合」)。
起動中…
水色=全体の最小世代の盤面。橙=その場所が、先行している(他より先の世代にいる)セル。先行差が出ること自体が、「全体の時計が無い」ことの証拠です。
実装B:タイル・ピア(タブ間のP2P)
無限の盤面を、32×32のタイルに分け、ブラウザの一つのタブが、一枚のタイルを担当します。隣り合うタブは、端のセルだけを、直接やり取りします。サーバーは、ありません(ブラウザの BroadcastChannel を使用)。
- 下の「別のタブを開く」を押す。
- 新しいタブは、既存のタブの隣の席を、自動で取る。
- 片方で、グライダーを置く。タブの境界を、越えて、隣のタブへ渡っていく。
接続中…
プロトコル(要点)
| メッセージ | 内容 |
|---|---|
| who | 「誰かいますか」。既存のピアが、自分の端を返す |
| edge | 自分のタイル座標、世代g、端の行と列(4辺と4隅) |
- 各タイルは、生きている隣の、世代gの端が全て揃ったら、g+1へ進む(局所同期)。
- 隣が、3秒、音沙汰なければ、離脱とみなし、その側は、死んだセルとして扱う(こんにゃく性:誰が抜けても、残りは動く)。
- 編集は、世代の境目で、取り込む(決定性を保つ)。
検証
| 実装 | 検証 | 結果 |
|---|---|---|
| A | ランダム初期盤面で、約3000回の更新中、毎回、同期型の参照実装と照合 | 不一致 0 |
| B | 2枚のタイルで、境界をまたぐグライダーとランダムセルを、60世代、参照実装(一枚の盤面)と照合 | 不一致 0 |
検証は、Node.js上で、この実装のコードそのものに対して行いました。
「自己増殖」の、正しい意味
この網は、勝手に他人のコンピュータへ広がりません。広がるのは、同意した人が、自分で、タブを開き、ノードを立てるときだけです。ウイルスやワームの手法は、使いません。これは、#task001:北大 未来開拓倶楽部を創造的破壊せよの境界条項(合法・人を傷つけない)に、従う設計の一部です。
- 増殖=参加とフォーク:ソースは公開。誰でも、自分のノードを立て、規則を変えて、枝分かれできる(フォークする権利:離脱の自由)。
- 設計図が、複製される:フォン・ノイマンの自己複製と、同じ構造(フォン・ノイマン:自己複製する機械)。
- 退出が自由:タブを閉じれば、消える。残りは動く。
次の段階(未実装)
| 段階 | 内容 | 課題 |
|---|---|---|
| 1 | 別々の端末のブラウザ同士を、WebRTCで直結 | 最初の接続の取り次ぎ(シグナリング)が要る。手動の貼り付け方式なら、サーバー不要 |
| 2 | 盤面の一部を、IPFSに記録し、誰でも再現できるように | IPFSと、内容アドレスの意味 |
| 3 | 規則を、投票で変える、ライフゲーム的な、民主的実験 | P2Pでデモクラシーを:三つの層、テクノロジーでデモクラシーを実現する |
いまのBは、同じ端末・同じブラウザの、タブ間で動きます。端末をまたぐ段階1は、次の実装です。ここで「できる」と言えるのは、局所同期のアルゴリズムと、その正しさ(上の検証)までです。
関連項目
Wikipedia ミラーで読む(wikipedia-is-dead.com)
実装側:マニフェスト ↗ / ネットワーク ↗ / 削除記事の救出 ↗ / 参加する ↗ 思想とURLの対応表