今年度からtdiは、今世間で大注目の「ブロックチェーン」への取り組みをスタートしました!
この記事連載では、その取り組みのため、書籍やWebの情報を参考に、私がブロックチェーンについて実際にやってみたことをまとめていきます。そして、最終的にはブロックチェーンの特徴を活かしたアプリケーションをつくりたいな、と思っています。
さて、ブロックチェーンを始めるには、まず環境づくり!ということで、今回のテーマは「ブロックチェーンのプライベートネットワーク環境を構築する手順」です。
そもそもブロックチェーンとは?
本題に入る前に、ブロックチェーンとはなんぞや?について、簡単に復習しておきたいと思います。
ブロックチェーンは、ビットコインを支える基盤技術であり、「取引の記録(トランザクション)」をまとめた「ブロック」を「チェーン(鎖)」のように順次追加していく仕組みです。ブロックチェーンネットワークに参加する全ての人が、全ての取引記録を記載した台帳を所有する「分散型台帳」技術である、というのが大きな特徴です。
ブロックチェーンのスゴイところをざっくりまとめると、以下3点になります。
- 改ざんが難しい
特定のブロックを改ざんしたとしても、結局全てのブロックを芋づる式に作り直す必要があり、実質改ざんは不可能 - 頑強な破壊耐性
全てのネットワーク参加者(ノード)が取引記録を保管しているため、あるノードが攻撃・破壊されたとしても、その他のノードが生き残っている限り、ブロックチェーンが消滅することはない - 信頼コストが低い
中央機関(例:銀行)が無いため、「信頼する」必要がない。その代わり、正当性をチェックする仕組み(コンセンサスアルゴリズム)が備わっている。
Gethでプライベートネットワークをつくる
さて、それでは本題に入りたいと思います。
今回は、ブロックチェーン基盤として「Ethereum」を採用し、プライベートネットワークをつくります。Ethereumには複数のクライアントが用意されていますが、今回はGoで書かれている「Geth」(Go-Ethereum)というクライアントを使用します。(Gethはゲスと読みます。ゲス…!)
サーバの準備
準備したサーバのスペックは以下です。
- Ubuntu 16.04.3 LTS
- 2 vCPU
- メモリ4G
調べていると、どうやらOSはUbuntuが一般的なようです。
サーバはAWS(インスタンスタイプ:t2.medium)を使用することにしました。AWSであれば、サーバの準備も一瞬で出来ますし、いずれ分散環境を構築することになったときにも簡単にサーバを増やすことができます。また、個人的にこれまでUbuntuをインストールしたことがなかったのですが、AWSにはUbuntuのAMIが用意されているので、ハードルがそれほど高くないのもポイントです。
Gethの構築
コマンドは、基本的に全編root権限で実行します。まずは、Gitリポジトリからcloneし、ソースコードを取得します。
まずは、Gitリポジトリからcloneし、ソースコードを取得します。
1 |
# git clone https://github.com/ethereum/go-ethereum |
次に、コンパイラとGo言語をapt-getでインストールします。
1 2 |
# apt-get install -y build-essential libgmp3-dev # sudo apt-get install -y build-essential golang-1.7 |
このとき気をつけたいのがGo言語のバージョンです。
コマンドを「golang」(バージョン指定なし)としてインストールすると、デフォルトでv1.6がインストールされます。v1.6だと、この先のビルド実行時に「Goのバージョンは1.7以上じゃないとダメ!」と言われてしまいます。そうなると辛いです。
インストールができたら、/root/.profile を開き、ファイルの最後尾に以下の1行を追加してGoのパスを通します。
1 |
export PATH=$PATH:/usr/lib/go-1.7/bin |
Goのバージョンを確認し、きちんとパスが通っていればOKです。
1 2 |
# go version go version go1.7.6 linux/amd64 |
パスの確認ができたら、cloneしたソースをビルドします。また、apt-getコマンドでアップデートもしておきます。ちなみに、はじめにも書きましたが、root権限になっておかないと、makeコマンド実行時にシェルからGoへのパスが通らず苦戦します。(しました)
1 2 3 4 |
# make geth # apt-get update # apt-get upgrade |
これでインストールは完了です!
Gethをプライベートネットワークで立ち上げる
プライベートネットワーク用の各種データを格納するためのディレクトリを作成します。ディレクトリ名は任意です。
1 2 |
# cd /root # mkdir eth_private_net |
作成したディレクトリ配下にGenesisファイル(myGenesis.json)を作成します。Genesisファイルとは、0番目のブロック情報を定義したもので、プライベートネットワークを構築する際には必須です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "config": { "chainId" : 15, "homesteadBlock" : 0, "eip155Block" : 0, "eip158Block" : 0 }, "nonce": "0x0000000000000042", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x00", "gasLimit": "0x8000000", "difficulty": "0x4000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": {} } |
ちなみにこのGenesisファイル、書籍やネットで調べながら作ったのですが、書き方(設定値)が色々ありまして大変苦労しました…
プロパティの中でも一番気をつけたいのが「config」ブロックで、「homesteadBlock」を設定しないと後々(コントラクトを作成するところで)悪夢を見ます。(見ました)
次に、Genesisファイルをもとにブロックチェーンを初期化します。
1 |
# geth --datadir /root/eth_private_net init /root/eth_private_net/myGenesis.json |
初期化ができたら、Gethを起動してみましょう!
1 2 3 4 5 6 7 |
# geth --networkid "10" --nodiscover --datadir "/root/eth_private_net" console 2>> /root/eth_private_net/geth.log Welcome to the Geth JavaScript console! instance: Geth/v1.6.7-stable-ab5646c5/linux-amd64/go1.8.1 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 > |
コンソール画面になりました!
ちなみに、Gethを停止するときはプロセスをkillします。
1 2 3 4 |
# ps -ef | grep geth root 1898 1441 99 08:04 pts/0 00:05:30 geth --networkid 10 --nodiscover --datadir /root/eth_private_net --mine --minerthreads 1 --rpc root 1922 1441 0 08:09 pts/0 00:00:00 grep --color=auto geth # kill 1898 |
まとめ
これで、プライベートネットワークが構築できました!
今「もう一回構築しろ」と言われるとスイスイできるんですが、1番最初は色々躓いて辛かったです…大事なのは、「golangのバージョン」と「全編root権限でやる」という点だと思います。
複数の書籍やネットで調べながら試し、強く感じたのは、バージョンによる違いって大きい!ということです。参考にした書籍は、かなり最近書かれたものではありましたが、「書いてあるとおりにやってるのに出来ない!」ということが何度もあって、心が折れそうになりました。(折れなくてよかった)
次は、マイニングや送金について書きたいと思っています!
参考書籍
私は以下の2冊でブロックチェーンの基礎を学びました!ブロックチェーンの詳細については、ぜひこちらの書籍をご参考ください。
執筆者プロフィール
- 社内の開発プロジェクトの技術支援や、新技術の検証に従事しています。主にアプリケーション開発系支援担当で、Java&サーバサイドが得意です。最近は、サーバーレスonAWSを推進しています。