Network constants
Prerequisites
- A fully synced
ctmdnode. Install it with the manual mainnet install below.deploy.sh, described in Full Node Installation, is the install path for non-validator nodes; validators do not use it. Submitcreate-validatoronly afterctmd statusreportscatching_upasfalse. - The node home. Commands on this page use
~/.ctmd, the default home ofctmd. The manual install below puts the node home at/var/lib/ctmd, owned by thectmduser, so run commands that read it, such asctmd comet show-validator, as that user with--home /var/lib/ctmd.
Manual mainnet install
This route installs a mainnetctmd node on Linux by hand. Each step does what deploy.sh install and deploy.sh state-sync do, so the host ends up with the same layout, service unit, and configuration as a deploy.sh host, without the script. Release binaries exist for linux-amd64, linux-arm64, and darwin-arm64; the systemd steps apply to Linux only.
You need curl, jq, tar, sha256sum, and systemd. Run the commands in a root shell (sudo -i), as deploy.sh does, and keep one working directory for the downloaded files.
Download and verify the release
Release binaries are listed in metadata.json. Resolve the current version and the tarball and checksum URLs for your platform:.sha256 file, then verify the tarball. The check must print OK:
ctmd-<version>-<platform>/, which holds bin/ctmd and a lib/ directory of bundled shared libraries (RocksDB, the SP1 verifier, and their compression libraries). ctmd needs both.
Install the binary and libraries
Install into a versioned directory under/opt, then point the /opt/ctmd and /usr/local/bin/ctmd symlinks at it. This is the layout deploy.sh uses, so Rollback works the same way on this host.
Create the service user and node home
Initialize the node
Initialize the node home as thectmd user with the mainnet chain ID. Like deploy.sh, run it from inside the node home, in a subshell so your working directory does not change:
ctmd init also creates the validator consensus key at /var/lib/ctmd/config/priv_validator_key.json. Back it up securely, and see KMS and sentry architecture before you rely on the local file signer.
Install and verify genesis
Replace the generatedgenesis.json with the mainnet genesis, then check it against the SHA-256 that metadata.json publishes. The check must print OK:
ebe6292aa5885b508b1d455c93564683c92e9cc3f80592ee615b1cffbc74a653.
Configure peers and chain IDs
Build the seed and persistent peer lists from the mainnet entry in peers.json:/var/lib/ctmd/config/config.toml, using the two lists printed above:
persistent_peers with your sentries, as described in KMS and sentry architecture.
Set the EVM chain ID in /var/lib/ctmd/config/app.toml explicitly:
/var/lib/ctmd/config/client.toml:
Configure state sync (optional)
State sync bootstraps the node from a recent snapshot instead of replaying from genesis.deploy.sh state-sync takes the trust height and hash from the first trusted RPC in peers.json, 2000 blocks below its latest height, and builds the persistent peers from the node IDs of the two trusted RPCs and the hosts of the first two persistent peers:
/var/lib/ctmd/config/config.toml:
deploy.sh state-sync does. The reset needs write access to the node home, which the next step closes again:
unsafe-reset-all also resets the validator signing state (data/priv_validator_state.json). On a validator that has already signed, that can make it sign the same height twice, and a double sign is slashed 5% and permanently jails (tombstones) the validator. Skip this section to replay from genesis instead.
Set ownership
After editing, restore the ownership and modes thatdeploy.sh sets on the node home:
Run the node as a service
Create/etc/systemd/system/ctmd.service with the unit that deploy.sh generates. LD_LIBRARY_PATH points at the bundled libraries of the active install, and TMPDIR points at the node-owned temp directory that state sync writes to.
catching_up as false:
deploy.sh does: stop the service, set enable = false under [statesync] in config.toml, and start the service again.
Create validator
Generate an operator key.eth_secp256k1 is the default account key algorithm for ctmd.
ctmd user against /var/lib/ctmd:
validator.json. The pubkey must be the /cosmos.crypto.ed25519.PubKey output from ctmd comet show-validator.
<fee> must be at least the gas limit multiplied by the chain’s minimum gas price, currently 222000000000ctm (222 gwei) per unit of gas, or by the current base fee if it is higher (ctmd query feemarket base-fee). To have ctmd compute the fee, pass that per-gas price with --gas-prices, for example --gas-prices 222000000000ctm, instead of --fees. See Gas on c8ntinuum for the fee market parameters.
c8ntinuum enforces a validator creation floor of 888,888 CTM (888888000000000000000000ctm, 888888 * 10^18) for both the initial self-delegation amount and min-self-delegation. The six genesis validators use this minimum self-delegation and have between 999000000000000000000000ctm and 999912000000000000000000ctm self-bonded.
For the module-level policy details and EVM staking precompile coverage, see Minimum Self-Delegation Check.
Commission bounds
The six genesis validators use:
General staking validation still applies: commission values cannot be negative,
rate <= max-rate, max-rate <= 1, max-change-rate <= max-rate, and commission can be changed (raised or lowered) at most once per 24 hours, with each increase capped at max-change-rate.
Keys and Ledger
- Account/operator keys default to
eth_secp256k1. - Supported account algorithms are
eth_secp256k1andsecp256k1. - Consensus validator keys are CometBFT
ed25519keys exposed throughctmd comet show-validator. - The default coin type for
ctmdis60, with default pathm/44'/60'/0'/0/0. - Ledger coin type
60uses the Ethereum app and creates aneth_secp256k1public key. - Ledger coin type
118uses the Cosmos app and creates a Cosmossecp256k1public key. ctmd keys add --ledgerrejects a custom--hd-path; use--coin-type,--account, and--index.
KMS and sentry architecture
c8ntinuum does not require a specific KMS or sentry topology; use these as operational recommendations.- Lowest-complexity signing uses the local CometBFT file signer under
~/.ctmd/config/priv_validator_key.json, but this has the largest key-exposure risk. - Remote signing can be implemented with TMKMS or Horcrux-compatible CometBFT remote signer setups.
- For threshold signing or high availability, prefer Horcrux-style threshold signing over running duplicate live validator keys.
- Never run the same validator consensus key in two active signers at once.
- Keep the validator node private and connect it only to sentry nodes.
- Public sentries should expose P2P and any intended public RPC surfaces; the validator should use sentries as persistent peers.
- Recommended validator-side settings include
pex = false, no public RPC, and firewall access limited to sentries and the signer. - Recommended sentry-side settings include
pex = true,persistent_peersincluding the validator, andprivate_peer_idsincluding the validator node ID.
Ports and services
gRPC is enabled by default on
localhost:9090. The REST API, JSON-RPC, and telemetry are disabled by default unless explicitly enabled in config or via start flags.
Monitoring
Monitor at least:- Process health and automatic restart behavior for
ctmd. - Sync status from
ctmd status; alert ifcatching_upis true on a validator. - Peer count and sentry connectivity from CometBFT RPC.
- Block height progress, block time, disk usage, memory, file descriptors, and database growth.
- Validator signing info from
ctmd query slashing signing-info $(ctmd comet show-address). - Missed blocks well before the downtime threshold; alert before
4444missed blocks in the8888block window. - JSON-RPC, gRPC, API, and indexer latency only on nodes intentionally serving those surfaces.
x/valrewards, including epoch reward settings, reward-pool funding, outstanding reward queries, and one-time validator reward claims. See Validator Rewards for CLI and precompile details.
Slashing, jailing, and unjail
Mainnet (c8ntinuum_8-1) slashing params, from ctmd query slashing params:
A validator is jailed for downtime when it misses more than half of the
8888 block signing window after the slashing warm-up period. Downtime burns 1% and jails for 600s. Double-signing burns 5%, jails, and tombstones the validator; tombstoned validators cannot be unjailed.
Unjail only after fixing the signer/node issue, waiting until jailed_until has passed, and confirming self-delegation is at least 888888000000000000000000ctm.