A Jedi’s Guide to Ethereum — Part 2

Mark Mathis
5 min readDec 4, 2017

Summary

Obi-Wan and Yoda started learning about Ethereum in Part 1 of this series by doing the following:

  • Setup a Geth environment
  • Setup a Node on their respective home planets
  • Creating accounts on their respective Nodes

Lesson Goals

In this next lesson, they will learn how to:

  • Start their Nodes and connect them to each other
  • Mine their Nodes
  • Send Transactions to each other

Nodes

In the last lesson, Obi-Wan and Yoda accessed their Nodes with Geth but we didn’t really configure them at all other than to add an account to them. For Obi-Wan and Yoda to be able to send transactions to each other, we need to configure their Tatooine and Dagobah nodes to be Peers of each other. Remember, Ethereum is a Peer-To-Peer network — which means that individual nodes talk directly with each other, rather than going through a central server.

Dagobah

Back in the Dagobah system, Yoda can’t sleep so he decides to fire up his computer and begin the process of setting up his node.

geth --datadir "~/ethereum/dagobah" console 2>console.log

We need to check the specifics of this node so we can relay a couple connection parameters to Obi-Wan who has been pestering us for days.

> admin.nodeInfo
{
enode: "enode://bffe12a6809d1e6664c9fffe8c5193cdb4e9d70640b0fbd729e1a5fd57f612674450486b1444fcdf6e7f91f42df0bb0a6707f8ae6637ec9b756075a8767dcde2@[::]:30303",
id: "bffe12a6809d1e6664c9fffe8c5193cdb4e9d70640b0fbd729e1a5fd57f612674450486b1444fcdf6e7f91f42df0bb0a6707f8ae6637ec9b756075a8767dcde2",
ip: "::",
listenAddr: "[::]:30303",
name: "Geth/v1.7.0-stable-6c6c7b2a/darwin-amd64/go1.9",
ports: {
discovery: 30303,
listener: 30303
},
protocols: {
eth: {
difficulty: 40,
genesis: "0xdd3f8d61f38ebc195a6c9b0e5888e7e035f31ecd92e4427fb01176b984707d0d",
head: "0xdd3f8d61f38ebc195a6c9b0e5888e7e035f31ecd92e4427fb01176b984707d0d",
network: 1
}
}
}

There are a couple parameters in here that we need to alter and send to Ben Kenobi.

Network

This parameter needs to be changed to a unique network id and shared with Obi-Wan. In order for Dagobah and Tattoine to connect as peers, they must share the same network id.

We exit the Geth console and start it again using the following

geth --datadir "~/ethereum/dagobah" --networkid 5555 console 2>console.log

Check the network parameter with

> admin.nodeInfo

eNode

The enode parameter is a unique identifier for the dagobah node

"enode://bffe12a6809d1e6664c9fffe8c5193cdb4e9d70640b0fbd729e1a5fd57f612674450486b1444fcdf6e7f91f42df0bb0a6707f8ae6637ec9b756075a8767dcde2@[::]:30303"

Add Peer

We can’t run two nodes on the same port so we should specify a different one(30304). We hastily jot down a note to Obi-Wan:

Master Obi-Wan: I apologize for the delay in setting up my Ethereum Node, please start your node with the following command

geth --datadir "~/ethereum/tatooine" --networkid 5555 --port 30304 console 2>console.log

We then relay the eNode of Yoda’s dagobah instance and request that Obi-Wan add dagobah as a peer to tattooine with the following command.

admin.addPeer("enode://bffe12a6809d1e6664c9fffe8c5193cdb4e9d70640b0fbd729e1a5fd57f612674450486b1444fcdf6e7f91f42df0bb0a6707f8ae6637ec9b756075a8767dcde2@[::]:30303")

Once we have run this command, both the tatooine and dagobah nodes should be connected as peers. You can verify by running the following in both geth browsers.

> admin.nodeInfo

Geth

Go ahead and close out both geth instances. We are going to run them again but we are going to attach to them so we can keep our command environment separate from the process logs.

Daghobah

Startup the dagobah node in a new terminal window

geth --datadir "~/ethereum/dagobah" --networkid 5555

Create a tab in the same terminal and attach a geth console to the node

geth attach ~/ethereum/dagobah/geth.ipc

This console will be where you issue commands — the other tab will be your output log.

Tatooine

Do the same for the tatooine node

geth --datadir "~/ethereum/tatooine" --networkid 5555 --port 30304

Create a tab in the same terminal and attach a geth console to the node

geth attach ~/ethereum/tatooine/geth.ipc

Add the dagobah node as a peer using our attached geth terminal

admin.addPeer("enode://bffe12a6809d1e6664c9fffe8c5193cdb4e9d70640b0fbd729e1a5fd57f612674450486b1444fcdf6e7f91f42df0bb0a6707f8ae6637ec9b756075a8767dcde2@[::]:30303")

Mining Setup

In a private network, there has not been any ‘mined’ ethereum — we need to mine some in order to have some currency to send back and forth. You can think of mining as processing transactions which is key to a decentralized system such as ethereum. Luckily, Yoda has a blockchain with some unprocessed transactions in it that he can mine.

Generate DAG

Yoda starts his miner with a single thread(miner.start(1)from the dagobah node console

miner.start(1)

He sees the following happening in his debug console

INFO [12-04|15:29:34] Updated mining threads                   threads=1
INFO [12-04|15:29:34] Transaction pool price threshold updated price=18000000000
INFO [12-04|15:29:34] Starting mining operation
INFO [12-04|15:29:34] Commit new mining work number=1 txs=0 uncles=0 elapsed=260.768µs
INFO [12-04|15:29:37] Generating DAG in progress epoch=0 percentage=0 elapsed=1.830s
INFO [12-04|15:29:38] Generating DAG in progress epoch=0 percentage=1 elapsed=3.442s

The DAG is known as the Dagger Hashimoto, a data structure that gets created in order to keep our blockchain organized as we add things to it. This takes a while to create. Once it is created, it should start mining with output like this

INFO [12-04|15:40:30] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=262.202µs
INFO [12-04|15:41:11] Successfully sealed new block number=1 hash=9a8d13…1a67d6
INFO [12-04|15:41:11] 🔨 mined potential block number=1 hash=9a8d13…1a67d6
INFO [12-04|15:41:11] Commit new mining work number=2 txs=0 uncles=0 elapsed=6.714ms
INFO [12-04|15:41:12] Successfully sealed new block number=2 hash=d72cfc…8673ce
INFO [12-04|15:41:12] 🔨 mined potential block number=2 hash=d72cfc…8673ce

The above output indicates that two new blocks were mined on the dagobah node. On the other side of the galaxy, Obi-Wan notices that his tatooine node is spitting out some interesting logs as well

INFO [12-04|15:41:12] Block synchronisation started
INFO [12-04|15:41:12] Imported new state entries count=1 elapsed=45.047µs processed=1 pending=0 retry=0 duplicate=0 unexpected=0
WARN [12-04|15:41:13] Discarded bad propagated block number=1 hash=9a8d13…1a67d6
INFO [12-04|15:41:13] Imported new block headers count=2 elapsed=990.858ms number=2 hash=d72cfc…8673ce ignored=0
INFO [12-04|15:41:13] Imported new chain segment blocks=2 txs=0 mgas=0.000 elapsed=1.939ms mgasps=0.000 number=2 hash=d72cfc…8673ce

If you look at the timestamps on the dagobah and tattoine node outputs, you can see that the tatooine node picked up the mined blocks on the dagobah node in under a second. Pretty good! You should also verify that the block number on both nodes is the same — this is another way to see if the nodes are in sync.

> eth.blockNumber
248

This shows that our peer nodes are synced, but Obi-Wan is still anxiously awaiting his payment from Yoda.

Sending a Transaction

Since Yoda has been mining, he should have enough ETH to settle his bet with Obi-Wan. He checks it as follows

> eth.getBalance("0x0be3899c3e84e2015fe93788dee96b30fc48f0a6")
1.24e+21

Not bad… Yoda figures that he can seriously upgrade his lifestyle with this kind of coin. He then uses his jedi mind powers to ask Obi-Wan what his public address is for his account. Using this value, he pays Obi-Wan out his winnings for the bet. First, he unlocks his account using his address and password from Part 1.

> personal.unlockAccount("0x0be3899c3e84e2015fe93788dee96b30fc48f0a6","yoda")
true
> eth.sendTransaction({from: "0x0be3899c3e84e2015fe93788dee96b30fc48f0a6", to: "0x8d17ee6f8171a1d8cc26851213d5dc3b1f08cc40", value: web3.toWei(1000,"ether")})
"0x15fd06abc86c41cbf5e059cabe0b9c5353e2895b5361681be7948f44a7a6edb1"

After Yoda sends this, he notices the following in his console indicating that a transaction has been committed.

INFO [12-05|10:57:33] Submitted transaction                    fullhash=0x15fd06abc86c41cbf5e059cabe0b9c5353e2895b5361681be7948f44a7a6edb1 recipient=0x0be3899C3E84E2015fe93788dEE96b30fC48F0a6
INFO [12-05|11:00:13] Regenerated local transaction journal transactions=1 accounts=1

He is about to take a nap and dream of his new found fortunes, but he remembers that something has to mine the transaction for it to be propagated. He kicks off his miner

> miner.start(1)

He promptly sees the following and knows that the transaction has been processed

INFO [12-05|11:08:53] Commit new mining work                   number=249 txs=0 uncles=0 elapsed=345.777µs
INFO [12-05|11:08:57] Successfully sealed new block number=249 hash=11ee7c…f2d408
INFO [12-05|11:08:57] 🔨 mined potential block number=249 hash=11ee7c…f2d408

Across the Galaxy…

Obi-Wan is alerted by the force that he has been sent money and he checks his tatooine geth console.

> eth.getBalance("0x8d17ee6f8171a1d8cc26851213d5dc3b1f08cc40")
1000

Summary

We have done quite a bit in the past two articles… If you don’t understand everything, don’t worry — it is not simple stuff. Blockchain technology is the culmination of decades of computer science, mathematics, and cryptography and is still in its infancy. Congratulations on being part of the 1% of people that have a basic understanding of the concepts and practical application of Ethereum! In our next article, we will begin coding our first smart contract…

--

--