# Running an Ethereum Node: Lessons, Challenges and How I Overcame Them In my journey in mastering Ethereum, I learned about Ethereum node, which is a software application that implements Ethereum specification and communicates over the P2P network. To run a node on Ethereum, you have to run two piece of software at the same time. They are the consensus client, the software in charge of consensus protocol, and the execution client, the software that is in charge of receiving all the block transaction happening on the network. There are five main implementation for the execution clients written in four different languages. * Geth, written in Go * Nethermind, written in C# * Besu, written in Java * Erigon, written in Go * Reth, written in Rust And for the consensus client, we have: * Lighthouse, written in Rust * Lodestar, written in TypeScript * Nimbus, written in Nim * Prysm, written in Go * Teku, written in Java So for this experiment, I choose Geth for execution client and Prysm for consensu client. ***So here is the step by step procedure of how I was able to run a node on my local machine, the errors I encountered, and how I was able to overcome them.*** First I created a directory named ethereum-node1. Inside this directory, I created extra two directories named execution and consensus. ``` mkdir ethereum-node1 cd ethereum -node1 mkdir execution mkdir consensus ``` Then I proceeded to install Geth by building it from the source code. In the process, I encountered error because I don't have Go installed, and Geth is written in Go. So I went ahead to install the latest version of Go, v1.25.7 from [go.dev](https://go.dev) Then I cloned the Ethereum repo inside the execution directory using the command ``` cd execution git clone https://github.com/ethereum/go-ethereum.git ``` The clone was succesfully and I now had the ethereum repo in my local machine. The next step was to enter the downloaded folder and switched to version 1.14.3 using ``` cd go-ethereum git checkout v1.14.3 ``` Then I went ahead to build Geth from the downloaded source code. using the command: ``` make geth. ``` First, I encountered an error which was as a result of make package not installed. The error says *Command 'make' not found, but can be installed with: sudo apt install make # version 4.2.1-1.2, or sudo apt install make-guile # version 4.2.1-1.2* So, I proceeded to install the make package using the command ``` sudo apt update sudo apt install make ``` On the second attempt to build Geth, the command exited after sometime with an error. At first I didn't get what the error was all about but after careful observation and a little research, I realised the tutorial I was following was using older version of Go which is compatible with the version of source code they were using. On the otherhand, I was using the latest version of Go which is not compatible with the version of source code I was currently on. What I did was to switch to the latest version of the source code which is version 1.16.8 using the command ``` git checkout v1.16.8 ``` After putting these things in place, I succesfully built Geth. For the **Consensus** client using Prysm. First I switched to the consesus directory using ``` cd ../.. $ cd consensus ``` I didn't build Prysm from the souce code rather I downloaded the precompiled binary folder using the command ``` curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh ``` This command downloads the Prysm installation script for Ethereum, saves the content in a file named prysm.sh and makes it executable. **Generating JWT Secret** The JWT secret will enable the consensus and the execution client to communicate. Inside this JWT secret, there is a password that is used by both clients to authenticate connection. So to generate it, I went ahead to run the command ``` ./prysm.sh beacon-chain generate-auth-secret ``` The file was generated, and I moved it to the parent folder, which is the ethereum-node1 so both execution and consensus directory could communicate with it. **Running The Node** I first ran the execution client using the command ``` ./go-ethereum/build/bin/geth --mainnet \ --http \ --http.api eth,net,engine,admin,web3 \ --authrpc.jwtsecret=../jwt.hex ``` As it was runing, I proceeded to run the consensus client on another tab using the command ``` ./prysm.sh beacon-chain \ --execution-endpoint=http://localhost:8551 \ --mainnet \ --jwt-secret=../jwt.hex \ --checkpoint-sync-url=https://beaconstate.info \ --genesis-beacon-api-url=https://beaconstate.info ``` Each command was ran in the supposed directory. At the end of everything, I have my node syncing correctly. this is what my output for execution and consensus client looks like respectively. ![Screenshot from 2026-02-04 08-57-14](https://hackmd.io/_uploads/HyiYUmZwZg.png) ![Screenshot from 2026-02-04 08-57-23](https://hackmd.io/_uploads/Hyus8mbvbe.png) **Conclusion** This is one of those steps I have taken in the process of learning and mastering Ethereum. To be frank, some of those outputs and commands are still confusing, but, I am fullfiled that I was able to debug my errors and got my node up and running.