コンテンツにスキップ

しくみと用語

Ubichill に出てくる言葉と、それらの関係をまとめます。詳しい仕様は各リンク先にあります。

作者(ID@ドメイン)
├─ ワールド(YAML・URL で配られる)
│ └─ 初期 Entity の木
│ └─ Component(mod の部品。例 pen:pen)
└─ mod(TypeScript・URL で配られる)
└─ Component(Worker で動く)
サーバー
├─ 人(アカウント・フレンド・通知) ← その人のホームサーバーが持つ
├─ 部屋 = インスタンス(ワールドを開いた実体) ← 部屋のサーバーが持つ
└─ ほかのサーバーと連合(人・部屋・作品がサーバーをまたぐ)
  • ワールドは「設計図」、インスタンス(部屋)はそれを開いた「実体」です。
  • ワールドに置かれた Component の中身(コード)は mod が持ちます。ワールドは mod を URL から読み込みます。
  • 人・部屋・作品は、それぞれ別のサーバー・別の場所にあってかまいません。これが「中央を持たない」という意味です。

1 つの YAML(または JSON)で書かれた、部屋の設計図。表示名・定員・背景・初期 Entity の木・使う mod を宣言します。 ワールド=URL で、その定義を返す URL が識別子です。置き場所は Ubichill のサーバーでも、GitHub Pages でも、自分のサーバーでもかまいません。 → World as Code、ワールド定義フォーマット

ワールドを開いて、人が入れる状態にしたもの。同じワールドから何個でも作れます。 状態はインスタンスのメモリにだけあり、だれもいなくなると片付きます。初期状態は毎回ワールドの initialEntities から作られます。 住所は 部屋ID@ドメイン で、ほかのサーバーの部屋にもこの住所で入れます。

ログインしたときに入る、自分用のワールド。ログインのたびに新しい部屋が作られます。設定で好きなワールドをホームにできます。 → はじめかた

ワールドの中の「箱」。id・位置や大きさ(transform)・components[] を持ち、children[] で入れ子にできます。 ゲームエンジンの GameObject に当たります。ペンの置き場、スクリーン、付箋の 1 枚、などがそれぞれ Entity です。

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 パッケージ

mod のコードが動く場所。利用者のブラウザの Web Worker の中で、fetch や eval などを封じた状態で動きます。 Worker から本体に届くのは、SDK(Ubi.*)を通った命令だけです。 → アーキテクチャ

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 チャートで自分でも建てられます。 → 自分のサーバーを建てる

その人のアカウントがあるサーバー。フレンド・通知・公開環境の一覧など「人のこと」は、ホームサーバーが決めます。

サーバー同士がつながり、どのサーバーの人ともフレンドになり、招待し合い、相手のサーバーの部屋に入れるしくみ。 ActivityPub の形を使いますが、相手は Ubichill のサーバーだけです。中央のサーバーはありません。 → 連合のしくみ

連合では、権威が 3 つに分かれています。

もの だれが決めるか 住所の例
人 その人のホームサーバー @[email protected]
部屋 部屋のあるサーバー [email protected]
作品(ワールド・mod) 作者が置いた URL と作者の署名 https://yokan.github.io/worlds/chill-room.yaml

部屋の在室や公開範囲は部屋のサーバーしか知りません。作品の置き場所はサーバーと無関係に選べます。