しくみと用語
Ubichill に出てくる言葉と、それらの関係をまとめます。詳しい仕様は各リンク先にあります。
作者(ID@ドメイン) ├─ ワールド(YAML・URL で配られる) │ └─ 初期 Entity の木 │ └─ Component(mod の部品。例 pen:pen) └─ mod(TypeScript・URL で配られる) └─ Component(Worker で動く)
サーバー ├─ 人(アカウント・フレンド・通知) ← その人のホームサーバーが持つ ├─ 部屋 = インスタンス(ワールドを開いた実体) ← 部屋のサーバーが持つ └─ ほかのサーバーと連合(人・部屋・作品がサーバーをまたぐ)- ワールドは「設計図」、インスタンス(部屋)はそれを開いた「実体」です。
- ワールドに置かれた Component の中身(コード)は mod が持ちます。ワールドは mod を URL から読み込みます。
- 人・部屋・作品は、それぞれ別のサーバー・別の場所にあってかまいません。これが「中央を持たない」という意味です。
ワールド(World)
Section titled “ワールド(World)”1 つの YAML(または JSON)で書かれた、部屋の設計図。表示名・定員・背景・初期 Entity の木・使う mod を宣言します。 ワールド=URL で、その定義を返す URL が識別子です。置き場所は Ubichill のサーバーでも、GitHub Pages でも、自分のサーバーでもかまいません。 → World as Code、ワールド定義フォーマット
インスタンス(部屋)
Section titled “インスタンス(部屋)”ワールドを開いて、人が入れる状態にしたもの。同じワールドから何個でも作れます。
状態はインスタンスのメモリにだけあり、だれもいなくなると片付きます。初期状態は毎回ワールドの initialEntities から作られます。
住所は 部屋ID@ドメイン で、ほかのサーバーの部屋にもこの住所で入れます。
ホームワールド
Section titled “ホームワールド”ログインしたときに入る、自分用のワールド。ログインのたびに新しい部屋が作られます。設定で好きなワールドをホームにできます。 → はじめかた
Entity
Section titled “Entity”ワールドの中の「箱」。id・位置や大きさ(transform)・components[] を持ち、children[] で入れ子にできます。
ゲームエンジンの GameObject に当たります。ペンの置き場、スクリーン、付箋の 1 枚、などがそれぞれ Entity です。
Component
Section titled “Component”Entity に付ける振る舞いの部品。<modId>:<componentName>(例 pen:pen・video-player:screen)という型で指定し、data に初期値を書きます。
1 つの Component は 1 つの Worker(後述)で動きます。
core:collider・core:media・core:ui の 3 つは本体に組み込みで、mod を読み込まずに使えます。
Component の中身を提供する配布物。TypeScript で書き、@ubichill/cli でビルドし、URL(GitHub Pages など)で配ります。
ペンも動画プレイヤーも付箋も、ぜんぶ mod です。本体は「mod を安全に動かす土台」だけを持ちます。
→ はじめての mod、mod パッケージ
Worker(サンドボックス)
Section titled “Worker(サンドボックス)”mod のコードが動く場所。利用者のブラウザの Web Worker の中で、fetch や eval などを封じた状態で動きます。
Worker から本体に届くのは、SDK(Ubi.*)を通った命令だけです。
→ アーキテクチャ
権限(capability)
Section titled “権限(capability)”mod が本体に頼めることの種類。safe(確認なし)・sensitive(既定で許可)・dangerous(承認が要る)の 3 段階があります。
開発者は宣言せず、使った API からビルド時に自動で決まります。許可するかどうかは利用者が決め、「作者+mod の ID」の組ごとに記憶されます。
→ 権限リファレンス
ワールドが使う mod の中身(バイト列のハッシュ)と権限の上限を固定するファイル(<world>.lock.json)。
配布元が乗っ取られて中身が差し替わっても、ハッシュが合わなければ実行しません。lock に無い mod は実行されません。
ワールドや mod に付く、作者(ID@ドメイン)の Ed25519 署名。「その作者が作り、改ざんされていない」ことを示します。
置き場所(URL)は署名に含まれないので、どこに置いても同じ署名で確かめられます。
サーバーは秘密鍵を預かりません。署名はブラウザ・CLI・CI の手元で行います。
署名が確認できたワールドだけが一覧に出ます。安全性の保証ではなく、「だれが出したか」の保証です。
→ 署名して公開する
署名して公開できる環境のこと。ブラウザ・CLI・CI の 3 種類があり、それぞれ鍵を 1 本持ちます。 1 つのアカウントに複数の公開環境を登録でき、取り消すとその鍵の署名はすべて無効になります。 → 署名して公開する
部屋に「だれが入れるか・だれに見えるか」。パブリック・フレンド+・フレンドのみ・招待のみの 4 種類です。部屋のパスワードはありません。 → 公開範囲・フレンド・招待
Ubichill を動かしている 1 つのホスト(例 ubichill.com)。人のアカウント、部屋、ワールドの保管場所を持ちます。
Helm チャートで自分でも建てられます。
→ 自分のサーバーを建てる
ホームサーバー
Section titled “ホームサーバー”その人のアカウントがあるサーバー。フレンド・通知・公開環境の一覧など「人のこと」は、ホームサーバーが決めます。
連合(federation)
Section titled “連合(federation)”サーバー同士がつながり、どのサーバーの人ともフレンドになり、招待し合い、相手のサーバーの部屋に入れるしくみ。 ActivityPub の形を使いますが、相手は Ubichill のサーバーだけです。中央のサーバーはありません。 → 連合のしくみ
人・部屋・作品の三層
Section titled “人・部屋・作品の三層”連合では、権威が 3 つに分かれています。
| もの | だれが決めるか | 住所の例 |
|---|---|---|
| 人 | その人のホームサーバー | @[email protected] |
| 部屋 | 部屋のあるサーバー | [email protected] |
| 作品(ワールド・mod) | 作者が置いた URL と作者の署名 | https://yokan.github.io/worlds/chill-room.yaml |
部屋の在室や公開範囲は部屋のサーバーしか知りません。作品の置き場所はサーバーと無関係に選べます。
- アーキテクチャ — 本体の内部構成(Go のインスタンスサーバー・SNS バックエンド・ブラウザ)
- プロトコルと互換の規則 — 約束ごとの種類と互換の扱い