Overview
Celestia is a modular blockchain network designed to provide scalable data availability for decentralized applications. Unlike traditional monolithic blockchains, which bundle execution, consensus, and data availability into a single layer, Celestia separates these functions. This allows developers to build customizable blockchains-rollups or sovereign chains-without maintaining their own consensus network.
At its core, Celestia uses Data Availability Sampling (DAS), a technique that lets nodes verify data availability without downloading entire blocks. This improves scalability while maintaining security. Rollups publish their transaction data to Celestia, and Celestia ensures that data is available and verifiable.
Celestia’s modular architecture leads to three major advantages:
-
Scalability - DAS enables higher throughput as more light nodes join.
-
Sovereignty - Developers can launch independent chains relying on Celestia only for consensus and data availability.
-
Ease of deployment - Rollups can be deployed quickly without building validator sets.
In summary, Celestia is a data-availability-focused base layer that enables a modular approach to blockchain design, making decentralized networks more scalable, flexible, and efficient.
Guide
This guide provides a complete and reliable setup for running a Celestia mainnet node and validator. Here you’ll find everything you need - from downloading binaries and configuration files to initializing the node, managing keys, applying snapshots, and maintaining a stable validator environment. Follow the steps carefully to ensure a smooth and secure deployment on the Celestia network.
Prepare
Update and install packages
sudo apt update && sudo apt upgrade -y && \ sudo apt install curl tar wget clang pkg-config libssl-dev libleveldb-dev jq build-essential bsdmainutils git make ncdu htop screen unzip bc fail2ban htop -y
Installing Go
VER="1.22.0" cd $HOME && \ wget "https://golang.org/dl/go$VER.linux-amd64.tar.gz" && \ sudo rm -rf /usr/local/go && \ sudo tar -C /usr/local -xzf "go$VER.linux-amd64.tar.gz" && \ rm "go$VER.linux-amd64.tar.gz" && \ echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile && \ source $HOME/.bash_profile && \ go version
Binary
git clone cd git checkout make install version --long | grep -e version -e commit # version: # commit:
Initialization
Initialize the node (replace VALIDATOR_NAME with your own)
init VALIDATOR_NAME --chain-id && \ config chain-id && \ config keyring-backend os
Genesis
Download genesis
wget -O $HOME//config/genesis.json
Addrbook
Download addrbook
wget -O $HOME//config/addrbook.json
Configuration
EXTERNAL_IP=$(wget -qO- eth0.me) NODE_NUMBER="1" sed -i.bak \ -e "s/\(proxy_app = \"tcp:\/\/\)\([^:]*\):\([0-9]*\).*/\1\2:$(($NODE_NUMBER + 266))58\"/" \ -e "s/\(laddr = \"tcp:\/\/\)\([^:]*\):\([0-9]*\).*/\1\2:$(($NODE_NUMBER + 266))57\"/" \ -e "s/\(pprof_laddr = \"\)\([^:]*\):\([0-9]*\).*/\1localhost:$(($NODE_NUMBER + 60))60\"/" \ -e "/\[p2p\]/,/^\[/{s/\(laddr = \"tcp:\/\/\)\([^:]*\):\([0-9]*\).*/\1\2:$(($NODE_NUMBER + 266))56\"/}" \ -e "/\[p2p\]/,/^\[/{s/\(external_address = \"\)\([^:]*\):\([0-9]*\).*/\1${EXTERNAL_IP}:$(($NODE_NUMBER + 266))56\"/; t; s/\(external_address = \"\).*/\1${EXTERNAL_IP}:$(($NODE_NUMBER + 266))56\"/}" \ -e "s/\(prometheus_listen_addr = \":\)\([0-9]*\).*/\1$(($NODE_NUMBER + 266))60\"/" $HOME//config/config.toml sed -i.bak \ -e "/\[api\]/,/^\[/{s/\(address = \"tcp:\/\/\)\([^:]*\):\([0-9]*\)\(\".*\)/\1\2:$(($NODE_NUMBER + 13))17\4/}" \ -e "/\[grpc\]/,/^\[/{s/\(address = \"\)\([^:]*\):\([0-9]*\)\(\".*\)/\1\2:$(($NODE_NUMBER + 90))90\4/}" \ -e "/\[grpc-web\]/,/^\[/{s/\(address = \"\)\([^:]*\):\([0-9]*\)\(\".*\)/\1\2:$(($NODE_NUMBER + 90))91\4/}" \ -e "/\[json-rpc\]/,/^\[/{s/\(address = \"\)\([^:]*\):\([0-9]*\)\(\".*\)/\1\2:$(($NODE_NUMBER + 85))45\4/}" \ -e "/\[json-rpc\]/,/^\[/{s/\(ws-address = \"\)\([^:]*\):\([0-9]*\)\(\".*\)/\1\2:$(($NODE_NUMBER + 85))46\4/}" $HOME//config/app.toml echo "export NODE=http://localhost:$(($NODE_NUMBER + 266))57" >> $HOME/.bash_profile && \ source $HOME/.bash_profile && \ config node $NODE
Create a service file
sudo tee /etc/systemd/system/.service > /dev/null <<EOF [Unit] Description=_node After=network.target [Service] User=$USER Type=simple ExecStart=$(which ) start --home $HOME/ Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF
Start the node
sudo systemctl daemon-reload && \ sudo systemctl enable && \ sudo systemctl restart && \ sudo journalctl -u -f -o cat
Restore node from snapshot
sudo apt install lz4 -y && \ sudo systemctl stop && \ cp $HOME//data/priv_validator_state.json $HOME//priv_validator_state.json.backup && \ rm -rf $HOME//data && \ curl | lz4 -dc - | tar -xf - -C $HOME/ && \ mv $HOME//priv_validator_state.json.backup $HOME//data/priv_validator_state.json && \ sudo systemctl restart && \ sudo journalctl -u -f
State Sync
Restore node from state sync
SNAP_RPC=":443" && \ sudo systemctl stop && \ cp $HOME//data/priv_validator_state.json $HOME//priv_validator_state.json.backup && \ tendermint unsafe-reset-all --home $HOME/ --keep-addr-book && \ peers="@" && \ sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME//config/config.toml && \ LATEST_HEIGHT=$(curl -s "$SNAP_RPC/block" | jq -r .result.block.header.height) && \ BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)) && \ TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash) && \ echo "$LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH" && sleep 2 && \ sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" $HOME//config/config.toml && \ mv $HOME//priv_validator_state.json.backup $HOME//data/priv_validator_state.json && \ sudo systemctl restart && \ sudo journalctl -u -f
Upgrade Node
VER="v" git clone && \ cd $HOME && \ rm -rf && \ git clone && \ cd && \ git checkout tags/$VER -b $VER && \ make install && \ sudo systemctl restart && \ sudo journalctl -u -f
Delete Node
sudo systemctl stop && \ sudo systemctl disable && \ sudo rm -rf /etc/systemd/system/.service && \ sudo rm "$(which )" && \ sudo rm -rf "$HOME/"
Key management
# This command generates a new wallet with a unique keypair. # Use this to create a secure, brand-new wallet for transactions. # Your wallet name = "wallet" keys add wallet
Validator management
tx staking create-validator \ --amount 1000000 \ --moniker "VALIDATOR_NAME" \ --identity "" \ --website "" \ --details "" \ --from wallet \ --commission-rate 0.1 \ --commission-max-rate 0.2 \ --commission-max-change-rate 0.01 \ --min-self-delegation 1 \ --pubkey $(celestia-appd tendermint show-validator) \ --chain-id \ --gas auto \ --gas-adjustment 1.4 \ --gas-prices 0.002 \ -y
Validator commands
# Retrieves comprehensive information regarding the validator. # This command is utilized to fetch details about the current validator, including its address, public key, and associated data. # Your wallet name = "wallet" q staking validator $( keys show wallet --bech val -a)
Onchain
# Withdraw all accumulated rewards from your account. # This command retrieves and withdraws all rewards earned from staking. # Your wallet name = "wallet" tx distribution withdraw-all-rewards --from wallet --chain-id --gas-adjustment=1.15 --gas auto --gas-prices 0.002 -y


