๐Ÿ’พInstallation

Geth client installation guide.

Create Aliases

These aliases make interacting with Geth on the command line easier.

echo "alias geth-log='journalctl -f -u geth.service -o cat | ccze -A'" >> ~/.bashrc
echo "alias geth-start='sudo systemctl start geth.service'" >> ~/.bashrc
echo "alias geth-stop='sudo systemctl stop geth.service'" >> ~/.bashrc
echo "alias geth-restart='sudo systemctl restart geth.service'" >> ~/.bashrc
echo "alias geth-status='sudo systemctl status geth.service'" >> ~/.bashrc
echo "alias geth-version='sudo /usr/local/bin/geth --version'" >> ~/.bashrc
echo "alias geth-config='sudo vim /etc/systemd/system/geth.service'" >> ~/.bashrc
echo "alias geth-enable='sudo systemctl enable geth.service'" >> ~/.bashrc
echo "alias geth-disable='sudo systemctl disable geth.service'" >> ~/.bashrc
echo "alias geth-delete-data='sudo rm -rf /var/lib/goethereum/geth'" >> ~/.bashrc
echo "alias geth-update='~/geth-update.sh'" >> ~/.bashrc

echo "alias geth-attach='sudo geth attach --preload ~/geth-console-script.js /var/lib/goethereum/geth.ipc'" >> ~/.bashrc
echo "alias geth-blockNumber='sudo geth --exec \"eth.blockNumber\" attach /var/lib/goethereum/geth.ipc'" >> ~/.bashrc
echo "alias geth-peerCount='sudo geth --exec \"net.peerCount\" attach /var/lib/goethereum/geth.ipc'" >> ~/.bashrc
echo "alias geth-nodeInfo='sudo geth --exec \"admin.nodeInfo\" attach /var/lib/goethereum/geth.ipc'" >> ~/.bashrc

source ~/.bashrc

Firewall Configuration

Configure the firewall using generic Execution client UFW settings:#ufw

Go - Install

Find the latest version of Go here: https://go.dev/doc/install

GO_LATEST_VERSION=    # Add the latest Go version here

cd ~/
wget https://go.dev/dl/go${GO_LATEST_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go${GO_LATEST_VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
echo 'PATH="$PATH:/usr/local/go/bin"' >> ~/.profile

Geth - Install

Build the latest version of Geth.

GETH_VERSION_COMMIT_HASH=        # e.g.3f907d6

cd ~
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
git checkout ${GETH_VERSION_COMMIT_HASH}
make geth

Move the compiled Geth build to a new directory.

sudo cp ~/go-ethereum/build/bin/geth /usr/local/bin

Create Geth user and directory.

sudo useradd --no-create-home --shell /bin/false goeth
sudo mkdir -p /var/lib/goethereum

JWT Secret is now shared between all clients on the same machine:Create JWT Secret

Geth - Configure Service

Set permissions.

sudo chown -R goeth:goeth /var/lib/goethereum

Configure Execution Service Environment Variables.

Configure Geth service using the command line flags.

sudo vim /etc/systemd/system/geth.service
/etc/systemd/system/geth.service
[Unit]
Description=Go Ethereum Client (Geth) - Execution Node
After=network.target
Wants=network.target

[Service]
User=goeth
Group=goeth
Type=simple
Restart=always
RestartSec=5
TimeoutStopSec=1200

EnvironmentFile=/etc/default/execution-variables.env

ExecStart=/usr/local/bin/geth \
    --${NETWORK} \
    --syncmode=snap \
    --port ${EXECUTION_P2P_PORT} \
    --discovery.port ${EXECUTION_P2P_PORT} \
    --datadir /var/lib/goethereum \
    \
    --pprof \
    --metrics \
    --metrics.expensive \
    --metrics.addr ${EXECUTION_METRICS_ADDR} \
    --metrics.port ${EXECUTION_METRICS_PORT} \
    \
    --authrpc.jwtsecret=/var/lib/jwtsecret \
    --maxpeers ${EXECUTION_MAX_PEERS} \
    \
    --ws \
    --ws.origins '*' \
    --ws.port ${EXECUTION_WS_PORT} \
    --ws.addr ${EXECUTION_WS_ADDR} \
    \
    --http \
    --http.api "db,eth,net,engine,rpc,web3" \
    --http.vhosts "*" \
    --http.corsdomain "*" \
    --http.addr ${EXECUTION_RPC_ADDR} \
    --http.port ${EXECUTION_RPC_PORT}

[Install]
WantedBy=default.target

Start the service and check it's working as expected.

Geth - Command Aliases

daemon-reload   # Reload any changes made to the geth.service
geth-enable     # Enable the geth.service
geth-start      # Start the geth.service
geth-status     # View the status of the geth.service

geth-log        # View the geth.service logs

Geth - Update Scripts

Create Geth update script.

vim ~/geth-update.sh
~/geth-update.sh
#!/bin/bash
set -e

while true; do
    read -p "Are you sure you want to update Geth? (Y/N) " yn
    case $yn in
        [Yy]* ) break;;
        [Nn]* ) exit;;
        * ) echo "Please answer Y or N.";;
    esac
done

cd ~/go-ethereum

read -p "Enter the commit hash you want to checkout: " commit_hash

git fetch
git checkout $commit_hash

echo
echo "**************"
echo "Making Geth..."
echo "**************"
make geth

# Check if geth.service is running
service_was_running=0
if sudo systemctl is-active --quiet geth.service; then
    service_was_running=1
    echo "****************"
    echo "Stopping Geth..."
    sudo systemctl stop geth.service
fi

echo "Replacing previous version..."
sudo rm /usr/local/bin/geth
sudo cp ~/go-ethereum/build/bin/geth /usr/local/bin

# Only start geth.service if it was running originally
if [ $service_was_running -eq 1 ]; then
    echo "Restarting Geth..."
    echo "******************"
    sudo systemctl start geth.service
fi

Make the script executable.

chmod u+x ~/geth-update.sh

Geth - Configure JavaScript Console

Use --preload to load pre-written commands and functions stored in a script file.

vim ~/geth-console-script.js
~/geth-console-script.js
function blockInfo() {
    var blockInfo;
    web3.eth.getBlock(eth.blockNumber, function(e, r) { blockInfo = r; });
    return blockInfo;
}

Check Geth details by attaching to the JavaScript console

geth-attach

Geth JavaScript console commands.

eth.syncing
net.peerCount

Last updated