Hyperledger Fabric を使ってみました

星さんブログアイキャッチ画像

こんにちは。エンジニアのほしです。

突然ですが、今回は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

・サービス再起動

 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をクリックする。
image1 image2
玉を移動するとブロックが生成されているのが視覚的に解ります。

image_last
今回は、最小限の構成(単一のノード)でのブロックチェーンネットワークを構成しました。
実はこの状態では、ブロックチェーンとしての役割は果たしていません。
ブロックチェーンは複数のノードでブロックを管理することで、初めて耐改ざん性、耐障害性を発揮します。

次回は同じサンプルを用いて複数のノードを構成していきたいと思います。

株式会社ライズウィル

株式会社ライズウィル

〒110-0016
東京都台東区台東1-27-11 やわらぎビル2F
TEL : 03-4590-3200
FAX : 03-4590-3201
E-Mail : info@risewill.co.jp
URL : https://www.risewill.co.jp

海上コンテナ輸送管理システム「海コン魂!」
海コン魂!
フルカスタマイズ可能な求人サイトパッケージ
jobtter