Setting up an Ethereum private network is a powerful way to experiment with blockchain technology, test smart contracts, and simulate decentralized applications (DApps) in a controlled environment. Whether you're a developer, student, or blockchain enthusiast, building your own private chain gives you full control over network parameters, consensus mechanisms, and account management—without affecting the main Ethereum network.
This guide walks you through setting up an Ethereum private network on both Ubuntu and Windows, covering node configuration, account creation, mining, transactions, and smart contract deployment—all using geth, the official Go implementation of Ethereum.
Core Keywords
- Ethereum private network
- Geth setup
- Genesis block configuration
- Smart contract deployment
- Blockchain mining
- Account management
- Local blockchain testing
- Node initialization
Setting Up Ethereum on Ubuntu
Environment Preparation
Before installing Ethereum, ensure your Ubuntu system is up to date. Open a terminal and run:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereumThese commands install the latest version of geth, the command-line interface for running an Ethereum node.
👉 Learn how blockchain networks power next-generation applications.
Alternatively, you can compile from source:
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make gethTo make geth accessible globally, add it to your PATH:
export GETH="$GOPATH/src/github.com/ethereum/go-ethereum/build/bin"
export PATH="$PATH:$GETH"Add these lines to ~/.bashrc and reload with source ~/.bashrc.
Verify installation by running:
geth -hIf help documentation appears, your setup is successful.
Initializing Your Private Network
Step 1: Create a Genesis Block
The genesis block defines the initial state of your blockchain. Create a file named genesis.json:
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x40000",
"gasLimit": "0xffffffff",
"alloc": {}
}This minimal configuration sets a custom chain ID (15), low difficulty for easy local mining, and no pre-allocated funds.
Initialize the blockchain:
geth --datadir data init genesis.jsonThis creates a data directory (data) containing the blockchain state.
Step 2: Launch the Node
Start your private node with:
geth --datadir data --networkid 20140628 --rpc --rpccorsdomain "*" --nodiscover --port 16333 --rpcport 8546 consoleKey flags explained:
--networkid: Unique identifier for your private network.--rpc: Enables JSON-RPC interface.--rpccorsdomain "*": Allows cross-origin requests (use cautiously in production).--nodiscover: Prevents public discovery of your node.--console: Enters interactive JavaScript console.
You're now inside the geth console—ready to interact with your chain.
Managing Accounts and Mining
Create a New Account
In the console:
personal.newAccount("your-password")Replace "your-password" with a secure passphrase. The output will be your wallet address.
Check all accounts:
eth.accountsStart Mining
Mining rewards are sent to the coinbase account (default: first account). Set it explicitly:
miner.setEtherbase(eth.accounts[0])Begin mining with one CPU thread:
miner.start(1)You’ll see a hammer emoji (🔨) indicating active mining. Stop with:
miner.stop()Check Balances
After mining a few blocks, check your balance:
web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")Each mined block rewards 5 ETH, so mining three blocks yields ~15 ETH.
Sending Transactions
Unlock the sender account:
personal.unlockAccount(eth.accounts[0], "your-password")Send funds:
eth.sendTransaction({
from: eth.accounts[0],
to: eth.accounts[1],
value: web3.toWei(1, "ether")
})👉 Discover how real-world DApps use private chains for secure testing.
If no mining is active, the transaction stays in the pending pool. Confirm it by restarting the miner:
miner.start(1); admin.sleepBlocks(1); miner.stop();Verify receipt:
web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")Windows Setup Guide
Install Geth and Wallet
- Download
gethfrom the official Go-Ethereum repository. - Extract to
D:\Eth. - Create a folder
privatechain\node1for node data.
Initialize the Chain
Place your genesis.json in D:\Eth, then run:
geth --datadir "%cd%\privatechain\node1" init genesis.jsonLaunch the node:
geth --datadir "%cd%\privatechain\node1" --rpc --rpcport "8101" --port "30301" --networkid 2020 --mine --unlock 0 --password password.txt --rpcapi "eth,web3,personal" console⚠️ Store passwords securely. Use a password.txt file instead of passing plaintext.Deploying Smart Contracts Locally
Smart contracts are essential for DApp functionality. Here's a basic ERC-20-like token contract:
pragma solidity ^0.4.18;
contract Token {
mapping (address => uint) public balancesOf;
address public owner;
function Token() public {
owner = msg.sender;
balancesOf[msg.sender] = 10000;
}
function transfer(address _to, uint _value) public {
require(balancesOf[msg.sender] >= _value);
balancesOf[msg.sender] -= _value;
balancesOf[_to] += _value;
}
}Compile and Deploy
Use Remix IDE or command-line tools to compile this Solidity code into bytecode and ABI.
In the geth console:
var bytecode = "0x..."
var contract = eth.contract(ABI)
var deployed = contract.new({from: eth.accounts[0], data: bytecode, gas: 1000000})After deployment, mine a block to confirm:
miner.start(1); admin.sleepBlocks(1); miner.stop();Interact with functions like transfer() via the contract instance.
Frequently Asked Questions (FAQ)
Q: What is a genesis block?
A: The genesis block is the first block in a blockchain. It defines initial settings like difficulty, gas limit, and pre-funded accounts. Every node in your private network must use the same genesis file.
Q: Why isn’t my transaction confirmed?
A: Transactions require mining to be included in a block. If miner.start() isn’t running, transactions remain pending in the transaction pool (txpool.status).
Q: Can I connect multiple nodes?
A: Yes! Ensure all nodes share the same networkid and genesis configuration. Use admin.addPeer() to manually connect nodes via enode URLs.
Q: Is mining necessary on a private chain?
A: Yes—for proof-of-work chains. Mining validates transactions and creates new blocks. Alternatively, consider proof-of-authority (PoA) networks like Clique for faster consensus.
Q: How do I reset my private chain?
A: Delete the --datadir folder (e.g., data/ or privatechain/) and reinitialize with geth init genesis.json.
Q: Are there alternatives to geth?
A: Yes—clients like OpenEthereum (formerly Parity) or Besu support private networks. However, geth remains the most widely used and documented option.
Final Notes
Running an Ethereum private network empowers developers to safely prototype DApps, debug smart contracts, and simulate multi-node environments. With proper configuration, you can replicate mainnet behavior locally while avoiding gas costs and public exposure.
Whether you're on Ubuntu or Windows, mastering geth, account management, mining, and contract deployment lays the foundation for deeper blockchain development.
👉 Explore how leading platforms streamline blockchain integration.