ドキュメント

Storer ノードを運用する。

Storer は、あらゆるマシンを Pixelmine ノードに変える軽量なコマンドラインアプリケーションです。本ガイドでは、インストール方法、初回起動、設定、そして起動後にノードが行うすべての処理について説明します。

概要

ノードは、ネットワーク上で複製されるデータ(公開投稿とフォロワー限定投稿、プロフィール、それらに関する活動)を保存し、 Pixelmine アプリに提供し、他のノードと絶えず照合します。独自のコミュニティをホストすることもでき、そのコミュニティの投稿やチャットはそのノード上に置かれます。 ノードは単体で完結したプログラムとして動作し、データベースの準備や面倒な連携は必要ありません。

ノードを運用するとネットワークが強くなり、その働きに応じてポイントを獲得できます(ネットワークインセンティブを参照)。独立したノードが増えるほど、ネットワークはより強靭になります。

要件

  • 64 ビットの Windows(x64)、macOS(Apple シリコンまたは Intel)、 または Linux(x64 または ARM64)マシン。Linux 版には glibc ベースのディストリビューションが必要です。
  • 保存するデータのためのディスク容量(ネットワークとともに増えるため、まずは数 GB の空きを用意してください)。
  • 稼働時間もポイントの対象になるため、常時接続のインターネット回線を推奨します。
  • 他のノードやアプリがあなたのノードに接続できるよう、受信用のポートを 1 つ(既定は 8001)開けてください。 開けなくてもデータの取得はできますが、ピアやアプリへの提供はできません。

インストールと実行

ダウンロードページからお使いのプラットフォーム向けのビルドをダウンロードします。 これは圧縮ファイルではなく単体のプログラムです。専用のフォルダに置き、名前を storer(Windows では storer.exe)に変更してください。内蔵のアップデーターはこの名前を探します。 そのうえで、そのフォルダの中からターミナルで実行します。

# macOS / Linux — ブラウザでダウンロードしたファイルには実行権限が付いていません。
mkdir -p ~/storer && mv ~/Downloads/storer-darwin-arm64 ~/storer/storer
cd ~/storer
chmod +x storer
./storer

# Windows(PowerShell)— ダウンロードしたファイルを storer.exe に変更した後
cd C:\storer
.\storer.exe
macOS 版はまだ公証(notarize)されていないため、初回起動時に Gatekeeper が「開発元を検証できないため開けません」とブロックします。 一度だけ隔離フラグを解除すれば、通常どおり起動します:xattr -d com.apple.quarantine storer。 Windows 版もコード署名されていないため、SmartScreen で確認を求められる場合があります。

初回起動

初めて実行すると、ノードは名前と任意の説明を尋ね、自身の暗号 ID を生成してノード ID を表示し、 実行したフォルダに config.json を書き出します。データ(store.pxlfiles/storer.log)も同じフォルダに置かれます。

No config file found, creating default config.json
Enter node name: tokyo-node-1
Enter node description: 東京で運用する Pixelmine ノード
Node ID: 3f9c…

この初回起動は対話的に行う必要があります。以降は入力なしで起動し、起動するたびにネットワークへの登録、同期とピアへの通知の開始、 ポート 8001 でのインターフェースの公開、そしてアップデーターの起動を行います。

ID を大切に保管してください。 ノードの秘密鍵は config.json にあり、 アプリのセッションに署名する jwt_secret とともに、ネットワーク上でのノードのアイデンティティそのものです。 ファイルをバックアップし、決して共有しないでください。失うと、ノードはまったく新しいノードとして扱われます。

設定

設定は初回起動時に作成される config.json にあります。主な項目は次のとおりです。

{
  "id": "…ノード ID…",
  "name": "tokyo-node-1",
  "description": "東京で運用する Pixelmine ノード",
  "app_port": "8001",
  "public_key": "…",
  "private_key": "…秘密に保管…",
  "jwt_secret": "…秘密に保管…",
  "peer_auth_mode": "enforce",
  "storage": { "max_storage_mb": 1024 },
  "points": {
    "user_share_percent": 60,
    "min_withdrawal_pxl": 1,
    "min_withdrawal": 500,
    "rules": { … }
  }
}
  • name / description — ネットワーク上でのノードの表示内容。
  • app_port — ノードが提供に使うポート。"8001" のように文字列で指定する必要があり、数値にするとノードが起動しません。
  • public_key / private_key / jwt_secret — ノードの ID とセッション用の秘密情報。秘密に保管してください。
  • storage.max_storage_mb — ステータス表示に「使用量 / 上限」として表示されます。ノードはまだこれを上限として適用していません。
  • points.user_share_percent — ノードのコミュニティ分配率として表示されます。実際に支払われる割合は、Pixelmine がノードごとに設定します(既定 60%)。
  • points.min_withdrawal_pxl — メンバーがポイントを交換できるようになる最低ラインで、コミュニティの合計ポイントに対する割合です(1 = 1%)。min_withdrawal は、その合計を取得できない場合の予備値にすぎません。
  • points.rules — コミュニティ内の各種活動でメンバーが獲得するポイント数。

config.json を編集したらノードを再起動してください。ほとんどの設定は起動時に一度だけ読み込まれます (points.rules は使用時に読み直されます)。名前や説明の変更はノードの情報が更新されるだけですが、鍵を置き換えると新しいノードになります。

機能

起動すると、ノードは次の 6 つの処理を自動で行います。

アプリへの提供

Pixelmine アプリが接続するインターフェースを公開し、フィードやプロフィールの読み込み、メディアのアップロードや取得に応えます。 プライベートなメッセージとフォロワー限定投稿はノードに届く前にデバイス上で暗号化されるため、ノードはその内容を封じられた状態で保存します。

ピアの発見

ノードはネットワークの調整サービスに自動で登録し、知っているピアに 5 分ごと(IP が変わったときにも)自分の存在を知らせます。 ピアは自分が知っているノードを返すため、ネットワークの情報は自然に広がります。新しいノードは、内蔵されたシードピアの一覧から始めます。

ネットワークの同期

1 分ごとに、既知のピアとデータの指紋を比較し、多数派の状態を採用して、差分だけを取得します。新しい記録は書き込まれた時点でピア間にプッシュもされます。 ほとんどが一致している場合でも、比較の負荷は小さく抑えられます。

受け取った記録の検証

ピアから届いた記録は、保存する前に作成者の署名と照合され、検証に失敗した記録は拒否されます。まだ知らない作成者の記録は、 その作成者自身の記録が届いた後に、改めて取得されます。

メディアの保存と提供

ファイルはディスクに保存され、要求に応じて提供されます。チャットとフォロワー限定投稿のメディアはアプリによって暗号化された状態で届き、 ノードはサインイン済みのセッションに対してのみそれを提供します。ピアからダウンロードしたファイルは、メタデータ内の署名付きハッシュと照合されます。

ポイントの獲得

稼働中、ノードは 4 つのカテゴリーで自身の貢献を報告します:ピアとの同期、他ノードが検証するファイルの保持、接続の維持、そして同期の成功です。 詳しくは下のポイントの獲得をご覧ください。

運用を続ける

ノードはフォアグラウンドで動作します。ターミナルではライブのステータス表示が出て、ログは常にフォルダ内の storer.log に書き込まれます。 再起動や切断をまたいで稼働させ続けるには(それが稼働時間のポイントにつながります)、サービスマネージャーの下で実行してください。

初回起動は対話的に(上記参照)、サービスが使うフォルダで行ってください。サービスにはキーボード入力がないため、 サービスとして初めて起動したノードは名前の入力を永遠に待ち続けます。

Linux では、/opt/storer/config.json ができた後、最小限のサービスは次のようになります。

# /etc/systemd/system/storer.service
[Unit]
Description=Pixelmine Storer
Wants=network-online.target
After=network-online.target

[Service]
WorkingDirectory=/opt/storer
ExecStart=/opt/storer/storer
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now storer
sudo systemctl status storer
tail -f /opt/storer/storer.log

最新の状態を保つ

ノードは自身のアップデーターを起動し、それが動いているかを 1 分ごとに確認します。別途実行するものはありません。 アップデーターは 5 分ごとに新しいリリースを確認し、サイズ・ハッシュ・署名をプログラムに組み込まれた鍵で検証してから、ノードを停止し、 新しいバイナリに入れ替えて再起動します。無効にするには、config.json "disable_updater": true を設定するか、STORER_DISABLE_UPDATER=1 を指定します。

リリースは署名の検証に通った場合にのみインストールされます。アップデーターはプログラムのあるフォルダからノードを再起動するため、config.json はプログラムと同じフォルダに置いてください。

ポイントの獲得

稼働中のノードは、その働きに対してポイントを獲得します。報告はノードが登録した鍵に照らして確認され、 ポイントの集計はノード上ではなくネットワーク側で保持されます。カテゴリーは 4 つです。

カテゴリー獲得条件確認方法
同期ノードがピアと同期したとき(同期ごとに 1 ポイント)。相手のピアが取引の受領証に署名します。ノードは自分自身を保証できず、同じピアとは 10 分ごとに最大 1 回までカウントされます。
ストレージ別のノードがあなたの保持するファイルを監査したとき(検証されたファイルごとに 1 ポイント)。監査するノードがファイルをダウンロードしてハッシュを確認し、同じファイルは 1 回だけカウントされます。自分のアップロード報告だけではスコアになりません。
稼働10 分ごとにチェックインしたとき(チェックインごとに 1 ポイント)。報告は新しいものである必要があり、ネットワークはノードが応答することを確認し、チェックインは 10 分ごとに 1 回だけカウントされます。
品質同期が成功したとき(成功した同期ごとに 1 ポイント)。同期にかかった時間とともに記録され、ピアが署名します。時間は表示されますが、スコアには影響しません。

ポイントの集計はノード自体から切り離して保管されるため、自分のマシンを完全に制御できる運用者でも、自分のスコアを書き換えることはできません。

ポイントの分配

ポイントは、共有プールをどう分けるかを決めます。仕組みは 2 回の割り算です。

1 · ネットワーク全体で

Pixelmine がプールを用意し、それが各ノードの獲得ポイントに比例してノード間で分けられます。あなたのノードの取り分は、ネットワーク全体のポイントに占める割合です。

ノードの取り分  =  ノードのポイント  ÷  ネットワーク全体のポイント  ×  プール

2 · コミュニティ内で

各ノードの取り分の一部は、そのコミュニティの人々に渡ります。その割合は config.json ではなく、 Pixelmine がノードごとに設定します(既定 60%)。メンバー用プールは、各メンバーがそのコミュニティで獲得したポイントに応じて分けられます。

メンバー用プール  =  ノードの取り分  ×  コミュニティの分配率

計算例

きりのよい数字で示します。

共有プール                        ¥5,000,000
全ノードのポイント                    10,000
あなたのノードのポイント               2,000    →  ネットワークの 20%

あなたのノードの取り分            ¥1,000,000    (プールの 20%)
コミュニティ分(60%)               ¥600,000    →  メンバーで分配
運用者の取り分(40%)               ¥400,000    →  あなたの分

ポイントを多く獲得すれば同じプールでの取り分は大きくなり、獲得数が同じままネットワークが成長すれば小さくなります。取り分は常に他の全員との相対で決まります。 メンバーは、残高があなたのノードのしきい値(min_withdrawal_pxl、既定ではコミュニティのポイントの 1%)を超えるとポイントを交換できます。

メンバーが投稿や交流でポイントを獲得する仕組みも含めた全体像は、ネットワークインセンティブのページをご覧ください。