Blockchain, Part II: Configuring a Blockchain Network and Leveraging the Technology
How to set up a private ethereum blockchain using open-source tools and a look at some markets and industries where blockchain technologies can add value.
In Part I, I spent quite a bit of time exploring cryptocurrency and the mechanism that makes it possible: the blockchain. I covered details on how the blockchain works and why it is so secure and powerful. In this second part, I describe how to set up and configure your very own private ethereum blockchain using open-source tools. I also look at where this technology can bring some value or help redefine how people transact across a more open web.
Setting Up Your Very Own Private Blockchain NetworkIn this section, I explore the mechanics of an ethereum-based blockchain network—specifically, how to create a private ethereum blockchain, a private network to host and share this blockchain, an account, and then how to do some interesting things with the blockchain.
What is ethereum, again? Ethereum is an open-source and public blockchain platform featuring smart contract (that is, scripting) functionality. It is similar to bitcoin but differs in that it extends beyond monetary transactions.
Smart contracts are written in programming languages, such as Solidity (similar to C and JavaScript), Serpent (similar to Python), LLL (a Lisp-like language) and Mutan (Go-based). Smart contracts are compiled into EVM (see below) bytecode and deployed across the ethereum blockchain for execution. Smart contracts help in the exchange of money, property, shares or anything of value, and it does so in a transparent and conflict-free way avoiding the traditional middleman.
If you recall from Part I, a typical layout for any blockchain is one where all nodes are connected to every other node, creating a mesh. In the world of ethereum, these nodes are referred to as Ethereum Virtual Machines (EVMs), and each EVM will host a copy of the entire blockchain. Each EVM also will compete to mine the next block or validate a transaction. Once the new block is appended to the blockchain, the updates are propagated to the entire network, so that each node is synchronized.
In order to become an EVM node on an ethereum network, you'll need to download and install the proper software. To accomplish this, you'll be using Geth (Go Ethereum). Geth is the official Go implementation of the ethereum protocol. It is one of three such implementations; the other two are written in C++ and Python. These open-source software packages are licensed under the GNU Lesser General Public License (LGPL) version 3. The standalone Geth client packages for all supported operating systems and architectures, including Linux, are available here. The source code for the package is hosted on GitHub.
Geth is a command-line interface (CLI) tool that's used to communicate with the ethereum network. It's designed to act as a link between your computer and all other nodes across the ethereum network. When a block is being mined by another node on the network, your Geth installation will be notified of the update and then pass the information along to update your local copy of the blockchain. With the Geth utility, you'll be able to mine ether (similar to bitcoin but the cryptocurrency of the ethereum network), transfer funds between two addresses, create smart contracts and more.
Download and InstallationIn my examples here, I'm configuring this ethereum blockchain on the latest LTS release of Ubuntu. Note that the tools themselves are not restricted to this distribution or release.
Downloading and Installing the Binary from the Project Website
Download the latest stable release, extract it and copy it to a proper directory:
$ wget https://gethstore.blob.core.windows.net/builds/
↪geth-linux-amd64-1.7.3-4bb3c89d.tar.gz
$ tar xzf geth-linux-amd64-1.7.3-4bb3c89d.tar.gz
$ cd geth-linux-amd64-1.7.3-4bb3c89d/
$ sudo cp geth /usr/bin/
Building from Source Code
If you are building from source code, you need to install both Go and C compilers:
$ sudo apt-get install -y build-essential golang
Change into the directory and do:
$ make geth
Installing from a Public Repository
If you are running on Ubuntu and decide to install the package from a public repository, run the following commands:
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
Getting Started
Here is the thing, you don't have any ether to start with. With that in mind, let's limit this deployment to a "private" blockchain network that will sort of run as a development or staging version of the main ethereum network. From a functionality standpoint, this private network will be identical to the main blockchain, with the exception that all transactions and smart contracts deployed on this network will be accessible only to the nodes connected in this private network. Geth will aid in this private or "testnet" setup. Using the tool, you'll be able to do everything the ethereum platform advertises, without needing real ether.
Remember, the blockchain is nothing more than a digital and public ledger preserving transactions in their chronological order. When new transactions are verified and configured into a block, the block is then appended to the chain, which is then distributed across the network. Every node on that network will update its local copy of the chain to the latest copy. But you need to start from some point—a beginning or a genesis. Every blockchain starts with a genesis block, that is, a block "zero" or the very first block of the chain. It will be the only block without a predecessor. To create your private blockchain, you need to create this genesis block. To do this, you need to create a custom genesis file and then tell Geth to use that file to create your own genesis block.
Create a directory path to host all of your ethereum-related data and configurations and change into the config subdirectory:
$ mkdir ~/eth-evm
$ cd ~/eth-evm
$ mkdir config data
$ cd config
Open your preferred text editor and save the following contents to a file named Genesis.json in that same directory:
{
"config": {
"chainId": 999,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x400",
"gasLimit": "0x8000000",
"alloc": {}
}
This is what your genesis file will look like. This simple JSON-formatted string describes the following:
config
— this block defines the settings for your custom chain.chainId
— this identifies your Blockchain, and because the main ethereum network has its own, you need to configure your own unique value for your private chain.homesteadBlock
— defines the version and protocol of the ethereum platform.eip155Block / eip158Block
— these fields add support for non-backward-compatible protocol changes to the Homestead version used. For the purposes of this example, you won't be leveraging these, so they are set to "0".difficulty
— this value controls block generation time of the blockchain. The higher the value, the more calculations a miner must perform to discover a valid block. Because this example is simply deploying a test network, let's keep this value low to reduce wait times.gasLimit
— gas is ethereum's fuel spent during transactions. As you do not want to be limited in your tests, keep this value high.alloc
— this section prefunds accounts, but because you'll be mining your ether locally, you don't need this option.
Now it's time to instantiate the data directory. Open a terminal window, and assuming you have the Geth binary installed and that it's accessible via your working path, type the following:
$ geth --datadir /home/petros/eth-evm/data/PrivateBlockchain
↪init /home/petros/eth-evm/config/Genesis.json
WARN [02-10|15:11:41] No etherbase set and no accounts found
↪as default
INFO [02-10|15:11:41] Allocated cache and file handles
↪database=/home/petros/eth-evm/data/PrivateBlockchain/
↪geth/chaindata cache=16 handles=16
INFO [02-10|15:11:41] Writing custom genesis block
INFO [02-10|15:11:41] Successfully wrote genesis state
↪database=chaindata
hash=d1a12d...4c8725
INFO [02-10|15:11:41] Allocated cache and file handles
↪database=/home/petros/eth-evm/data/PrivateBlockchain/
↪geth/lightchaindata cache=16 handles=16
INFO [02-10|15:11:41] Writing custom genesis block
INFO [02-10|15:11:41] Successfully wrote genesis state
↪database=lightchaindata
The command will need to reference a working data directory to store your private chain data. Here, I have specified eth-evm/data/PrivateBlockchain subdirectories in my home directory. You'll also need to tell the utility to initialize using your genesis file.
This command populates your data directory with a tree of subdirectories and files:
$ ls -R /home/petros/eth-evm/
.:
config data
./config:
Genesis.json
./data:
PrivateBlockchain
./data/PrivateBlockchain:
geth keystore
./data/PrivateBlockchain/geth:
chaindata lightchaindata LOCK nodekey nodes transactions.rlp
./data/PrivateBlockchain/geth/chaindata:
000002.ldb 000003.log CURRENT LOCK LOG MANIFEST-000004
./data/PrivateBlockchain/geth/lightchaindata:
000001.log CURRENT LOCK LOG MANIFEST-000000
./data/PrivateBlockchain/geth/nodes:
000001.log CURRENT LOCK LOG MANIFEST-000000
./data/PrivateBlockchain/keystore:
Your private blockchain is now created. The next step involves starting the private network that will allow you to mine new blocks and have them added to your blockchain. To do this, type:
petros@ubuntu-evm1:~/eth-evm$ geth --datadir
↪/home/petros/eth-evm/data/PrivateBlockchain --networkid 9999
WARN [02-10|15:11:59] No etherbase set and no accounts found
↪as default
INFO [02-10|15:11:59] Starting peer-to-peer node
↪instance=Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.2
INFO [02-10|15:11:59] Allocated cache and file handles
↪database=/home/petros/eth-evm/data/PrivateBlockchain/
↪geth/chaindata cache=128 handles=1024
WARN [02-10|15:11:59] Upgrading database to use lookup entries
INFO [02-10|15:11:59] Initialised chain configuration
↪config="{ChainID: 999 Homestead: 0 DAO: <nil> DAOSupport:
↪false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil>
↪Engine: unknown}"
INFO [02-10|15:11:59] Disk storage enabled for ethash caches
↪dir=/home/petros/eth-evm/data/PrivateBlockchain/
↪geth/ethash count=3
INFO [02-10|15:11:59] Disk storage enabled for ethash DAGs
↪dir=/home/petros/.ethash count=2
INFO [02-10|15:11:59] Initialising Ethereum protocol
↪versions="[63 62]" network=9999
INFO [02-10|15:11:59] Database deduplication successful
↪deduped=0
INFO [02-10|15:11:59] Loaded most recent local header
↪number=0 hash=d1a12d...4c8725 td=1024
INFO [02-10|15:11:59] Loaded most recent local full block
↪number=0 hash=d1a12d...4c8725 td=1024
INFO [02-10|15:11:59] Loaded most recent local fast block
↪number=0 hash=d1a12d...4c8725 td=1024
INFO [02-10|15:11:59] Regenerated local transaction journal
↪transactions=0 accounts=0
INFO [02-10|15:11:59] Starting P2P networking
INFO [02-10|15:12:01] UDP listener up
↪self=enode://f51957cd4441f19d187f9601541d66dcbaf560
↪770d3da1db4e71ce5ba3ebc66e60ffe73c2ff01ae683be0527b77c0f96
↪a178e53b925968b7aea824796e36ad27@[::]:30303
INFO [02-10|15:12:01] IPC endpoint opened: /home/petros/eth-evm/
↪data/PrivateBlockchain/geth.ipc
INFO [02-10|15:12:01] RLPx listener up
↪self=enode://f51957cd4441f19d187f9601541d66dcbaf560
↪770d3da1db4e71ce5ba3ebc66e60ffe73c2ff01ae683be0527b77c0f96
↪a178e53b925968b7aea824796e36ad27@[::]:30303
Notice the use of the new parameter, networkid
. This
networkid
helps
ensure the privacy of your network. Any number can be used here. I
have decided to use 9999. Note that other peers joining your network
will need to use the same ID.
Your private network is now live! Remember, every time you need to access your private blockchain, you will need to use these last two commands with the exact same parameters (the Geth tool will not remember it for you):
$ geth --datadir /home/petros/eth-evm/data/PrivateBlockchain
↪init /home/petros/eth-evm/config/Genesis.json
$ geth --datadir /home/petros/eth-evm/data/PrivateBlockchain
↪--networkid 9999
Configuring a User Account
So, now that your private blockchain network is up and running, you can start interacting with it. But in order to do so, you need to attach to the running Geth process. Open a second terminal window. The following command will attach to the instance running in the first terminal window and bring you to a JavaScript console:
$ geth attach /home/petros/eth-evm/data/PrivateBlockchain/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.2
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0
↪personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
Time to create a new account that will manipulate the Blockchain network:
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x92619f0bf91c9a786b8e7570cc538995b163652d"
Remember this string. You'll need it shortly. If you forget this hexadecimal string, you can reprint it to the console by typing:
> eth.coinbase
"0x92619f0bf91c9a786b8e7570cc538995b163652d"
Check your ether balance by typing the following script:
> eth.getBalance("0x92619f0bf91c9a786b8e7570cc538995b163652d")
0
Here's another way to check your balance without needing to type the entire hexadecimal string:
> eth.getBalance(eth.coinbase)
0
Mining
Doing real mining in the main ethereum blockchain requires some very specialized hardware, such as dedicated Graphics Processing Units (GPU), like the ones found on the high-end graphics cards mentioned in Part I. However, since you're mining for blocks on a private chain with a low difficulty level, you can do without that requirement. To begin mining, run the following script on the JavaScript console:
> miner.start()
null
Updates in the First Terminal Window
You'll observe mining activity in the output logs displayed in the first terminal window:
INFO [02-10|15:14:47] Updated mining threads
↪threads=0
INFO [02-10|15:14:47] Transaction pool price threshold
↪updated price=18000000000
INFO [02-10|15:14:47] Starting mining operation
INFO [02-10|15:14:47] Commit new mining work
↪number=1 txs=0 uncles=0 elapsed=186.855us
INFO [02-10|15:14:57] Generating DAG in progress
↪epoch=1 percentage=0 elapsed=7.083s
INFO [02-10|15:14:59] Successfully sealed new block
↪number=1 hash=c81539...dc9691
INFO [02-10|15:14:59] mined potential block
↪number=1 hash=c81539...dc9691
INFO [02-10|15:14:59] Commit new mining work
↪number=2 txs=0 uncles=0 elapsed=211.208us
INFO [02-10|15:15:04] Generating DAG in progress
↪epoch=1 percentage=1 elapsed=13.690s
INFO [02-10|15:15:06] Successfully sealed new block
↪number=2 hash=d26dda...e3b26c
INFO [02-10|15:15:06] mined potential block
↪number=2 hash=d26dda...e3b26c
INFO [02-10|15:15:06] Commit new mining work
↪number=3 txs=0 uncles=0 elapsed=510.357us
[ ... ]
INFO [02-10|15:15:52] Generating DAG in progress
↪epoch=1 percentage=8 elapsed=1m2.166s
INFO [02-10|15:15:55] Successfully sealed new block
↪number=15 hash=d7979f...e89610
INFO [02-10|15:15:55] block reached canonical chain
↪number=10 hash=aedd46...913b66
INFO [02-10|15:15:55] mined potential block
↪number=15 hash=d7979f...e89610
INFO [02-10|15:15:55] Commit new mining work
↪number=16 txs=0 uncles=0 elapsed=105.111us
INFO [02-10|15:15:57] Successfully sealed new block
↪number=16 hash=61cf68...b16bf2
INFO [02-10|15:15:57] block reached canonical chain
↪number=11 hash=6b89ff...de8f88
INFO [02-10|15:15:57] mined potential block
↪number=16 hash=61cf68...b16bf2
INFO [02-10|15:15:57] Commit new mining work
↪number=17 txs=0 uncles=0 elapsed=147.31us
Back to the Second Terminal Window
Wait 10–20 seconds, and on the JavaScript console, start checking your balance:
> eth.getBalance(eth.coinbase)
10000000000000000000
Wait some more, and list it again:
> eth.getBalance(eth.coinbase)
75000000000000000000
Remember, this is fake ether, so don't open that bottle of champagne, yet. You are unable to use this ether in the main ethereum network.
To stop the miner, invoke the following script:
> miner.stop()
true
Well, you did it. You created your own private blockchain and mined some ether.
Who Will Benefit from This Technology Today and in the Future?Although the blockchain originally was developed around cryptocurrency (more specifically, bitcoin), its uses don't end there. Today, it may seem like that's the case, but there are untapped industries and markets where blockchain technologies can redefine how transactions are processed. The following are some examples that come to mind.
Improving Smart Contracts
Ethereum, the same open-source blockchain project deployed earlier, already is doing the whole smart-contract thing, but the idea is still in its infancy, and as it matures, it will evolve to meet consumer demands. There's plenty of room for growth in this area. It probably and eventually will creep into governance of companies (such as verifying digital assets, equity and so on), trading stocks, handling intellectual property and managing property ownership, such as land title registration.
Enabling Market Places and Shared Economies
Think of eBay but refocused to be peer-to-peer. This would mean no more transaction fees, but it also will emphasize the importance of your personal reputation, since there will be no single body governing the market in which goods or services are being traded or exchanged.
Crowdfunding
Following in the same direction as my previous remarks about a decentralized marketplace, there also are opportunities for individuals or companies to raise the capital necessary to help "kickstart" their initiatives. Think of a more open and global Kickstarter or GoFundMe.
Multimedia Sharing or Hosting
A peer-to-peer network for aspiring or established musicians definitely could go a long way here—one where the content will reach its intended audiences directly and also avoid those hefty royalty costs paid out to the studios, record labels and content distributors. The same applies to video and image content.
File Storage and Data Management
By enabling a global peer-to-peer network, blockchain technology takes cloud computing to a whole new level. As the technology continues to push itself into existing cloud service markets, it will challenge traditional vendors, including Amazon AWS and even Dropbox and others—and it will do so at a fraction of the price. For example, cold storage data offerings are a multi-hundred billion dollar market today. By distributing your encrypted archives across a global and decentralized network, the need to maintain local data-center equipment by a single entity is reduced significantly.
Social media and how your posted content is managed would change under this model as well. Under the blockchain, Facebook or Twitter or anyone else cannot lay claim to what you choose to share.
Another added benefit to leveraging blockchain here is making use of the cryptography securing your valuable data from getting hacked or lost.
Internet of Things
What is the Internet of Things (IoT)? It is a broad term describing the networked management of very specific electronic devices, which include heating and cooling thermostats, lights, garage doors and more. Using a combination of software, sensors and networking facilities, people can easily enable an environment where they can automate and monitor home and/or business equipment.
Supply Chain Audits
With a distributed public ledger made available to consumers, retailers can't falsify claims made against their products. Consumers will have the ability to verify their sources, be it food, jewelry or anything else.
Identity Management
There isn't much to explain here. The threat is very real. Identity theft never takes a day off. The dated user name/password systems of today have run their course, and it's about time that existing authentication frameworks leverage the cryptographic capabilities offered by the blockchain.
SummaryThis revolutionary technology has enabled organizations in ways that weren't possible a decade ago. Its possibilities are enormous, and it seems that any industry dealing with some sort of transaction-based model will be disrupted by the technology. It's only a matter of time until it happens.
Now, what will the future for blockchain look like? At this stage, it's difficult to say. One thing is for certain though; large companies, such as IBM, are investing big into the technology and building their own blockchain infrastructure that can be sold to and used by corporate enterprises and financial institutions. This may create some issues, however. As these large companies build their blockchain infrastructures, they will file for patents to protect their technologies. And with those patents in their arsenal, there exists the possibility that they may move aggressively against the competition in an attempt to discredit them and their value.
Anyway, if you will excuse me, I need to go make some crypto-coin.