Exécuter QORel à côté d'un validateur
Les validateurs relaient souvent les canaux de leur propre chaîne. QORel peut tourner sur l'hôte du validateur, dans un conteneur sidecar ou dans Kubernetes. Cette page présente les trois dispositions et les règles qui maintiennent le relayeur isolé des propres clés du validateur. Elle s'adresse aux opérateurs de validateurs et de nœuds. Pour exécuter le nœud lui-même, voir Exécuter un validateur et Exécuter un nœud.
Le relais est aujourd'hui réservé au testnet : QORel a été exécuté sur qorechain-diana, et aucun canal IBC du mainnet n'est ouvert.
Innovations
- Un service durci dans le paquet. Les
.debet.rpminstallent unqorel.servicequi s'exécute sous son propre utilisateurqorel, avec un umask0077, aucun nouveau privilège, un/tmpprivé, un système de fichiers en lecture seule en dehors de/var/lib/qorel, et aucun core dump. - Des clés uniquement en mémoire, si vous le souhaitez. La disposition Kubernetes reconstruit les clés au démarrage du pod à partir d'un secret dans un volume en mémoire, de sorte que les fichiers de clés ne touchent jamais le disque.
- Fichiers de clés réservés au propriétaire. Les fichiers de clés, y compris la graine post-quantique, ont le mode 0600.
- Des contrôles sur lesquels alerter.
qorel keys pqc-statusindiqueready_to_relay, et la vérification avant envoi arrête une transaction qui serait refusée avant qu'un frais soit dépensé.
Utilisation
Règles de base
- Utilisez un compte de relayeur dédié. Jamais la clé d'opérateur du validateur ni la clé de consensus. Approvisionnez-le avec ce dont le relayeur a besoin pour les frais.
- Un seul processus relayeur par clé de relayeur. Deux processus qui signent avec la même clé se disputent les numéros de séquence du compte.
- Ne relayez que vos canaux. Définissez un
packet_filter. - Pointez QORel vers le nœud local. Utilisez
http://127.0.0.1:26657,http://127.0.0.1:9090etws://127.0.0.1:26657/websocket, et gardez ces ports fermés à Internet. Cela donne aussi au relayeur le point d'accès gRPC qui n'est pas disponible publiquement. - Sur QoreChain, enregistrez une seule fois la clé post-quantique du relayeur avec
qorel keys register-pqc, et vérifiezqorel keys pqc-statusavant de démarrer.
1. systemd sur l'hôte du validateur
-
Installez le paquet
.debou.rpm(Installation). Il crée un utilisateur systèmeqorel, distinct de celui du validateur, et unqorel.servicedurci. -
Modifiez
/etc/qorel/config.tomlavec les points d'accès du nœud local. -
Ajoutez la clé du relayeur en tant qu'utilisateur
qorel, et enregistrez la clé post-quantique :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 -
Exécutez
systemctl enable --now qorel. -
Donnez à QORel une priorité inférieure à celle du nœud, afin qu'il n'entre jamais en concurrence avec la production de blocs :
# /etc/systemd/system/qorel.service.d/priority.conf[Service]Nice=10CPUWeight=20MemoryMax=1GPuis
systemctl daemon-reload && systemctl restart qorel.
2. Sidecar 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 }
Ajoutez les clés une fois avec la même image, par exemple :
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
Supprimez ensuite le fichier de phrase mnémonique.
3. Kubernetes
Conservez la phrase mnémonique dans votre magasin de secrets et reconstruisez les clés au démarrage :
- Un init container exécute
qorel keys adddans unemptyDiravecmedium: Memory(enregistrez la clé post-quantique une seule fois, à la main, au préalable). - Le conteneur principal exécute
qorel startsur le même volume.
Ainsi, les clés n'existent qu'en mémoire.
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 }
Le key_store_folder de la configuration doit pointer vers /home/nonroot/.hermes/keys (ou rester non défini).
Surveillance
Activez la télémétrie et configurez des alertes sur les paquets en attente, les soldes du relayeur, l'état de la clé post-quantique et la fraîcheur des clients. La liste figure sur Surveillance.
Accès
- Réseau. Testnet
qorechain-diana. Le relayeur se connecte aux ports locaux de votre propre nœud et aux points d'accès de l'autre chaîne. - Comptes. Un compte de relayeur dédié sur chaque chaîne, approvisionné pour les frais ; jamais la clé d'opérateur du validateur.
- Hôte. Linux avec systemd pour la disposition 1 ; Docker avec réseau hôte pour la disposition 2 ; un cluster avec un
emptyDiren mémoire pour la disposition 3. - Coût. Uniquement les frais. Les exemples ci-dessus plafonnent le relayeur à 1 CPU et 1 Gio de mémoire.
Où c'est publié
Les paquets, l'image de conteneur et les sources sont listés sur Installation. La configuration d'exemple est packaging/config.example.toml dans qorechain/QORel.
Limites et problèmes connus
- Pas une tâche de validateur. Le relais est facultatif et distinct de la validation ; un relayeur arrêté n'affecte pas le consensus.
- Un processus par clé. Les mises à jour progressives qui démarrent un second pod sur la même clé cassent la séquence du compte ; l'exemple utilise
Recreate. - Enregistrement manuel.
keys register-pqcest une étape manuelle ponctuelle ; l'init container Kubernetes ne fait que reconstruire les clés. - Testnet uniquement. Il n'existe pas encore de canal du mainnet à relayer.