Zum Hauptinhalt springen

Einen Node betreiben

Dieser Leitfaden behandelt den Betrieb eines reinen Node-Deployments von QoreChain — ein Full- oder RPC-Node, der die Chain synchronisiert und Endpunkte für Integrationen bereitstellt, ohne Validator-Aufgaben. Er richtet sich an Börsen (CEX), Wallet-Backends, Indexer und Integratoren, die zuverlässigen Lese-/Schreibzugriff auf das Netzwerk benötigen, aber keine Blöcke signieren.

hinweis

Für Blockproduktion, Staking, Slashing und Pool-Klassifizierung siehe stattdessen Einen Validator betreiben. Ein reines Node-Deployment hält niemals einen Validator-Konsensschlüssel und erscheint niemals im aktiven Set.

warnung

Binaries, Genesis und Snapshots werden unter download.qore.host mit SHA-256-Prüfsummen veröffentlicht. Verifizieren Sie Prüfsummen immer vor dem Installieren oder Entpacken, und verifizieren Sie Einzahlungen ausschließlich gegen Ihren eigenen, synchronisierten Node.

Source of truth: das Live-Manifest

Das aktuelle Binary, Genesis, Peers, Seeds und ein State-Sync-Trust-Point werden als JSON-Manifest veröffentlicht, das live aktualisiert wird — hinterlegen Sie in Ihren Installationsskripten keine fest codierte Binary-Version, Prüfsumme oder Snapshot-Dateinamen, da diese veralten, sobald ein neues Release erscheint:

  • Mainnet: https://download.qore.host/mainnet/latest.json
  • Testnet: https://download.qore.host/testnet/latest.json

Die Felder des Manifests umfassen binary (URL + sha256), genesis (URL + sha256 + sizeBytes), peers, seeds, p2pPort, stateSync (ein stündlich aktualisierter Trust-Point) und minCompatible. Die Installations- und Beitrittsschritte unten rufen dieses Manifest ab und verwenden dessen aktuelle Werte.

v3.2.0 oder höher für einen frisch beitretenden Node erforderlich

Ein Node, der ab Genesis synchronisiert oder aus einem Snapshot repliziert, durchläuft mehrere Governance-Upgrades (zum Beispiel die Emissionsobergrenze v3.1.94 bei Höhe 2.122.074 und das Upgrade v3.2.0 bei Höhe 2.981.742). Installieren Sie daher immer das Binary, auf das das Manifest verweist: Es enthält jeden Upgrade-Handler. Ein frischer Mainnet-Node benötigt v3.2.0 oder höher: minCompatible im Manifest ist 3.2.0, das älteste Release, das der Chain noch folgt, und version (derzeit 3.2.1) ist die empfohlene, ein node-lokales Release ohne Upgrade-Höhe. Das Manifest wird bewusst gestaffelt befördert (zuerst Testnet, danach Mainnet nach einer Einlaufphase). Prüfen Sie daher sein Feld "version" gegen minCompatible, bevor Sie binary.url vertrauen. Im Testnet entspricht minCompatible der version (derzeit 3.2.2).

Ab v3.2.1 sind zwei Einstellungen wichtig: Halten Sie die Systemuhr per NTP synchronisiert (der Node stoppt, wenn seine Uhr um mehr als 60 Sekunden abweicht), und setzen Sie evm-chain-id in app.toml (siehe Node-Limits).


Node vs. Validator​

AspektReiner Node (dieser Leitfaden)Validator
KonsensschlüsselKeinered25519-Konsensschlüssel (muss gesichert werden)
BlockproduktionNeinJa — schlägt Blöcke vor und signiert sie
Staking / SlashingNicht anwendbarSelbstdelegation, Slashing-Risiko
HauptzweckRPC/REST/gRPC/EVM (und schreibgeschütztes SVM) für Integrationen bereitstellenNetzwerk sichern (Staking-Rewards fallen an)
Öffentliche ErreichbarkeitRPC/EVM-Endpunkte typischerweise exponiertValidator hinter Sentry-Nodes verborgen

Zielnetzwerke​

NetzwerkChain-IDEVM-Chain-IDHinweise
Mainnetqorechain-vladi9801 (hex 0x2649)Primär — live seit 29. Juni 2026
Testnetqorechain-diana9800Integrationen zuerst hier erproben

Setzen Sie in diesem Leitfaden durchgehend die passende --chain-id für Ihr Zielnetzwerk ein. Die Beispiele verwenden standardmäßig das Mainnet.


Empfohlene Hardware​

ProfilCPURAMFestplatte (NVMe-SSD)Netzwerk
Geprunter RPC-Node4 Kerne16 GB500 GB+100 Mbps+
Full-/Archive-Node8 Kerne32 GB2 TB+ (wächst mit der Zeit)1 Gbps
Börsen-Integration8 Kerne32 GB2 TB+ mit Reserve1 Gbps

Eine NVMe-SSD wird dringend empfohlen — der Chain-State und die EVM-/SVM-Stores sind I/O-intensiv. Archive-Nodes (kein Pruning, vollständige Tx-Indexierung) wachsen kontinuierlich; stellen Sie Speicherplatz mit Reserve und Monitoring bereit.


Deployment​

Docker Compose​

Ein reines Node-Deployment mit Docker Compose. Es gibt derzeit noch kein öffentlich veröffentlichtes qorechaind-Image zum Herunterladen. Das Dockerfile im öffentlichen Repository baut das Community-Binary (keine Post-Quanten-Bibliothek, Stub-Keeper): Das eignet sich für die lokale Entwicklung, kann aber weder dem Mainnet noch dem Testnet folgen. Bauen Sie für einen Netzwerk-Node ein eigenes Image aus dem in latest.json genannten Release-Archiv, taggen Sie es auf die Release-Version (v3.2.1 im Mainnet, v3.2.2 im Testnet) und mounten Sie dann ein persistentes Volume für die Chain-Daten:

# Fetch and verify the release archive (see "Joining the Network" below for the manifest steps)
curl -s https://download.qore.host/mainnet/latest.json -o latest.json
curl -fsSL "$(jq -r .binary.url latest.json)" -o qore.tgz
echo "$(jq -r .binary.sha256 latest.json) qore.tgz" | sha256sum -c -
mkdir release && tar xzf qore.tgz -C release

cat > release/Dockerfile <<'EOF'
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates curl jq && rm -rf /var/lib/apt/lists/*
COPY qorechaind /usr/local/bin/qorechaind
COPY lib/ /opt/qorechain/lib/
ENV LD_LIBRARY_PATH=/opt/qorechain/lib
ENTRYPOINT ["qorechaind"]
EOF
docker build -t qorechain-node:v3.2.1 release/

Das Archiv enthält qorechaind und ein Verzeichnis lib/ mit den zugehörigen Shared Libraries (libqorepqc.so, libqoresvm.so, libwasmvm.x86_64.so); das obige Image ist, wie das Release-Archiv, nur für linux/amd64.

# docker-compose.yml
services:
qorechain-node:
image: qorechain-node:v3.2.1
container_name: qorechain-node
restart: unless-stopped
command: ["start", "--home", "/root/.qorechaind"]
volumes:
- qorechain-data:/root/.qorechaind
ports:
- "26657:26657" # RPC
- "26656:26656" # P2P
- "1317:1317" # REST
- "9090:9090" # gRPC
- "8545:8545" # EVM JSON-RPC
- "8546:8546" # EVM WebSocket
- "8899:8899" # SVM RPC (read-only: SVM transactions are disabled)
- "26660:26660" # Prometheus

volumes:
qorechain-data:

Initialisieren Sie das Datenverzeichnis einmalig (zum Beispiel docker compose run --rm qorechain-node init my-node --chain-id qorechain-vladi --home /root/.qorechaind; Genesis- und Peer-Konfiguration werden weiter unten behandelt) und starten Sie dann:

docker compose up -d
docker compose logs -f qorechain-node

systemd​

Für eine Bare-Metal-Installation betreiben Sie qorechaind unter systemd:

# /etc/systemd/system/qorechaind.service
[Unit]
Description=QoreChain node
After=network-online.target
Wants=network-online.target

[Service]
User=qorechain
ExecStart=/usr/local/bin/qorechaind start --home /var/lib/qorechaind
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now qorechaind
sudo journalctl -u qorechaind -f

Dem Netzwerk beitreten​

1. Initialisieren​

qorechaind init my-node --chain-id qorechain-vladi

2. Manifest abrufen​

curl -s https://download.qore.host/mainnet/latest.json -o latest.json
# testnet: https://download.qore.host/testnet/latest.json

Verwenden Sie diese Datei als Quelle für die Binary-, Genesis- und Peer-Werte in den folgenden Schritten — prüfen Sie jq -r .minCompatible latest.json und betreiben Sie mindestens dieses Release (das empfohlene ist jq -r .version latest.json).

3. Genesis herunterladen und verifizieren​

GENESIS_URL=$(jq -r .genesis.url latest.json)
GENESIS_SHA256=$(jq -r .genesis.sha256 latest.json)

curl -fsSL "$GENESIS_URL" -o ~/.qorechaind/config/genesis.json
echo "${GENESIS_SHA256} $HOME/.qorechaind/config/genesis.json" | sha256sum -c -

# Cross-verify against the genesis served live by the chain:
curl -s https://rpc.qore.host/genesis | jq '.result.genesis' > /tmp/genesis-live.json

4. Peers und die Gebührenuntergrenze konfigurieren​

Lesen Sie die aktuellen Peers und Seeds aus dem Manifest, statt Node-IDs und Hosts fest zu codieren — diese rotieren:

PEERS=$(jq -r '.peers | join(",")' latest.json)
SEEDS=$(jq -r '.seeds | join(",")' latest.json)

Öffnen Sie ~/.qorechaind/config/config.toml und setzen Sie persistent_peers (und seeds) auf diese Werte:

persistent_peers = "<value of $PEERS>"
seeds = "<value of $SEEDS>"

Setzen Sie anschließend den minimalen Gaspreis in ~/.qorechaind/config/app.toml (Netzwerk-Gebührenuntergrenze: 0.1uqor):

minimum-gas-prices = "0.1uqor"

qorechaind init <moniker> --chain-id qorechain-vladi schreibt außerdem die EVM-Chain-ID des Netzwerks in app.toml (siehe Node-Limits); prüfen Sie sie bei einem Home-Verzeichnis, das vor langer Zeit initialisiert wurde.

5. Synchronisierung starten​

qorechaind start --minimum-gas-prices=0.1uqor

Schneller Bootstrap​

Die Synchronisierung ab Genesis kann sehr lange dauern. Verwenden Sie für Integrationen State Sync oder einen Snapshot für einen schnellen Kaltstart.

State Sync​

State Sync lädt einen aktuellen Snapshot des Anwendungszustands von vertrauenswürdigen RPC-Servern, anstatt jeden Block erneut abzuspielen. Konfigurieren Sie den Abschnitt [statesync] in config.toml:

[statesync]
enable = true
rpc_servers = "https://rpc.qore.host:443,https://rpc.qore.host:443"
trust_height = <TRUSTED_BLOCK_HEIGHT>
trust_hash = "<TRUSTED_BLOCK_HASH>"
trust_period = "168h0m0s"

Entnehmen Sie trust_height / trust_hash dem Feld stateSync des Manifests — es wird stündlich aktualisiert und ist damit die bevorzugte Quelle:

TRUST_HEIGHT=$(jq -r .stateSync.trustHeight latest.json)
TRUST_HASH=$(jq -r .stateSync.trustHash latest.json)

Als Fallback/Alternative können Sie eine vertrauenswürdige Höhe und deren Hash selbst über den öffentlichen RPC ableiten:

curl -s https://rpc.qore.host/block | jq -r '.result.block.header.height, .result.block_id.hash'

Snapshot-Wiederherstellung​

Alternativ laden Sie den veröffentlichten Chain-Daten-Snapshot herunter, verifizieren dessen Prüfsumme und entpacken ihn über Ihr Datenverzeichnis. Im Mainnet nennt das Objekt snapshot des Manifests die URL, die Blockhöhe (height), die Größe und die SHA-256-Prüfsumme (das Testnet-Manifest enthält derzeit nur die URL, verwenden Sie dort also State Sync). Lesen Sie snapshot.height, bevor Sie ihn verwenden: Der Mainnet-Snapshot ist ein einzelnes Archiv von etwa 27 GB, und ein alter bedeutet eine lange Aufholphase (der derzeit veröffentlichte Mainnet-Snapshot liegt vor den Upgrade-Höhen von v3.1.94 und v3.2.0, ein daraus wiederhergestellter Node muss sie also mit einem v3.2.x-Binary replizieren).

SNAP_URL=$(jq -r .snapshot.url latest.json)
SNAP_SHA256=$(jq -r .snapshot.sha256 latest.json)
curl -fsSL "$SNAP_URL" -o snapshot.tar.gz
echo "${SNAP_SHA256} snapshot.tar.gz" | sha256sum -c -

tar xzf snapshot.tar.gz -C ~/.qorechaind/
qorechaind start --minimum-gas-prices=0.1uqor
hinweis

Die Felder snapshot.height und snapshot.ts des Manifests zeigen, wie aktuell das Archiv ist, und State Sync (oben) ist meist schneller als ein Download von 27 GB. Verifizieren Sie vor dem Entpacken immer die Prüfsumme, und verwenden Sie beim Replay aus einem Snapshot ein Node-Release, das jeden Upgrade-Handler enthält (siehe den Hinweis am Anfang dieser Seite).


Pruning und Indexierung​

Stimmen Sie Pruning und Transaktionsindexierung auf Ihre Integration ab. Börsen, die eine vollständige Transaktionshistorie benötigen, sollten mit minimalem Pruning und aktiviertem Transaktionsindexer laufen.

Pruning (app.toml)​

# Keep recent state only — smallest disk footprint
pruning = "default"

# Keep everything — required for archive / full historical queries
# pruning = "nothing"
pruningVerhaltenAnwendungsfall
defaultBehält aktuellen State, prunt den RestRPC-Node, Kontostands-/State-Abfragen
nothingBehält den gesamten historischen StateArchive-Node, vollständige Historie
customVom Betreiber definierte Keep-/Intervall-WerteFeinabgestimmte Aufbewahrung

Node-Limits (app.toml)​

Ab Node-Release v3.2.1 schreibt init einen Abschnitt [qorechain] mit drei node-lokalen Limits. Sie ändern nur, was dieser Node im Speicher hält und was er in die von ihm vorgeschlagenen Blöcke aufnimmt, niemals aber, was ein Block enthalten muss, um gültig zu sein:

[qorechain]
# Maximum number of Cosmos transactions held in the app-side mempool (default 5000).
# When full, a new transaction that pays more per gas evicts the lowest-paying one; otherwise it is refused.
cosmos-mempool-max-txs = 5000

# Time the node may spend selecting transactions for a proposal before it proposes what it has ("0s" disables the budget).
prepare-proposal-budget = "1s"

# Stop after this many candidates in a row that do not fit in the remaining block space (0 disables the cap).
prepare-proposal-max-skips = 64

init schreibt außerdem die EVM-Chain-ID des Netzwerks in die Einstellung evm-chain-id im Abschnitt [evm] von app.toml (9801 für --chain-id qorechain-vladi, 9800 für qorechain-diana). Ein Node, dessen app.toml einen anderen Wert enthält, startet zwar, protokolliert beim Start aber einen Fehler, und sein eigenes JSON-RPC (eth_chainId, Signieren gegen diesen Node) antwortet mit der falschen Chain-ID, bis Sie die Datei korrigieren; der Konsens ist davon nicht betroffen. Ältere Binaries schrieben unabhängig von --chain-id den Testnet-Wert (9800), daher sollte ein vor langer Zeit initialisierter Mainnet-Node diese Einstellung prüfen. Setzen Sie QORE_EVM_CHAIN_ID nicht auf einen anderen Wert als den des Netzwerks: Ein solcher Node verweigert den Start.

Transaktionsindexierung (config.toml)​

[tx_index]
indexer = "kv"

Setzen Sie indexer = "kv" (oder einen umfangreicheren Indexer), damit Transaktionen per Hash und Event abfragbar sind — essenziell für Börsen, die Ein- und Auszahlungen abgleichen. Setzen Sie indexer = "null" nur, wenn Sie keine historischen Tx-Abfragen benötigen.


Endpunkte für Integrationen bereitstellen​

Aktivieren und binden Sie in app.toml die API-Server, die Integratoren benötigen:

[api]
enable = true
address = "tcp://0.0.0.0:1317"

[grpc]
enable = true
address = "0.0.0.0:9090"

[json-rpc]
enable = true
address = "0.0.0.0:8545"
ws-address = "0.0.0.0:8546"
api = "eth,net,web3,txpool"

Die öffentlichen Endpunkte stellen die Namespaces eth_, net_, web3_ und txpool_ bereit. Der Namespace qor_ wird von keinem veröffentlichten Node-Build bereitgestellt, fügen Sie ihn daher nicht hinzu (siehe den Namespace qor_).

Und den RPC-Listener in config.toml:

[rpc]
laddr = "tcp://0.0.0.0:26657"
EndpunktPortVerwendung für
RPC26657Broadcasting von Transaktionen, Abfragen von Blöcken/Status
REST1317HTTP-Abfragen des Chain-States
gRPC9090Programmatischer Zugriff mit hohem Durchsatz
EVM JSON-RPC8545Ethereum-kompatible Integrationen (Chain-ID 9801)
EVM WS8546EVM-Event-Subscriptions
SVM RPC8899Solana-kompatible Lesezugriffe (SVM-Transaktionen sind deaktiviert)
warnung

Exponieren Sie RPC, EVM JSON-RPC oder gRPC niemals direkt ins öffentliche Internet ohne Reverse Proxy, Rate Limiting, Authentifizierung und Firewall. Binden Sie an 0.0.0.0 nur hinter einer kontrollierten Ingress-Schicht.


Health- und Sync-Monitoring​

Sync-Status​

curl -s localhost:26657/status | jq '.result.sync_info.catching_up'
  • true — synchronisiert noch.
  • false — vollständig synchronisiert und liefert den aktuellen State.
# Latest height and network
curl -s localhost:26657/status | jq '.result.sync_info.latest_block_height, .result.node_info.network'

Das Feld network sollte qorechain-vladi (Mainnet) oder qorechain-diana (Testnet) melden.

Prometheus und Grafana​

Der Node kann Prometheus-Metriken auf Port 26660 bereitstellen (setzen Sie prometheus = true im Abschnitt [instrumentation] von config.toml):

http://localhost:26660/metrics

Scrapen Sie diese mit einem beliebigen Prometheus-kompatiblen Collector. Wenn Sie den Docker-Compose-Monitoring-Stack betreiben, ist Grafana unter http://localhost:3001 erreichbar — legen Sie beim ersten Login eigene Zugangsdaten fest. Überwachen Sie Blockhöhen-Rückstand, Peer-Anzahl und Ressourcennutzung; alarmieren Sie, wenn catching_up dauerhaft true bleibt oder die Peer-Anzahl auf null fällt.

EVM-Endpunkt-Prüfung​

curl -s -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
# Expect "0x2649" (9801) on mainnet

Bewährte Betriebspraktiken​

  1. Pinnen Sie die Chain-Version. Betreiben Sie das vom Manifest empfohlene Release (v3.2.1 im Mainnet), verfolgen Sie offizielle Releases für koordinierte Upgrades und halten Sie die Systemuhr per NTP synchronisiert.

  2. Betreiben Sie redundante Nodes. Betreiben Sie mindestens zwei Nodes hinter einem Load Balancer, damit ein einzelner Neustart oder Resync den Integrationsverkehr nicht unterbricht.

  3. Verifizieren Sie Genesis und Snapshots. Validieren Sie die Genesis-SHA-256 und jede Snapshot-Prüfsumme immer gegen das offizielle Release, bevor Sie starten.

  4. Schützen Sie öffentliche Endpunkte. Stellen Sie RPC/EVM/gRPC einen Reverse Proxy, Rate Limiting und eine Firewall voran. Exponieren Sie niemals unauthentifiziertes Schreib-RPC ins Internet.

  5. Passen Sie das Pruning an den Bedarf an. Verwenden Sie pruning = "nothing" plus tx_index = "kv" für Börsen, die die vollständige Ein-/Auszahlungshistorie abgleichen; verwenden Sie default für leichtgewichtige Abfragen.

  6. Überwachen Sie die Synchronisierung kontinuierlich. Alarmieren Sie bei Blockhöhen-Rückstand, null Peers und einem Node, der in catching_up feststeckt.

Ein reines Node-Deployment signiert nie. Transaktionen, die Ihre Integration darüber sendet, müssen bereits die hybride Post-Quanten-Signatur tragen (und für die EVM-Lane benötigt der Absender einen registrierten Schlüssel und ein offenes Autorisierungsfenster); siehe Börsen-Integration und Post-Quanten-Signierung.

Um das Netzwerk ohne den Betrieb eines Full Nodes zu beobachten, siehe die Light-Node-Dokumentation.


Fehlerbehebung​

Der Node stoppt mit einem Uhrenfehler​

Ab Node-Release v3.2.1 stoppt die Konsens-Engine, wenn die Systemuhr um mehr als 60 Sekunden vom Netzwerk abweicht. Betreiben Sie einen NTP-Client (chrony oder systemd-timesyncd), prüfen Sie mit timedatectl status, dass die Uhr synchronisiert ist, und starten Sie den Node dann neu.

Ein bereits vor dem Upgrade angehaltener Node läuft nach einem Binary-Wechsel nicht weiter​

Wenn Ihr Node bereits vor dem Upgrade seines Binaries angehalten hatte oder feststeckte, reicht es nicht aus, einfach das neue Binary einzusetzen und neu zu starten — der Node hat veraltete ABCI-Ergebnisse aus dem alten Lauf im Cache und führt den Block, der das Anhalten verursacht hat, nicht erneut aus. Setzen Sie explizit zurück, bevor Sie neu starten:

qorechaind rollback --home <HOME>
systemctl restart <unit>

Der Befehl lautet qorechaind rollback (ein Top-Level-Subcommand) — es gibt kein Subcommand comet rollback und keine --hard-Flag dafür.

Snapshot-Wiederherstellung landet in einer Crash-Loop wegen einer fehlenden priv_validator_state.json​

Ein veröffentlichtes Archiv/Snapshot enthält nicht data/priv_validator_state.json, und der Node verweigert ohne diese Datei den Start. Falls sie nach einer Snapshot-Wiederherstellung fehlt, erstellen Sie sie — aber nur, wenn noch keine existiert. Überschreiben Sie niemals eine echte: Auf einem Validator ist diese Datei die Anti-Double-Signing-Sicherung, und ein Überschreiben riskiert ein Double-Sign.

echo '{"height":"0","round":0,"step":0}' > <HOME>/data/priv_validator_state.json

Nächste Schritte​