突然ですが、今回はOSS(オープンソースソフトウェア)のブロックチェーン基盤である「Hyperledger Fabricの導入」について解説したいと思います。
ブロックチェーンとは
ビットコインについては、誰しも聞いたことがあると思います。ビットコインを含む仮想通貨を実現するために使用されているテクノロジーが「ブロックチェーン」となります。
ブロックチェーンとはデータベースの一種ですが、データそのものを保持しているのではなく、処理内容をブロックと言われる形式で保持しています。
簡単な例で言うと、1000円の入金、2000円の支払い(処理内容)といった情報を保持し、残高(データ)自体は保持していません。
ブロックには、処理内容以外にも1つ前のブロックのハッシュ値を保持しており、ブロック間で前後関係ができています。この関係からブロックチェーンという名称が来ています。
この特徴はある時点の処理を改竄する際に、それ以降のブロックすべてを改竄しなければならないことを意味します。
1つのブロックチェーンの改竄であれば可能ですが、ブロックチェーンは実際には不特定多数が同じブロックチェーンを共有し互いに整合性の確認をしあっており、改竄はすぐに検知されてしまいます。
また、不特定多数で同じブロックチェーンを共有しているため、障害時の復旧も容易となっています。
高い耐改竄性、耐障害性がブロックチェーンの特徴です。
ブロックチェーンの使用例としてはビットコインを始めとする仮想通貨ですが、それ以外にも流通管理や企業間の取引等のシステムにも利用され始めています。
ブロックチェーンの種類には、ビットコインのように不特性多数がアクセスするパブリック型、特定の複数のみがアクセスするコンソーシアム型・プライベート型があります。
コンソーシアム型とプライペート型の違いは、前者が複数組織間、後者が同一組織内であるかどうかとなっています。
コンソーシアム型とプライベート型の用途は、金融機関等の組織間取引の記録などが挙げられます。
今回紹介するHyperledger Fabric は、コンソーシアム型のブロックチェーンとなり、複数組織間でブロックチェーンのネットワークを形成しています。
Hyperledger Fabric を使ってみよう
ブロックチェーンネットワークは通常複数のホスト間で形成されますが、構築が大変なので、今回はサンプルを動かすことを目的に、1ホスト内にHyperledger Fabricにおけるブロックチェーンネットワークを作成してみたいと思います。ホストOSにはCentOSを使用します。
ホストとして仮想環境でLinux(CentOS)を構築 vagrant + VirtualBoxを利用してwindows上にCentOSの仮想環境の構築を行います。
1. 仮想環境構築の準備
以下のサイトからvagrant と VIrtualBox をダウンロードしインストールしてください。
・vagrant
https://www.vagrantup.com/
・Virtual Box
https://www.virtualbox.org/
2. CentOSのインストール
vagrantとVirtual Box のインストールが完了したら次はCentOSの仮想環境の構築となります。
・centos7のイメージを取得する
windows上でコマンドプロンプトを開き次のコマンドを実行します。
vagrant box add centos/7
次のように表示されるので、virtualboxの3 を入力してください。
==> box: Loading metadata for box 'centos/7'
box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.
1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop
※確認※コマンドプロンプトで次のコマンドを実行。centos/7 が表示されれば大丈夫です。
vagrant box list
3. 仮想マシン作成
C:¥grant¥centos7 ディレクトリを作業ディレクトリとして仮想マシンを作成します。
・作業ディレクトリ初期化
コマンドプロンプトで次のコマンドを実行。
ディレクトリにVagrantfile が作成されます。
cd C:¥
mkdir vagrant¥centos7
cd vagrant¥centos7
vagrant init centos¥7
・サンプルアプリにアクセスできるようにポート設定を行います。Vagrantfile内に以下の設定を追加
config.vm.network "forwarded_port", guest: 3001, host: 3001
・仮想マシン初回起動作業ディレクトリ上で以下のコマンドを実行します。
初回起動が時間が掛かります。
vagrant up
4. 仮想マシンにログイン
作業ディレクトリ上で以下のコマンドを実行します。
vagrant ssh
他のツール(teratermやPuttyなど)でログインを行いたい場合は一度上記のコマンドでログイン後、以下の設定をお願いします。5. 他のツール(teratermやPuttyなど)でログインのための設定
・一度、vagrantの機能でログイン
vagrant ssh
・/etc/ssh/sshd_config を編集してパスワード認証を有効化する
vi /etc/ssh/sshd_config
編集内容
PasswordAuthentication no
↓
PasswordAuthentication yes
・サービス再起動PasswordAuthentication yes
sudo systemctl restart sshd
ユーザおよびパスワードはどちらもvagrantです。CentOS上にHyperledger Fabric 環境構築 以降の作業はすべてCentOS上で行います
1. dockerとdocker-composeをインストールする
hyperledgerFabricはdockerで配布されているため、dockerとdocker-composeをインストールします。
・docker インストール
CentOS上で次のコマンドを実行する
sudo yum -y install docker
・docker-composeをインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
・実行のためにユーザグループを追加
sudo groupadd docker
sudo gpasswd -a $USER docker
一度ログアウトしてからCentOSにログインします
ログアウトコマンド
exit
・dockerの自動起動設定
sudo systemctl enable docker
sudo systemctl start docker
2. HyperledgerFabricインストール
HyperledgerFabric のバージョンは1.14を使用します
次のコマンドを実行します。
curl -sSL http://bit.ly/2ysbOFE | bash -s
ブロックチェーンネットワーク起動
いよいよブロックチェーンネットワークの起動となります。ダウンロードした内容に含まれているサンプルネットワークの起動を行います。
1. SELinuxを無効化
SELinuxのセキュリティでそのままではネットワークを起動できないためSELinuxを無効化します
sudo vi /etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
CentOSをログアウト
exit
仮想マシンを再起動コマンドプロンプトで次のコマンドを実行しマシンを停止する
vagrant halt
起動する
vagrant up
CentOSにログインし、後続の作業を行う2. サンプルのブロックチェーンネットワークの起動
起動コマンド
cd fabric-samples/basic-network/
./start.sh
dockerコンテナの状態を確認する
docker ps --format '{{.Names}}'
以下が表示されていればネットワーク起動成功です
peer0.org1.example.com
couchdb
orderer.example.com
ca.example.com
ブロックチェーンのサンプルアプリで確認
ブロックチェーンネットワークが構築されたので、このネットワークを使用したサンプルアプリで実際にネットワークを使用してみましょうサンプルにはIBMのmarblesというサンプル用のアプリを使用します。
1. サンプルのために各種ツールをインストール
・GO言語のインストール
sudo yum install epel-release
sudo yum install -y golang
go version
・nvmインストールnvmをインストールしてサンプルを起動するためにnode.jsを使用できるようにします
git clone git://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
nvm install 6.2.0
nvm alias default lts/*
・ビルド用ツールインストール
sudo yum -y install make gcc gcc-c++ libtool
2. サンプルアプリのダウンロード
gitでサンプルをダウンロードします
git clone https://github.com/IBM-Blockchain/marbles.git --depth 1
marblesディレクトリが作成されます」3. サンプルのビルド
cd marbles
npm install gulp -g
npm install
4. チェーンコードのインストール
Hyperledger Fabricにはチェーンコードと呼ばれるブロックに対する更新を行うプログラムで行う機能が備わっています。
ブロックチェーンがどのような内容のデータを取り扱うかはチェーンコードによって決定づけられます。
ここでサンプルアプリ用のチェーンコードインストールすることで、構築したブロックチェーンが、
サンプルアプリのデータを取り扱うブロックチェーンとなります。
cd script
node install_chaincode.js
node instantiate_chaincode.js
起動5. サンプルの起動
cd ../
gulp marbles_local &
※簡単に動作確認※ブラウザで以下のURLにアクセスする
http://localhost:3001/home
Expressをクリックする。
玉を移動するとブロックが生成されているのが視覚的に解ります。
今回は、最小限の構成(単一のノード)でのブロックチェーンネットワークを構成しました。
実はこの状態では、ブロックチェーンとしての役割は果たしていません。
ブロックチェーンは複数のノードでブロックを管理することで、初めて耐改ざん性、耐障害性を発揮します。
次回は同じサンプルを用いて複数のノードを構成していきたいと思います。