Software Development

Set up private blockchain with Ethereum (part 1)

I don’t think it needs introduction about the current hype that is going on with Blockchain, bitcoin, Ethereum and other initiatives. To get more feeling about what it is and how it works I decided to have a go with Ethereum as it promises to be a possible disruptive solution for lots of different use cases. Without going into the theoretical background of Blockchain or Ethereum (there are already lots of docs written about it) this post will focus on how I set up a private Ethereum network on my MacBook. I will use Docker containers as Ethereum nodes and use Mist browser on my Mac to ‘connect’ to the private network.

Please note that this is just a possible setup that works for me. There might be better/easier alternatives for other use cases.

I perform the following steps to create a private Ethereum network:

    • Set up infrastructure
      • create directory to keep your Dockerfile sources and Ethereum data

I created a directory called ‘myether’. In this directory I created two subdirectories: ‘datadir1’ and ‘datadir2’.

      • create ‘mygenesis.json’ file

To setup a new Ethereum network I use the file ‘mygenesis.json’ to initiate a new block chain. This file will be used for input of the first block in the chain. To read more about it see here.
Here is the content of my file which I created in my new directory created in the previous step:

{
  "alloc": {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "config":{
    "chainId": 13 
  }
}
      • create Dockerfile

Also in the new directory I created a ‘Dockerfile’ that will initiate a Ubuntu image and start installing Ethereum and necessary dependencies on it.
The file contains the following content:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y software-properties-common net-tools
RUN add-apt-repository -y ppa:ethereum/ethereum && apt-get update
RUN apt-get -y install ethereum
ADD ./mygenesis.json /root/mygenesis.json
EXPOSE 8545 8546 30303 30303/udp
RUN mkdir -p /root/datadir
ENTRYPOINT "bash"

The complete folder structure on my MacBook now looks like this:

      • create Docker image

With the Dockerfile and genesis file in place I can create the Docker image by running:
docker build -t pascalalma/my-ether-node .
The output is like this:

      • start first node

With the image created I can start my first node. I need to open up some ports and will use a custom data directory for my node (to keep data between runs of the Docker container). The command to start the first node is:
docker run -it -p 8545:8545 -p 30303:30303 -v /Users/pascalalma/develop/myether/datadir1:/root/datadir pascalalma/my-ether-node /bin/bash

      • start second node

In another Terminal I run the following command:
docker run -it -p 8546:8545 -p 30304:30303 -v /Users/pascalalma/develop/myether/datadir2:/root/datadir pascalalma/my-ether-node /bin/bash

      • note IP address of first node

I wrote down the IP address of the Docker container of node1 so I can use it later to connect node2 with node1. I ran the command ‘ifconfig eth0’ like this:

So in this example the IP to note is ‘172.17.0.2’.

    • initiate private network

Now I have two Linux nodes running on my MacBook. Next I initiate a new blockchain with ‘geth‘. On both nodes I run the following command:
geth --datadir=/root/datadir/ init /root/mygenesis.json
The output looks like this:

The initial block is created (block chain is set up) and I am ready for the next step.

    • start private network

With the initial block created I can start the block chain by running ‘geth’ on both nodes and point node2 to the node1 address.

      • start geth on node1

I run the following command to start ‘geth’ on node1:
geth --datadir /root/datadir/ --networkid 1234 --port 30303 --rpcport 8545 --rpc --rpcapi eth,web3,personal,net --rpcaddr 0.0.0.0 console

      • start geth on node2

I run the same command to start ‘geth’ on node2:
geth --datadir /root/datadir/ --networkid 1234 --port 30303 --rpcport 8545 -rpc --rpcapi eth,web3,personal,net --rpcaddr 0.0.0.0 console

      • connect node2 to private network of node1

To get the address of node1 run the following command on node1 in the geth console:
'admin.nodeInfo.enode' like this:

> admin.nodeInfo.enode
"enode://8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4447e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9@[::]:30303"

The output is the address of node1 in enode-url-format.
Now I run the following command on node2:

admin.addPeer("enode://8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4f77e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9@172.17.0.2:30303")

Where the ‘enode’ string is the one returned in the previous command and the IP address is the IP noted earlier for node1.
The result of the command should be ‘true’.
To check the connection is created between node1 and node2 I run:
net.peerCount
which should return ‘1’
or I can run admin.peers which should return something like:

>> admin.peers
[{
    caps: ["eth/63"],
    id: "8fd1e8b6941cd96030580082cabd0758cf274ac7a74493c942120191b4447e49489e3961eb55ce666db172e2fe177ef9bf03f1685d4d81afb364ab9b5ed4aec9",
    name: "Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9",
    network: {
      localAddress: "172.17.0.3:37666",
      remoteAddress: "172.17.0.2:30303"
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
        version: 63
      }
    }
}]

Summary

So now I have a private Ethereum network consisting of two nodes. In the next post I will show you how to use ‘geth’ console at one of the nodes to create accounts and do some mining to create ether for the account. I will also show how to connect your Mist browser to this private network. Stay tuned!

Published on Java Code Geeks with permission by Pascal Alma, partner at our JCG program. See the original article here: Set up private blockchain with Ethereum (part 1)

Opinions expressed by Java Code Geeks contributors are their own.

Pascal Alma

Pascal is a senior JEE Developer and Architect at 4Synergy in The Netherlands. Pascal has been designing and building J2EE applications since 2001. He is particularly interested in Open Source toolstack (Mule, Spring Framework, JBoss) and technologies like Web Services, SOA and Cloud technologies. Specialties: JEE, SOA, Mule ESB, Maven, Cloud Technology, Amazon AWS.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button