バリデーターと並べて QORel を運用する
バリデーターは、自分のチェーンのチャネルをリレーすることがよくあります。QORel は、バリデーターのホスト上、サイドカーコンテナ、または Kubernetes で動作できます。このページでは 3 つの構成と、リレイヤーをバリデーター自身の鍵から切り離しておくためのルールを説明します。バリデーターとノードのオペレーター向けです。ノード自体の運用については、バリデーターの運用とノードの運用を参照してください。
現時点では、リレーはテストネット専用です。QORel は qorechain-diana に対して実行されており、メインネットの IBC チャネルは開かれていません。
特長
- パッケージに含まれる堅牢化されたサービス。
.debと.rpmはqorel.serviceをインストールします。このサービスは専用のqorelユーザーとして、umask0077、新しい権限の取得なし、プライベートな/tmp、/var/lib/qorel以外は読み取り専用のファイルシステム、コアダンプなし、という設定で動作します。 - 希望すれば、鍵はメモリ内のみ。 Kubernetes の構成では、Pod の起動時にシークレットからメモリ上のボリュームに鍵を再構築するため、鍵ファイルがディスクに触れることはありません。
- 所有者のみの鍵ファイル。 ポスト量子シードを含む鍵ファイルは、モード 0600 です。
- アラートを設定できるチェック。
qorel keys pqc-statusはready_to_relayを報告し、送信前チェックは、拒否されるトランザクションを、手数料が消費される前に止めます。
使い方
基本ルール
- 専用のリレイヤーアカウントを使用してください。 バリデーターのオペレーター鍵やコンセンサス鍵は絶対に使わないでください。リレイヤーが手数料に必要な分だけ入金してください。
- リレイヤー鍵ごとにリレイヤープロセスは 1 つ。 同じ鍵で署名する 2 つのプロセスは、アカウントシーケンスを取り合います。
- 自分のチャネルだけをリレーしてください。
packet_filterを設定します。 - QORel をローカルのノードに向けてください。
http://127.0.0.1:26657、http://127.0.0.1:9090、ws://127.0.0.1:26657/websocketを使用し、これらのポートはインターネットに対して閉じたままにします。これにより、公開されていない gRPC エンドポイントもリレイヤーが利用できるようになります。 - QoreChain では、
qorel keys register-pqcでリレイヤーのポスト量子鍵を 1 回登録し、起動前にqorel keys pqc-statusを確認してください。
1. バリデーターのホストでの systemd
-
.debまたは.rpmパッケージをインストールします(インストール)。バリデーターのユーザーとは別のqorelシステムユーザーと、堅牢化されたqorel.serviceが作成されます。 -
/etc/qorel/config.tomlを、ローカルノードのエンドポイントで編集します。 -
ユーザー
qorelとしてリレイヤー鍵を追加し、ポスト量子鍵を登録します。sudo -u qorel qorel --config /etc/qorel/config.toml keys add --chain qorechain-diana --key-name relayer --mnemonic-file <file>sudo -u qorel qorel --config /etc/qorel/config.toml keys register-pqc --chain qorechain-dianasudo -u qorel qorel --config /etc/qorel/config.toml keys pqc-status --chain qorechain-diana -
systemctl enable --now qorelを実行します。 -
ブロック生成と競合しないよう、QORel の優先度をノードより低くします。
# /etc/systemd/system/qorel.service.d/priority.conf[Service]Nice=10CPUWeight=20MemoryMax=1Gその後、
systemctl daemon-reload && systemctl restart qorelを実行します。
2. Docker Compose サイドカー
services:
qorel:
image: ghcr.io/qorechain/qorel:0.1.0
command: ["--config", "/home/nonroot/.hermes/config.toml", "start"]
network_mode: host # reach the node on 127.0.0.1
restart: unless-stopped
volumes:
- ./qorel:/home/nonroot/.hermes # config.toml + keys/ (owner uid 65532, mode 0700)
deploy:
resources:
limits: { cpus: "1.0", memory: 1g }
鍵は、同じイメージを使って 1 回だけ追加します。例:
docker run --rm -v $PWD/qorel:/home/nonroot/.hermes ghcr.io/qorechain/qorel:0.1.0 \
keys add --chain qorechain-diana --key-name relayer --mnemonic-file /home/nonroot/.hermes/relayer.mnemonic
docker run --rm --network host -v $PWD/qorel:/home/nonroot/.hermes ghcr.io/qorechain/qorel:0.1.0 \
keys register-pqc --chain qorechain-diana
その後、ニーモニックファイルを削除してください。
3. Kubernetes
ニーモニックはシークレットストアに保管し、起動時に鍵を再構築します。
- init コンテナが、
medium: MemoryのemptyDirに対してqorel keys addを実行します(ポスト量子鍵は、事前に手動で 1 回登録してください)。 - メインコンテナが、同じボリュームに対して
qorel startを実行します。
こうすることで、鍵はメモリ内にのみ存在します。
apiVersion: apps/v1
kind: Deployment
metadata: { name: qorel }
spec:
replicas: 1 # never more than one per key
strategy: { type: Recreate }
selector: { matchLabels: { app: qorel } }
template:
metadata: { labels: { app: qorel } }
spec:
securityContext: { runAsNonRoot: true, runAsUser: 65532, fsGroup: 65532 }
volumes:
- name: home
emptyDir: { medium: Memory }
- name: config
configMap: { name: qorel-config }
- name: mnemonic
secret: { secretName: qorel-relayer-mnemonic } # key: mnemonic
initContainers:
- name: keys
image: ghcr.io/qorechain/qorel:0.1.0
args: ["--config", "/config/config.toml", "keys", "add", "--chain", "qorechain-diana",
"--key-name", "relayer", "--mnemonic-file", "/secret/mnemonic", "--overwrite"]
volumeMounts:
- { name: home, mountPath: /home/nonroot/.hermes }
- { name: config, mountPath: /config }
- { name: mnemonic, mountPath: /secret, readOnly: true }
# repeat the init container for each chain in the config
containers:
- name: qorel
image: ghcr.io/qorechain/qorel:0.1.0
args: ["--config", "/config/config.toml", "start"]
ports: [{ containerPort: 3001, name: telemetry }]
resources: { limits: { cpu: "1", memory: 1Gi } }
volumeMounts:
- { name: home, mountPath: /home/nonroot/.hermes }
- { name: config, mountPath: /config }
設定の key_store_folder は /home/nonroot/.hermes/keys を指す必要があります(または未設定のままにします)。
モニタリング
テレメトリを有効にし、保留中のパケット、リレイヤーの残高、ポスト量子鍵の状態、クライアントの鮮度にアラートを設定します。一覧はモニタリングにあります。
アクセス方法
- ネットワーク。 テストネット
qorechain-diana。リレイヤーは、ご自身のノードのローカルポートと、もう一方のチェーンのエンドポイントに接続します。 - アカウント。 各チェーンに、手数料の資金を入れた専用のリレイヤーアカウント。バリデーターのオペレーター鍵は絶対に使わないでください。
- ホスト。 構成 1 は systemd のある Linux、構成 2 はホストネットワークの Docker、構成 3 はメモリ上の
emptyDirを使えるクラスタ。 - 費用。 手数料のみ。上記の例では、リレイヤーを 1 CPU と 1 GiB のメモリに制限しています。
公開場所
パッケージ、コンテナイメージ、ソースはインストールに一覧があります。サンプル設定は qorechain/QORel の packaging/config.example.toml です。
制限と既知の問題
- バリデーターの義務ではありません。 リレーは任意で、バリデーションとは別です。リレイヤーが停止しても、コンセンサスには影響しません。
- 鍵ごとに 1 プロセス。 同じ鍵で 2 つ目の Pod を起動するローリングアップデートは、アカウントシーケンスを壊します。この例では
Recreateを使っています。 - 手動での登録。
keys register-pqcは 1 回限りの手動の手順です。Kubernetes の init コンテナは鍵を再構築するだけです。 - テストネットのみ。 リレーするメインネットのチャネルはまだありません。