Skip to content

Running a node ​

Run c12d, the Carbon12 CometBFT application binary built from Carbon12-Chain/chain.

Build from source ​

bash
git clone https://github.com/Carbon12-Chain/chain.git
cd chain
make install
c12d version --long
ToolVersion (pinned)
Go1.25.9 (go.mod, ADR-0001)
Cosmos SDKv0.54.3
CometBFTv0.39.3
cosmos-evmv0.7.3

Other useful targets: make test, make lint, make proto-gen.

Hardware guidance ​

The chain repo does not publish formal mainnet hardware SLAs. For testnet / devnet scripts, a modern laptop with 8+ GiB RAM, SSD storage, and stable outbound 26656 (P2P) is sufficient for a single validator or full node. Indexer + Postgres (optional, off-chain) adds memory and disk for services/indexer.

Production operators should size for CometBFT + SDK defaults, EVM JSON-RPC load if exposed, and state growth from attestations.

Initialize a node ​

Default node home is .c12d (app/config/config.go).

bash
c12d init mymoniker --chain-id c12-testnet-1

Set in config/app.toml:

toml
minimum-gas-prices = "0.001uc12"
evm-chain-id = 12121

Enable APIs as needed (app/config/config.go defaults): REST, gRPC, EVM JSON-RPC with eth, net, web3.

Genesis download & verify ​

bash
curl -fsSL -o $HOME/.c12d/config/genesis.json \
  https://genesis.testnet.carbon12.network
sha256sum $HOME/.c12d/config/genesis.json
# b62e5b5c27617434d25ff46de639b0f11e68eb7b08274cef5ba7f3d2ebc42b71

Seeds & peers ​

Public testnet seed P2P (CometBFT):

FieldValue
Host:port52.6.69.73:26756

Set persistent_peers to {node_id}@52.6.69.73:26756. Fetch node_id at join time (do not commit a hard-coded id in docs):

bash
# From the seed's Comet RPC (if reachable):
curl -s http://52.6.69.73:26657/net_info | jq -r '.result.node_info.id'

# Or from any synced public RPC — find the peer on the seed P2P port:
curl -s https://rpc.testnet.carbon12.network/net_info \
  | jq -r '.result.peers[] | select(.node_address | test(":26756$")) | .node_info.id'

Then in config/config.toml:

toml
persistent_peers = "<node_id>@52.6.69.73:26756"

Full nodes / RPC nodes should set persistent_peers to the seed (plus sentries if used). Chain runbook outline: docs/runbooks/testnet.md.

Local make testnet-up writes .testnet/endpoints.txt with seed_p2p=... for localhost bring-up.

State sync ​

c12d exposes Cosmos SDK state sync snapshot flags via cmd/c12d/cmd/root.go. There is no testnet runbook template in-repo for CometBFT state sync RPC/trust heights — if state sync is not published by operators, sync from genesis or peer blocks.

Validator vs full node ​

RoleGentx / stakingNotes
ValidatorMsgCreateValidator with at least min_validator_bond_uc12 (25_000_000_000 uc12 = 25,000 C12 default)May require MsgAdmitValidator via gov if not genesis-admitted (ADR-0020)
Full / RPC nodeNo gentxSet persistent_peers; expose REST/RPC/EVM as policy allows

Testnet local scripts fund gentx with 25000000000uc12 self-delegation (testnet/scripts/lib.sh).

systemd example ​

ini
[Unit]
Description=Carbon12 c12d
After=network-online.target
Wants=network-online.target

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

[Install]
WantedBy=multi-user.target

Ensure app.toml / config.toml paths match --home.

Upgrades ​

On-chain upgrades use Cosmos SDK x/upgrade with governance authority (docs/runbooks/upgrade.md):

  1. Coordinate binary c12d build before halt height.
  2. Submit upgrade proposal via x/c12gov wrapper (quorum / threshold per spec).
  3. Reference handler names in app/upgrades.go (e.g. v0.6.0-to-v0.7.0 runs ModuleManager.RunMigrations).

Follow the same runbook on testnet with public endpoints during a maintenance window.

Docker / local testnet ​

bash
make testnet-up      # 4 validators, seed, 2 RPC nodes → .testnet/
make testnet-smoke
make testnet-docker  # optional container workflow

See testnet/README.md.

Testnet tokens have no monetary value. Mainnet is planned.