Omar Metwally, MD University of California, San Francisco Distributed Data Sharing Hyperledger (DDASH). ============================================= Github repository ----------------- Project website -----------------
How to create a private Ethereum Network, Part Deux
By: Omar Metwally, MD
Background and Prerequisites: This tutorial picks up where part one (“How to create a private Ethereum network”) left off.
Numerous people have asked me how to connect 3+ nodes in a private network after reading my previous tutorial. There are scripts out there that will pseudo-automate the process, but I believe in understanding the fundamentals and building it yourself from the ground-up without obfuscating layers between you and your network. Many people got hung up on obtaining a machine’s enode address (basically your Ethereum client’s public key) using the bootnode application. Depending on which machine you’re running and how you installed geth (the Go Ethereum client), chances are you don’t have bootnode installed. I realized that most people out there are not running Linux machines and therefore are getting stuck here.
The good news is that creating a network with any number of peers is possible without having to install bootnode.
A crucially important difference between private Ethereum networks and the main Ethereum network
is that, unlike the main Ethereum network (where real money is used to power the Ethereum supercomputer, create contracts, and move money around the network), private Ethereum networks do not automatically let anyone join the network. In a private network, each peer must identify all other peers to which it wants to connect. In networking parlance, a node becomes a peer when it connects to a fellow node.
Nodes are identified via enode addresses, which are basically public keys.
To illustrate how to create a private network with 3+ nodes, I’ll use the private blackswan network I created to run one of our projects, called DDASH (Distributed Data Sharing Hyperledger). You’re welcome to follow along and join the blackswan network or take notes and create your own private network.
Step 1: Create a genesis block
All peers must use the exact same genesis block specified by genesis.json:
/Users/omarmetwally/Desktop/blackswan/genesis.json
For more information about the contents of this file, see my previous tutorial.
The exactly location of the genesis.json file will probably differ on your machine, depending on your operating system and how you installed geth.
Step 2: Clear old chain data
This will allow you to start from a blank slate and is necessary whenever you change the genesis block because you can’t merge two chains with different genesis blocks.
rm -r /Users/omarmetwally/Desktop/blackswan/data/geth
Step 3: Reinitialize the genesis block
Again, this needs to be done on each node.
geth --datadir=/Users/omarmetwally/Desktop/blackswan/data init /Users/omarmetwally/Desktop/blackswan/genesis.json
Step 4: Discover each node’s enode address
To create a private network, each machine needs to know every other machine’s address.
geth --verbosity 1 --datadir=/Users/omarmetwally/blackswan/data console
Then type in:
> admin.nodeInfo
Copy the enode address, including quotation marks. It will look something like this (without the ellipsis):
"enode://0f2a26.....730c"
Step 5: Create the static-nodes.json file on each node
This step is critical and a common point of failure for many people creating a private Ethereum network. This file identifies other network peers using their enode addresses. Create a file called static-nodes.json in the local geth data directory of each node, and paste the enode of every peer in your private network, such that it looks something like:
[ "enode://164c8...cf3eb815a7@12.167.347.338:30303", "enode://c49d9...7343bac665@104.236.141.200:30303" ]
Note the quotation marks, the commas, and the format: enode@ip_address:port.
Save this file as static-nodes.json in your local geth data directory, which in my case is:
/Users/omarmetwally/Desktop/blackswan/data/static-nodes.json
Step 6: Launch your private network.
Run this command on each node
geth --verbosity 2 --datadir=/Users/omarmetwally/Desktop/blackswan/data --networkid 4828 --port 30303 --rpc -rpcport 8545 --etherbase "0xYourEthereumAddress" console
The flags in the above command are important.
networkid
The blackswan network id is 4828, but your own private network will contain its own identifying network id which you should create to be unique.
verbosity
How much information geth will spew, which can help with troubleshooting or be too much unnecessary information cluttering your screen.
datadir
This must correspond to your own local geth data directory. You will not get a helpful error message if this does not correspond to a real directory on your machine, so be careful here.
etherbase
This is your Ethereum address on the private network.
rpcport and port
The port and rpcport flags are networking parameters which I will not get into here. Make sure that your firewall will not block the ports you’re trying to use, and be careful when opening your machine to the outside world. Be very careful when exposing the RPC API to the outside world to prevent theft of real Ether and loss of real money! Any real Ether you might own should be kept completely separate from your development environment.
Step 7: Mining on your private network
Mine Ether by running:
geth --verbosity 4 --datadir /Users/omarmetwally/Desktop/blackswan/data --networkid 4828 --port 30303 --etherbase "0xYourEthereumAddress" --mine --minerthreads=1
Then open a new Terminal window (if you’re using a Mac) or new Terminal tab (Ctrl-tab) and check your balance:
geth attach /Users/omarmetwally/Desktop/blackswan/data/geth.ipc console
> web3.eth.getBalance(web3.eth.accounts[0])
You should see your account balance increase fairly quickly as you mine.
Acknowledgements
Royd Carlson’s (UC Berkeley) feedback was instrumental in conceiving this article. The comments and emails I receive from readers of this blog help make these articles relevant to the Ethereum community .
Knowledge is power, and my goal is to empower the readers of this blog with the information necessary to create blockchain applications with the potential to re-program institutions, level playing fields, and take a huge step toward more democratic societies. I’m humbled to welcome visitors to this blog, especially from nations where access to and dissemination of knowledge is much more difficult than we sometimes take for granted in the Western world.
“…the poor catch up with the rich to the extent that they achieve the same level of technological know-how, skill, and education, not by becoming the property of the wealthy.” (Thomas Piketty, Capital in the Twenty-First Century)