IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

Hyperledger Fabric でブロックチェーン環境を構築

こんにちは。この IDCF テックブログには2度目の寄稿となる木村です。
今回はオープンソースのブロックチェーン環境である Hyperledger Fabric を紹介し、特に IDCF クラウドを使ってその環境構築を行うための手順を紹介します。

自己紹介

某外資系クラウド会社で、クラウドや人工知能、DevOps といった比較的新しい技術を使ってお客様アプリケーションのプロトタイプ開発を行ったり、その技術紹介を行ったりしています。会社の方針でもあるのですが、最近はブロックチェーンを使った案件にも多く関わっており、多くの会社が業種内でのトップランナーとなるべく興味を持っていることを実感しています。

Hyperledger Fabric v1.0 について

ビットコインに代表されるブロックチェーン技術に注目が集まる中、 「企業利用に適した分散台帳フレームワーク」 を目的としたオープンソースブロックチェーン環境開発プロジェクトがスタートしました。それが Hyperledger プロジェクトです。Hyperledger プロジェクトではフレームワークの開発と同時に、オープンソースのテクニカルコミュニティを作り、ソリューションプロバイダーやユーザーエコシステムへの便益提供を目的としています。

この Hyperledger プロジェクトの中で行われたハッカソンを通じ、いくつかのインキュベーションプロジェクトが生まれています。その中の1つがブロックチェーンプラットフォームやその SDK/API を含めて提供する Hyperleger Fabric でした。IBM は Hyperledger Fabric が生まれた当初からコードを提供し、発展に貢献してきました。そのベータ版は IBM Bluemix(現 IBM Cloud)を通じて世の中に提供されていましたが、2017年7月に正式バージョンである Hyperledger Fabric v1.0 がリリースされました。

Hyperledger Fabric はオープンソース製品として公開されていると同時に、テクニカルコミュニティ向けにも多くの情報が提供されています。今回は「サポートツール」と呼ばれる、Docker を使って開発者向けに比較的簡単な方法で Hyperledger Fabric v1.0 環境を構築するキットを紹介し、IDCF クラウドの仮想マシン内で同環境を構築する手順を紹介します。

なお Hyperledger Fabric の公式ドキュメントはこちらです:
https://hyperledger-fabric.readthedocs.io/en/release/

作成する環境のシステム図

今回は「サポートツール」を使って Hyperledger Fabric 環境を構築します。このサポートツールは Docker および Docker-Compose が導入されていることを前提として稼働し、Hyperledger Fabric の構成や開発、動作検証に最小限必要な環境を作ります。具体的には今回紹介する手順で次のようなネットワーク構成を(1台の Docker サーバー内に)作ります:

  • CA: 認証局ノード

  • Orderer: ブロック追加の順序を管理するノード

  • Peer: ブロックを持つノード(実際には複数ピアで運用することになるが、サポートツールでは1つだけ作る)

  • DB: ステートデータベース

f:id:idcf-ambassador:20171116180403p:plain
図1 システム図

仮想マシン作成

まずは Hyperledger Fabric 環境を導入するためのサーバーを用意します。今回は IDCF クラウドの仮想マシンを利用しました。

IDCF クラウドのコンソールにログインし、仮想マシンを1台作成します。今回はマシンタイプに(自分が普段使っている環境に近いという理由で) standard.S8 を使用しましたが、環境構築の手順を確認するだけであればもっと小さくても(light.S2 クラスでも)できると思います。

Hyperledger Fabric 自体は後述する Docker および Docker-Composer 上で動きますが、今回利用するサポートツールは macOS および Ubuntu 用に用意されています。今回はサーバーを作成する際に OS としては Ubuntu Server 16.04 を選択したものとして、次の説明を続けます。

ネットワーク設定とSSHログイン

仮想マシンが起動したらまずはネットワークの構成を行います。

ファイアウォール

開発用途限定などで、ブロックチェーンを外部からアクセスさせない場合はファイアウォールの設定は必ずしも必要ではありませんが、外部からアクセスさせる場合は IP アドレスのファイアウォールの設定が必要です。具体的には(今回のサポートツールで作る構成の場合は)GRPC と呼ばれるプロトコルが使う次のポートを公開する必要があります:

f:id:idcf-ambassador:20171127191432p:plain
図2 ファイアウォールの設定

必要に応じて、次の環境設定をする時のために SSH を使う場合は SSH のポート(デフォルトは22)も開けておきます。IDCF クラウドの場合は Web コンソールから仮想マシンのコンソールに直接アクセスすることもできるので、その機能を使って構成する場合は必須ではありません。

ポートフォワード

ファイアウォールで開けたポートを仮想マシンにフォワードするための設定を追加します:

f:id:idcf-ambassador:20171116180605p:plain
図3 ポートフォワードの設定

なお SSH のポートを開けた場合は、SSH のポートについてもフォワード設定を追加します。

SSH でログイン

SSH か、または IDCF クラウドの場合であれば Web コンソールから仮想マシンのコンソールに直接アクセスする機能があるので、いずれかを使ってターミナル画面にアクセスし、次の準備作業および設定作業を行います。

f:id:idcf-ambassador:20171116180827p:plain
図4 SSH でログイン

なお、後者の(Web コンソールから仮想マシンのコンソールに直接アクセス)方法については以前にテックブログを書かせていただいた際に紹介しているので、その方法はこの記事内を参照ください:

Secure Gateway を使って、マルチクラウドの環境間でのセキュアなデータ通信を実現する

Hyperledger Fablic導入準備

メモリがキツい可能性あり。スワップを増やす場合はこちら:

今回は Docker を使って、1台の(仮想)マシン内にブロックチェーン環境を構築します。したがって Docker 環境となるホストのメモリは多めに用意しておくべきです。

IDCF クラウドで仮想マシンのスワップメモリを増やす(というか有効にする)方法についてはこちらを参照してください。場合によってはこの方法で仮想的にメモリを増やしておいてください:

http://dotnsf.blog.jp/archives/1019097767.html

とりあえず環境をアップデート

ターミナル画面を開いたら、まずは次のコマンドでライブラリなどの環境をアップデートしておきます:

$ sudo apt-get update -y
$ sudo apt-get upgrade -y

前提条件

Hyperledger Fabric を導入するために必要となる前提条件がこちらです:

  • Docker
  • Docker-Compose
  • Node.js V6.x

Ubuntu 16.04 の場合は次に紹介する手順でこれらを順に導入していきます。導入済みのものがあれば飛ばしていただいて構いません。なお Node.js は V8.x ではなく V6.x をご用意ください。また環境が異なる場合は導入手順も異なると思いますが、これら3つの前提となるミドルウェアが正しく導入されていれば次に進んでいただいて構いません。

Docker CE 17.x のインストール

参考にした記事はこちらです。
公式サイト:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

次の手順では無料版の Docker CE(Community Edition) を導入します:

  • リポジトリ設定/更新
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common  
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"  
$ sudo apt-get update 
  • Docker CE インストール
$ sudo apt-get -y install docker-ce
  • Docker CE がインストールされたことを確認
$ sudo docker -v
Docker version 17.09.0-ce, build afdb6d4

↑Docker v17.09.0-ce がインストールできたことが確認できました。

  • 権限の変更

Docker のインストールは完了しました。ただし一般ユーザーの場合、このままでは常に sudo を付けないと docker コマンドが使えません。sudo なしで docker コマンドを実行できるようにする場合は次の手順まで実行してください:

$ sudo usermod -aG docker $(whoami)

(この後、一度 Ubuntu からログアウトして再ログインする)

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
 Images: 0
 Server Version: 17.09.0-ce
 Storage Driver: overlay2
 Backing Filesystem: extfs
 :

↑Docker の情報が出力されます。sudo なしで docker コマンドが動くことが確認できました。

Docker-Compose

参考記事はこちら
公式サイト:
https://docs.docker.com/compose/install/

次の手順で docker-compose コマンドを直接ダウンロードします:

$ curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

(この後、一度 Ubuntu からログアウトして再ログインする)

$ docker-compose -v
docker-compose version 1.12.0, build b31ff33

↑Docker-Compose v1.12.0 がインストールできたことが確認できました。

Node.js V6.x

最新版ではなく V6.x を導入するために n package を使ってバージョンを指定してインストールします。

こちらの記事を参考にしました。
公式サイト:
https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux

  • まず普通に apt-get コマンドで nodejs と npm をインストールします。
$ sudo apt-get install -y nodejs npm

これで nodejs (とnpm)はインストールできているのですが、この方法だと node コマンドではなく nodejs コマンドを実行する必要があります。またバージョンが古く、今回の環境構築に必要な V6.x ではないバージョンが導入されているはずです。

$ node -v
bash: node: command not found

↑node コマンドが使えない

$ nodejs -v
v4.2.6

↑nodejs コマンドであれば使える。ただしバージョンは古い。

  • n package をインストール

上記手順で導入した(古い)npm を使って、Node.js のパッケージバージョン管理ツールである n package をインストールします:

$ sudo npm cache clean
$ sudo npm install n -g
  • node v6.x をインストール

n package を使って node v6.x をインストールします。まずは Node.js のバージョン一覧を確認します:

$ sudo n list
    :
  6.11.4
  6.11.5   <- 6.x はこれが最新(2017.11.12時点)
  7.0.0
    :

6.x 系では(この画面では)6.11.5 が最新のようでした。このバージョンをインストールする場合は次のように指定して実行します:

$ sudo n 6.11.5

ログインし直して(一度ログアウトして再ログイン)、改めて node コマンドと、そのバージョンを確認します:

$ node -v
v6.11.5

念のため、npm のバージョンも確認します:

$ npm -v
3.10.10
  • 最初に入れた nodejs と npm を削除

このままでもいいのですが、最初に apt-get コマンドで導入した nodejs と npm が入ったままだと混乱の原因にもなるので、削除しておきます:

$ sudo apt-get purge -y nodejs npm

これで Hyperledger Fabric を導入する上での前提条件は全て揃いました!

f:id:idcf-ambassador:20171116180657p:plain
図5 前提となるソフトの導入完了

Hyperledger Fabric

では改めてここから Hypderledger Fabric を導入する手順を紹介します。

(参考) http://dotnsf.blog.jp/archives/1066949876.html

Hyperledger Fabric コマンドラインインターフェース

まず npm を使って Hyperledger Fabric のコマンドラインインターフェースである composer-cli をインストールします:

$ sudo npm install -g composer-cli

↑このコマンドは終了まで結構時間がかかります。コマンドが完了したら composer-cli がインストールできていることを確認します:

$ composer -v
v0.14.2

↑composer-cli の v0.14.2 が導入できています。(バージョンは2017.11.12時点)

サポートツール

docker サービスが止まっている場合はここで起動しておいてください:

$ sudo service docker restart

ではメインディッシュである Hyperledger Fabric サポートツールを導入します。次の例ではホームディレクトリ直下に ~/fabric というフォルダを作って、その中にサポートツールを導入しています。フォルダを変更したい場合は適宜読み替えてください:

$ cd
$ mkdir fabric  (ホームディレクトリ配下の ~/fabric/ にサポートツールを導入する場合)
$ cd fabric
$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip
$ unzip fabric-dev-servers.zip

ダウンロード&展開したサポートツールのファイルを確認します:

$ ls
createComposerProfile.sh  _loader.sh      teardownAllDocker.sh
downloadFabric.sh         package.json    teardownFabric.sh
fabric-dev-servers.zip    startFabric.sh
fabric-scripts            stopFabric.sh

↑バージョンによっては多少変わるかもしれませんが、次で使うシェルスクリプトが展開されることを確認します。

Hyperledger Fabric v1.0 のインストール

サポートツール内のシェルスクリプトを使って Hyperledger Fabric v1.0 をインストールします:

$ ./downloadFabric.sh

このコマンドの中で必要な docker イメージのダウンロード等が行われ、Hyperledger Fabric v1.0 がセットアップされます。

コマンドが終了したら、いったんこの時点で docker のプロセスを確認します。Hyperledger Fabric 関連のプロセスが1つも動いていないことを確認してください。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

↑Hyperledger Fabric のプロセスが何も動いていない状態

Hyperledger Fabric の起動

では Hyperledger Fabric を起動します:

$ ./startFabric.sh

このコマンドが完了した後、改めて docker のプロセスを確認します。今度は Hyperledger Fabric 関連のプロセスが動いていることが確認できます。

$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
59ce8e49b410        hyperledger/fabric-peer:x86_64-1.0.3      "peer node start -..."   25 seconds ago      Up 25 seconds       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
352f9fe8c96f        hyperledger/fabric-ca:x86_64-1.0.3        "sh -c 'fabric-ca-..."   28 seconds ago      Up 26 seconds       0.0.0.0:7054->7054/tcp                           ca.org1.example.com
d9ad480318bd        hyperledger/fabric-orderer:x86_64-1.0.3   "orderer"                28 seconds ago      Up 25 seconds       0.0.0.0:7050->7050/tcp                           orderer.example.com
5cbf663372fe        hyperledger/fabric-couchdb:x86_64-1.0.3   "tini -- /docker-e..."   28 seconds ago      Up 26 seconds       4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb

↑Hyperledger Fabric のプロセスが起動しています!

デフォルトプロファイルの作成

$ ./createComposerProfile.sh
(~/.composer-connection-profiles/hlfv1/connection.json および ~/.composer-credentials/ 以下が作成される)

Hyperledger Fabric の停止

起動した Hyperledger Fabric を停止する場合は stopFabric.sh を実行します:

$ ./stopFabric.sh

コマンド完了後、改めて docker のプロセスを確認して、動いていた Hyperledger Fabric 関連のプロセスが消えていることを確認します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

↑Hyperledger Fabric のプロセスが停止しました。

最後に、ダウンロードしたサポートツールのアーカイブファイルはもう不要なので削除しておきます:

$ rm fabric-dev-servers.zip

Hyperledger Fabric

以上でブロックチェーン環境のインフラとも言える Hyperledger Fabric の(最小限の)インフラ環境を構築することができました。もちろん実際の運用時にはピアノード数を増やしたり、(Docker 上で構成されたものだけではなく)他のネットワークとも接続してビジネスネットワークを構成することになると思いますが、一方でこれだけでアプリケーション開発および動作確認程度はできる環境にはなっています。

Hyperledger Fabric を使ってアプリケーションを開発する場合にはいくつかの方法がありますが、その中でも Hyperledger Composer フレームワークを使うと(ChainCode や Go 言語といった知識がなくても)アプリケーションの定義や開発ができて便利&オススメです。そちらについても機会があればこのテックブログで紹介させていただきたいのですが、導入手順については別サイトで以前に紹介したことがあるので、そちらを参照ください:

http://dotnsf.blog.jp/archives/1066959724.html

Copyright © IDC Frontier Inc.