This page documents the canonical local single-node workflow for c8ntinuum developers.

Canonical script

local_node.sh exists at the c8ntinuum repository root and is the canonical local-node script:
./local_node.sh [options]
There is no separate local-node repository for the default developer flow. For hosted deployment scripts and source attribution, see Deployment Scripts. Keep this page and local_node.sh in sync when the script changes.

Prerequisites

  • Go matching go.mod, currently 1.25.0
  • make
  • jq
  • A working C toolchain for CGO builds
  • Rust/SP1 build dependencies required by make install
local_node.sh installs ctmd by default. It honors BINDIR if set; otherwise it resolves the install path to $(go env GOPATH)/bin, falling back to $HOME/go/bin.

Install and start

Start from a clean local genesis and install the binary:
./local_node.sh -y
Use an existing installed binary without rebuilding:
./local_node.sh --no-install -y
Install and run from a custom binary directory:
BINDIR=/tmp/ctm-bin ./local_node.sh -y
Start the existing local node state without overwriting ~/.ctmd:
./local_node.sh --no-install -n
The script writes local chain data under:
$HOME/.ctmd

Reset

The normal reset command is:
./local_node.sh -y
That removes the existing $HOME/.ctmd directory and creates a fresh local genesis. The manual equivalent is:
rm -rf "$HOME/.ctmd"
./local_node.sh
Stop the node with Ctrl-C.

Useful flags

-y                       Overwrite existing chain data without prompt
-n                       Do not overwrite existing chain data
--no-install             Skip 'make install'
--remote-debugging       Build with nooptimization,nostrip
--additional-users N     Create N extra users: dev4, dev5, ...
--mnemonic-file PATH     Where to write mnemonics YAML
--mnemonics-input PATH   Read dev mnemonics from a yaml file
--additional-users accepts only non-negative integers. Generated extra-user mnemonics are written to $HOME/.ctmd/mnemonics.yaml unless --mnemonic-file is provided.

Chain configuration

The chain ID continuum_2182-1 is local-only and isolated from public networks. For mainnet use continuum_2184-1; for testnet use continuum_2185-1.
SettingLocal value
Cosmos chain IDcontinuum_2182-1
Native denomctm
Display denomtest
Keyring backendtest
Account key algorithmeth_secp256k1
Node home$HOME/.ctmd
Monikerlocaltestnet
Minimum gas price0ctm
EVM min tip0
EVM JSON-RPC APIseth,txpool,personal,net,debug,web3
For EVM tooling, derive the numeric chain ID from the local chain ID and verify it with eth_chainId after startup if the tool requires an explicit number.

Ports

The script enables the local app APIs and uses the default ctmd local addresses.
ServiceDefault local address
EVM JSON-RPC HTTPhttp://127.0.0.1:8545
EVM JSON-RPC WebSocketws://127.0.0.1:8546
CometBFT RPCtcp://127.0.0.1:26657
CometBFT P2Ptcp://127.0.0.1:26656
Cosmos REST APItcp://127.0.0.1:1317
Cosmos gRPClocalhost:9090
Geth metrics127.0.0.1:8100

Default accounts

These accounts are deterministic local development accounts. They are public test keys and must never be used with real funds.
NameEVM addressLocal bech32 addressPrivate key
dev00xC6Fe5D33615a1C52c08018c47E8Bc53646A0E101c81cml96vmptgw99syqrrz8az79xer2pcgpw8hsl40x88cbead91aee890d27bf06e003ade3d4e952427e88f88d31d61d3ef5e5d54305
dev10x963EBDf2e1f8DB8707D05FC75bfeFFBa1B5BaC17c81jcltmuhplrdcwp7stlr4hlhlhgd4htqhc0gcnx0x741de4f8988ea941d3ff0287911ca4074e62b7d45c991a51186455366f10b544
dev20x40a0cb1C63e026A81B55EE1308586E21eec1eFa9c81gzsvk8rruqn2sx64acfsskrwy8hvrmaffytl6p0x3b7955d25189c99a7468192fcbc6429205c158834053ebe3f78f4512ab432db9
dev30x498B5AeC5D439b733dC2F58AB489783A23FB26dAc81fx944mzagwdhx0wz7k9tfztc8g3lkfk62373ee0x8a36c69d940a92fcea94b36d0f2928c7a0ee19a90073eda769693298dfa9603b
Each default dev account receives:
1000000000000000000000ctm
The default validator key is mykey.
FieldValue
EVM/operator bytes0x7cB61D4117AE31a12E393a1Cfa3BaC666481D02E
Local account addressc810jmp6sgh4cc6zt3e8gw05wavvejgr5pwmph94z
Local validator addressc8valoper10jmp6sgh4cc6zt3e8gw05wavvejgr5pwrxmh56
Mnemonicgesture inject test cycle original hollow east ridge hen combine junk child bacon zero hope comfort vacuum milk pitch cage oppose unhappy lunar seat
The validator account is funded during genesis and self-delegates 1000000000000000000000000ctm.

Active precompiles and local native wrapper

local_node.sh activates this static precompile set in genesis:
NameAddress
P2560x0000000000000000000000000000000000000100
Bech320x0000000000000000000000000000000000000400
Staking0x0000000000000000000000000000000000000800
Distribution0x0000000000000000000000000000000000000801
ICS200x0000000000000000000000000000000000000802
Bank0x0000000000000000000000000000000000000804
Gov0x0000000000000000000000000000000000000805
Slashing0x0000000000000000000000000000000000000806
ICS020x0000000000000000000000000000000000000807
The script also configures the native ERC-20 precompile/token pair for ctm:
NameAddressDenom
Native ERC-20 / WERC20-style surface0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEctm
The repository also contains a separate genesis-backed preinstall catalog in Pre-deployed Contracts. The local script creates a fresh genesis and currently leaves app_state.evm.preinstalls empty, so do not assume those ecosystem preinstalls exist on a local_node.sh chain unless the script is updated.

Docker support

The canonical local development path is ./local_node.sh. Docker assets exist, but they are separate from the single-node script flow:
  • docker/ctmd-runtime.Dockerfile defines a ctmd runtime image layout.
  • docker-compose.yml defines a legacy multi-node cosmos/evmd localnet with ports for four nodes.
  • tests/jsonrpc/docker-compose.yml supports JSON-RPC test infrastructure.
Use Docker for workflows that explicitly reference those files. For day-to-day local development against this repository, prefer ./local_node.sh.

Expected logs

On a fresh reset, expect logs like:
Flag -y passed -> Overwriting the previous chain data.
using default mnemonics
adding key for dev0
adding key for dev1
adding key for dev2
adding key for dev3
Genesis transaction written to "$HOME/.ctmd/config/gentx/..."
File at $HOME/.ctmd/config/genesis.json is a valid genesis file
INF starting ABCI with CometBFT
INF starting node with ABCI CometBFT in-process
INF Starting JSON-RPC server address=127.0.0.1:8545
INF finalized block height=1
INF executed block height=1
INF committed state height=1
During shutdown with Ctrl-C, expect:
INF caught signal signal=interrupt
INF stopping gRPC server...
INF stopping API server...
INF stopping JSON-RPC server...
INF Application gracefully shutdown