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.exexattr -d com.apple.quarantine storer。 Windows 版もコード署名されていないため、SmartScreen で確認を求められる場合があります。初回起動
初めて実行すると、ノードは名前と任意の説明を尋ね、自身の暗号 ID を生成してノード ID を表示し、 実行したフォルダに config.json を書き出します。データ(store.pxl、files/、storer.log)も同じフォルダに置かれます。
No config file found, creating default config.json
Enter node name: tokyo-node-1
Enter node description: 東京で運用する Pixelmine ノード
Node ID: 3f9c…この初回起動は対話的に行う必要があります。以降は入力なしで起動し、起動するたびにネットワークへの登録、同期とピアへの通知の開始、 ポート 8001 でのインターフェースの公開、そしてアップデーターの起動を行います。
設定
設定は初回起動時に作成される 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.targetsudo 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 を指定します。
ポイントの獲得
稼働中のノードは、その働きに対してポイントを獲得します。報告はノードが登録した鍵に照らして確認され、 ポイントの集計はノード上ではなくネットワーク側で保持されます。カテゴリーは 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%)を超えるとポイントを交換できます。