Running a node
Run c12d, the Carbon12 CometBFT application binary built from Carbon12-Chain/chain.
Build from source
git clone https://github.com/Carbon12-Chain/chain.git
cd chain
make install
c12d version --long| Tool | Version (pinned) |
|---|---|
| Go | 1.25.9 (go.mod, ADR-0001) |
| Cosmos SDK | v0.54.3 |
| CometBFT | v0.39.3 |
| cosmos-evm | v0.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).
c12d init mymoniker --chain-id c12-testnet-1Set in config/app.toml:
minimum-gas-prices = "0.001uc12"
evm-chain-id = 12121Enable APIs as needed (app/config/config.go defaults): REST, gRPC, EVM JSON-RPC with eth, net, web3.
Genesis download & verify
curl -fsSL -o $HOME/.c12d/config/genesis.json \
https://genesis.testnet.carbon12.network
sha256sum $HOME/.c12d/config/genesis.json
# b62e5b5c27617434d25ff46de639b0f11e68eb7b08274cef5ba7f3d2ebc42b71Seeds & peers
Public testnet seed P2P (CometBFT):
| Field | Value |
|---|---|
| Host:port | 52.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):
# 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:
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
| Role | Gentx / staking | Notes |
|---|---|---|
| Validator | MsgCreateValidator 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 node | No gentx | Set persistent_peers; expose REST/RPC/EVM as policy allows |
Testnet local scripts fund gentx with 25000000000uc12 self-delegation (testnet/scripts/lib.sh).
systemd example
[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.targetEnsure app.toml / config.toml paths match --home.
Upgrades
On-chain upgrades use Cosmos SDK x/upgrade with governance authority (docs/runbooks/upgrade.md):
- Coordinate binary
c12dbuild before halt height. - Submit upgrade proposal via
x/c12govwrapper (quorum / threshold per spec). - Reference handler names in
app/upgrades.go(e.g.v0.6.0-to-v0.7.0runsModuleManager.RunMigrations).
Follow the same runbook on testnet with public endpoints during a maintenance window.
Docker / local testnet
make testnet-up # 4 validators, seed, 2 RPC nodes → .testnet/
make testnet-smoke
make testnet-docker # optional container workflowSee testnet/README.md.