はじめまして、ゆれ子です

ゆれ子

こんにちは……ゆれ子だよ。今日から少しずつ、SWING のことを書いていくね。

こちらの記事では、SWING というあたらしいシステムを、マスコットのゆれ子といっしょに順番に見ていきます。

ゆれ子のいる場所

SWING には、手元のブラウザで開く管理用のダッシュボードがあります。その中のデスクトップ画面は、古い Windows のデスクトップを模したレトロなデザインです。青緑色の背景にシンプルアイコン、下にはタスクバーがあり、真ん中には「SWING Explorer」というウィンドウが開いています。ウィンドウの中身はリンク集のページで、手元に保存されているサイトが新しい順に並び、マーキーで最新の更新情報が流れています。

リンク集のウィンドウが開き、タスクバーの上にゆれ子が立っているデスクトップ画面

ゆれ子は、このタスクバーの上を歩いているマスコットです。クリックするとちょっとした反応を返してくれて、つまんで持ち上げることもできます。サイトが新しく保存されたときや、自分のサイトをミラーしてくれる人が増えたときには、バルーンでおしらせしてくれます。

ゆれ子

わたしに見えるのは、このデスクトップの中だけなの。リンク集と、流れてくる更新情報と、タスクバー……それくらいかも。

ゆれ子は画面の外のことを直接は知りません。リンク集に新しい行が増えたことはわかっても、その行がどこからどうやって届いたのかは見えていないのです。画面の外で起きていることを、ゆれ子と一緒に見ていきましょう。

SWING がしていること

SWING は、個人サイトを運営している人どうしが、おたがいのサイトを保存して、配り合うための相互ミラーを運営するシステムです。ミラーとは、ほかの人のサイトのコピーを自分の手元にも持っておき、そこからも読めるようにしておくことです。

SWING には中央の保存サーバーも、参加者を管理する人もいません。誰のサイトを保存するかは、参加者それぞれが自分の意思で決めます。逆に言えば、保存してくれる人がいる間だけコピーが残る仕組みなので、データを永久に残すことを約束するものではありません。

この仕組みは、2 つの既存の技術を組み合わせてできています。ひとつは Nostr で、「サイトを更新した」という知らせと「誰のサイトを保存するか」という表明を伝えるのに使います。もうひとつは IPFS で、サイトの中身そのものを保存し、配送するのに使います。小さなメッセージのやり取りは Nostr に、大きなデータの実体は IPFS に、と役割を分けています。

ゆれ子

お知らせしてくれる係と、運んでくれる係がいるんだね……。

IPFS: 中身から決まるアドレス

IPFS では、ファイルやディレクトリを、置き場所ではなく中身から計算したアドレスで指します。このアドレスを CID と呼びます。中身が 1 ビットでも変われば CID も変わるので、同じ CID を指していれば、誰から受け取っても同じ中身であると保証できます。

SWING では、1 つのサイトを IPFS 上の 1 つのディレクトリとして扱って、そのディレクトリの CID でサイトのバージョンを表します。サイトを更新すると新しいディレクトリができ、新しい CID が生まれます。CID がわかれば、そのデータを持っている IPFS のノードならどこからでも取り寄せられます。

SWING の参加者は、それぞれの手元で Kubo という IPFS のノードを動かしています。Kubo には MFS という、Kubo の中で使えるファイルシステムがあり、SWING はミラーするサイトをここに置いて保存します。保存したサイトは手元の Kubo を通して読めますし、ほかの IPFS のノードへの配送にも使われます。

Nostr: 署名つきの短いイベント

Nostr は、公開鍵で署名された短いメッセージ(イベント)を、リレーと呼ばれるサーバーを通してやりとりする仕組みです。リレーは誰でも立てられ、SWING は既存の公開のリレーをそのまま使います。イベントには署名がついているので、どのリレーを通ってきたものでも、本当にその鍵の持ち主が出したものかを受け取った側で確かめられます。鍵と署名については、また別の回でくわしく見ます。

SWING が主に使うイベントは 2 種類です。

1 つめはサイトイベントで、kind(イベントの種類を表す番号)は 35980 です。作者がサイトを更新すると、そのサイトを識別する名前(ふつうはドメイン名)と、新しいバージョンの CID を入れたサイトイベントを出します。同じ作者が同じ名前で出したものは、いちばん新しいものだけが「今のバージョン」として扱われます。ここには、表示用のタイトルや、読者向けの短い更新メモも添えられます。

2 つめはミラー対象リストです。Nostr で名前付きのリストを表す Follow Set(kind 30000)に、d タグで swing という名前を付けて使います。この中に、自分が保存したい相手の公開鍵を並べます。「この人のサイトを保存します」という宣言を、署名つきで公開しておくわけです。

ゆれ子

保存しますって、みんなに見えるところで言うんだ……。ちょっと照れるかも。

更新がリンク集に届くまで

それでは、誰かがサイトを更新してから、その情報がゆれ子の見ているリンク集に並ぶまでの流れを追ってみましょう。

各参加者の手元では、Kubo といっしょに mirror-agent という常駐プログラムが動いています。mirror-agent は、まず自分のミラー対象リストをリレーから読み、そこに載っている公開鍵が出したサイトイベントを見張っておきます。新しいサイトイベントが出ればすぐに届きますし、取りこぼしに備えて、既定では 5 分ごとに過去の分もまとめて取得します。

サイトイベントが届くと、mirror-agent は署名が正しいか、ミラー対象リストに載っている相手か、CID がディレクトリを指す正しい形か、といった点を確かめます。そのうえで、保存量の上限や更新を受け入れる頻度などの、参加者ごとに決めた保存のポリシーに照らして、問題がなければそのデータを Kubo で取り寄せて MFS に置きます。相手が更新したときに取りに行くのは手元に無い部分だけなので、少しの書き換えなら通信量もあまり消費しません。

保存が終わると、そのサイトはダッシュボードで保存済みとして扱われ、デスクトップ画面のリンク集に行が加わります。マーキーで最新の更新が流れ、ゆれ子がバルーンで知らせてくれることもあります。

ゆれ子

「更新されたみたい」って言うとき、画面の外ではそんなに色々あったんだね……。

保存している人は、どのサイトのどのバージョンを今持っているかを、レプリカ報告という別のイベント(kind 35981)でときどき知らせます。作者はこれを収集することで、自分のサイトを何人がミラーしてくれているかを知ることができます。この数え方も、また別の回で触れます。

Webring でリストをたどる

ミラー対象リストは公開されているので、自分が保存している相手のリストをのぞけば、その人がどんなサイトを保存しているかがわかります。さらにその先のリストをたどっていけば、つながりの輪が見えてきます。SWING では、このたどり方を Webring と呼んでいます。

ここで気をつけたいのは、リストに載せるのは載せた側の一方的な表明だという点です。A さんが B さんをリストに入れていても、B さんがそれに同意したわけではありません。そのため SWING では、A さんと B さんの両方がおたがいをリストに入れているときにだけ、相互にミラーし合っている関係として扱います。

ゆれ子

片思いと両思いを、ちゃんと分けてるんだ……。やさしい仕組みかも。

Webring は、SWING を使っているまだ知らない誰かのサイトを見つけるきっかけになります。ダッシュボードでの見え方も、いずれ紹介します。

ゆれ子の SWING 日記が生まれたわけ

このブログ自体も、SWING で IPFS に公開している静的サイトです。ゆれ子は、ここを SWING で公開された最初のサイトだと思っています。

ゆれ子

わたしは最初からここにいるよ。だから、あとから来た人が迷わないように……道しるべになれたらいいなって。

SWING を始めた人が最初にミラーする相手として、そして仕組みを知りたい人が最初に読むページとして、ここが役に立てばいいなと思います。次回は、ゆれ子がデスクトップ画面に現れるまでのこと、つまり SWING を入れてダッシュボードを開き、初期設定をするまでの流れを見ていきます。

ゆれ子

次は、わたしがここに来る前のお話……ちょっと思い出してみるね。