Celestia
This guide covers connecting your Evolve chain to Celestia for production data availability.
Prerequisites
- Completed an Evolve quickstart tutorial
- Familiarity with running a Celestia light node
Running a Celestia Light Node
Before starting your Evolve chain, you need a Celestia light node running and synced.
Follow the Celestia light node documentation to install, initialize, and start a light node for your target network (Arabica, Mocha, or Mainnet).
Configuring Evolve for Celestia
Required Configuration
The following flags are required to connect to Celestia:
| Flag | Description |
|---|---|
--evnode.da.address | Celestia node RPC endpoint |
--evnode.da.auth_token | JWT authentication token |
--evnode.da.header_namespace | Namespace for block headers |
--evnode.da.data_namespace | Namespace for transaction data |
Get DA Block Height
Query the current DA height to set as your starting point:
DA_BLOCK_HEIGHT=$(celestia header network-head | jq -r '.result.header.height')
echo "Your DA_BLOCK_HEIGHT is $DA_BLOCK_HEIGHT"Get Authentication Token
Generate a write token for your light node:
Arabica:
AUTH_TOKEN=$(celestia light auth write --p2p.network arabica)Mocha:
AUTH_TOKEN=$(celestia light auth write --p2p.network mocha)Mainnet:
AUTH_TOKEN=$(celestia light auth write)Set Namespaces
Choose unique namespaces for your chain's headers and data:
DA_HEADER_NAMESPACE="my_chain_headers"
DA_DATA_NAMESPACE="my_chain_data"The namespace values are automatically encoded by ev-node for Celestia compatibility.
You can use the same namespace for both headers and data, or separate them for optimized syncing (light clients can sync headers only).
Set DA Address
Default Celestia light node port is 26658. Note: Connection to a celestia-node DA requires a websocket connection:
DA_ADDRESS=ws://localhost:26658Running Your Chain
Start your chain with Celestia configuration:
evnode start \
--evnode.node.aggregator \
--evnode.da.auth_token $AUTH_TOKEN \
--evnode.da.header_namespace $DA_HEADER_NAMESPACE \
--evnode.da.data_namespace $DA_DATA_NAMESPACE \
--evnode.da.address $DA_ADDRESSFor Cosmos SDK chains:
appd start \
--evnode.node.aggregator \
--evnode.da.auth_token $AUTH_TOKEN \
--evnode.da.header_namespace $DA_HEADER_NAMESPACE \
--evnode.da.data_namespace $DA_DATA_NAMESPACE \
--evnode.da.address $DA_ADDRESSBring Your Own Key (Signed Submission)
By default ev-node calls blob.Submit on the Celestia node, which signs and pays with the node's keyring. Shared DA endpoints such as da-proxy have no funded account, so blob.Submit through them cannot succeed. With da.tx_signer enabled, ev-node holds the key itself: it signs each PayForBlobs locally and broadcasts it over Celestia consensus gRPC. Reads (retrieval, headers, proofs) still use --evnode.da.address.
This is supported by the testapp and evm binaries.
da-proxy Endpoints
da-proxy fronts DA JSON-RPC and consensus gRPC behind one token with write scope:
| Network | DA JSON-RPC (da.address) | Consensus gRPC (tx_signer.grpc_address) |
|---|---|---|
| Mocha | https://da.da-proxy-lb.celestia-mocha.com | grpc.da-proxy-lb.celestia-mocha.com:443 |
| Mainnet | https://da.da-proxy-lb.lunaroasis.net | grpc.da-proxy-lb.lunaroasis.net:443 |
The token is sent as Authorization: Bearer on JSON-RPC and as x-token metadata on gRPC. Set it once in --evnode.da.auth_token; tx_signer.grpc_auth_token defaults to it.
Create the Key
Use cel-key (shipped with celestia-node) to create or import a key into a keyring directory under the node home (default <home>/keys):
cel-key add evnode --keyring-backend file --keyring-dir ~/.evm/keys
# or import an existing mnemonic (BIP44 path m/44'/118'/0'/0/0):
cel-key add evnode --recover --keyring-backend file --keyring-dir ~/.evm/keysThe passphrase you choose (at least 8 characters) unlocks the keyring at startup. Provide it through EVNODE_DA_KEYRING_PASSPHRASE or a file passed via --evnode.da.tx_signer.passphrase_file; never on the command line. The test backend is unencrypted and only for local development.
Fund the Key
Show the address and fund it from a faucet (testnets) or a TIA transfer (Mainnet):
cel-key show evnode -a --keyring-backend file --keyring-dir ~/.evm/keysev-node logs the address and balance when it starts. Watch the balance: once the key runs out of TIA, blob submission stops.
Start the Node
export EVNODE_DA_KEYRING_PASSPHRASE=... # or --evnode.da.tx_signer.passphrase_file
evm start \
--evnode.node.aggregator \
--evnode.da.address https://da.da-proxy-lb.celestia-mocha.com \
--evnode.da.auth_token $DA_PROXY_TOKEN \
--evnode.da.namespace $DA_HEADER_NAMESPACE \
--evnode.da.data_namespace $DA_DATA_NAMESPACE \
--evnode.da.tx_signer.enabled \
--evnode.da.tx_signer.grpc_address grpc.da-proxy-lb.celestia-mocha.com:443 \
--evnode.da.tx_signer.key_name evnodeThe chain-id is taken from the gRPC endpoint. Startup fails if the key is missing from the keyring or its account does not exist on chain yet, so fund it first. See the configuration reference for every option.
Notes
--evnode.da.signing_addressescannot be combined withtx_signer; one key signs every submission.- Submit options such as
gas_priceandmax_gas_pricein--evnode.da.submit_optionsapply as before. Setmax_gas_priceto cap fees during gas spikes. - A transaction that times out may still be committed later and posted again, as with node-side signing. Keep
da.block_time × da.mempool_ttlat or above the confirmation window.
Viewing Your Chain Data
Once running, you can view your chain's data on Celestia block explorers:
Search by your namespace or account address to see submitted blobs.
Configuration Options
Gas Price
By default, ev-node uses automatic gas price detection. Keep the default unless you have an operational reason to override it:
--evnode.da.gas_price 0.01Higher gas prices result in faster inclusion during congestion. Omit this flag to use the automatic default.
Block Time
Set the expected DA block time (affects retry timing):
--evnode.da.block_time 6sCelestia's block time is approximately 6 seconds.
Multiple Signing Addresses
For high-throughput chains, use multiple signing addresses to avoid nonce conflicts:
--evnode.da.signing_addresses celestia1abc...,celestia1def...,celestia1ghi...All addresses must be funded and loaded in the Celestia node's keyring.
Funding Your Account
Testnet (Mocha/Arabica)
Get testnet TIA from faucets:
Mainnet
Purchase TIA and transfer to your Celestia light node address.
Check your address:
celestia state account-addressTroubleshooting
Out of Funds
If you see Code: 19 errors, your account is out of TIA:
- Fund your account
- Increase gas price to unstick pending transactions
- Restart your chain
See Troubleshooting Guide for details.
Connection Refused
Verify your Celestia node is running:
curl http://localhost:26658/header/sync_stateToken Expired
Regenerate your auth token:
celestia light auth write --p2p.network <network>See Also
- Local DA Guide - Development setup
- Troubleshooting - Common issues
- Configuration Reference - All DA options