●スーパー・レジャーのアーキテクチャ設計を理解する。
●スーパー・レジャーの開発環境を構築することを学ぶ。
●チェーンコードの開発プロセスを習得する。
●実例を通じてファブリックフレームワークの開発を習得する。
スーパー・レジャー(Hyperledger)は、2015 年 12 月に Linux 財団が主導して開始したオープンソースプロジェクトであり、企業がカスタマイズされた分散台帳ソリューションを作成するための信頼性が高く安定した、高性能なブロックチェーンフレームワークを提供することを目的としています。これにより、ブロックチェーン技術の商業利用を促進します。
スーパー・レジャーのアーキテクチャは、メンバーシップ(MEMBERSHIP)、ブロックチェーン(BLOCKCHAIN)、トランザクション(TRANSACTIONS)、およびスマートコントラクト(CHAINCODE)の 4 つの大きなモジュールで構成されています。メンバーシップモジュールは、ユーザー登録(Registration)、アイデンティティ管理(Identity Management)、および監査可能性(Auditability)などのメンバーサービス(Membership Services)を提供します。ブロックチェーンモジュールとトランザクションモジュールは、ブロックチェーン関連のサービス(Blockchain Services)を提供し、コンセンサスマネージャー(Consensus Manager)、分散台帳(Distributed Ledger)、P2P プロトコル(P2P Protocol)、および台帳ストレージ(Ledger Storage)などの機能を担当します。スマートコントラクトサービスは、スマートコントラクトの機能を提供し、スマートコントラクトは安全なレジストリ(Secure Registry)に配置され、実行時には安全なコンテナ(Secure Container)内で実行されます。
スーパー・レジャーは、実際の開発プロセスにおいて、基本的に上記のアーキテクチャに従って開発され、多くのブロックチェーンプロジェクトを孵化させました。主なものには、ソートゥース(Sawtooth)(公式ウェブサイトのホームページは図 6-2 に示されています)、イロハ(Iroha)(公式ウェブサイトのホームページは図 6-3 に示されています)、ファブリック(Fabric)(公式ウェブサイトのホームページは図 6-4 に示されています)、バロウ(Burrow)(公式ウェブサイトのホームページは図 6-5 に示されています)などがあります。
その中で、ソートゥースは分散台帳を構築、展開、実行するためのモジュール式プラットフォームです。イロハは商業用ブロックチェーンフレームワークで、設計がシンプルで、分散台帳技術を必要とするインフラプロジェクトに組み込みやすいです。ファブリックはオープンソースのブロックチェーン開発フレームワークで、ノード、スマートコントラクト、および構成可能なコンセンサスとメンバーサービスなどの機能を含むモジュール式アーキテクチャを提供します。バロウは、イーサリアムのスマートコントラクトをサポートするフレームワークとして考えることができ、イーサリアム仮想マシン(EVM)仕様に基づいて構築されています。これらのスーパー・レジャーに基づくプロジェクトの中で、ファブリックが最も有名で、ファブリックを使用することで企業レベルのブロックチェーンシステムを迅速に構築できます。一般的にスーパー・レジャーはファブリックを指し、本章で説明するスーパー・レジャーもファブリックを指します。つまり、本章で言及されるスーパー・レジャーは基本的にファブリックを指します。
以下にスーパー・レジャー・ファブリックのアーキテクチャを理解します。
ファブリックのアーキテクチャは、2 つのバージョンの進化を経ています。最初にリリースされた 0.6 バージョンは商業検証のためだけに使用され、実際のシーンには適用できませんでした。0.6 バージョンの構造はシンプルで、ほぼすべての機能がピアノードに集中しており、拡張性、安全性、隔離性に欠けていました。その後リリースされた 1.0 正式版では、ピアノードの機能が分割され、コンセンサスサービスがピアノードから切り離され、オーダーノードとして独立し、プラグ可能なコンセンサスサービスを提供しました。さらに重要なのは、マルチチャネル(multi-channel)機能が追加され、複数のビジネスの隔離を実現したことです(図 6-6 参照)。
ファブリック 1.0 で理解すべきいくつかのコア概念は以下の通りです。
●SDK:アプリケーションツール開発パッケージ。
●メンバーシップ:アイデンティティ権限管理を担当し、MemberService または Identity Service とも呼ばれます。
●チェーンコード(Chaincode):ブロックチェーン上のアプリケーションコードで、「スマートコントラクト」の概念から拡張され、Go、Java などのプログラミング言語をサポートし、隔離されたコンテナ環境で実行されます。
●オーダー(Orderer):ファブリック 1.0 アーキテクチャにおけるコンセンサスサービスの役割で、トランザクションを順序付け、バッチ処理し、ブロックを生成してピアノードに送信します。1 つのブロックチェーンネットワークには複数のオーダーノードがあり、共同で順序付けサービスを提供します。
●エンドーサー(Endorser):ファブリック 1.0 アーキテクチャにおける一種のピアノードの役割で、特定のトランザクションが合法であるかどうかを検証し、署名を行う意志があるかどうかを判断します。
●コミッター(Committer):ファブリック 1.0 アーキテクチャにおける別の種類のピアノードの役割で、オーダーノードで順序付けされたトランザクションを検査し、合法的なトランザクションを選択して実行し、ストレージに書き込みます。
●登録証明書認証機関(ECA):メンバーシップ関連の証明書管理を担当する認証機関。
●トランザクション証明書認証機関(TCA):トランザクション関連の証明書管理を担当する認証機関。
ファブリックでは、主に 2 種類のノードに分かれます:ピアノードとオーダーノード。1 つのブロックチェーンネットワークには複数のピアノードがあり、1 つのピアノードは複数の役割を果たすことができます。例えば、エンドーサーとして機能したり、コミッターとして機能したりします。チェーンコード(Chaincode)がピアノードにデプロイされると、そのノードはスマートコントラクトを実行するために使用されます。オーダーノードはネットワーク内で代理の役割を果たし、複数のオーダーノードが Kafka クラスターに接続し、Kafka のコンセンサス機能を利用してネットワーク内のトランザクションを順序付けてブロックにパッケージ化します。また、別のピアノードは複数のチャネルに参加でき、複数のチャネル間は完全に隔離されており、各チャネルはそのチャネルに関連するトランザクションのブロックのみを受信および処理し、他のトランザクションとは完全に隔離され、データの隔離と機密性を実現します。
スーパー・レジャー・ファブリックの特徴#
スーパー・レジャーのアーキテクチャは、以下の特徴を持っています。
●モジュール式設計で、コンセンサス、権限管理、暗号化、台帳メカニズムなどのモジュールを柔軟に選択および置き換え可能です。
●さまざまなノードタイプを持っています。異なるノードには異なる機能が割り当てられ、トランザクション処理の効率が向上します。
●アイデンティティ証明書管理サービスが強化され、アイデンティティ証明書、デジタル署名、検証アルゴリズム、およびアイデンティティが有効かどうかを判断するためのいくつかの機能を提供します。
●マルチチャネル機能をサポートし、異なるチャネル間のデータが相互に隔離され、安全性が向上します。
●チェーンコードを導入してスマートコントラクトの機能を実現し、プログラマビリティを実現し、サードパーティがカスタム機能を実装できるようにします。
●Docker コンテナ技術を十分に活用し、負荷に応じて柔軟に展開できます。
ファブリック開発環境の構築#
スーパー・レジャーは主に Go 言語で開発され、Docker コンテナ技術を使用して展開されます。スーパー・レジャーの開発環境の構成プロセスは比較的簡単で、Windows、Linux、Mac システムで操作できます。スーパー・レジャーでブロックチェーンを開発するには、まず Go 言語の開発環境と Docker ツールをインストールする必要があります。その後、公式に提供されているインストールスクリプトを使用して、必要なファイルと Docker イメージを自動的にダウンロードしてインストールできます。ダウンロードが完了したら、開発を開始できます。ここでは、Go 言語と Docker ツールについて簡単に紹介します。この 2 つの部分について理解している読者はスキップして、ファブリックのローカル開発環境のインストール部分を直接読むことができます。
Go 言語の概要とその開発環境のインストール#
Go 言語は Google が提供する強い型付けの汎用プログラミング言語であり、Go 言語の優れた言語設計、高効率な性能、および強力な並行プログラミング能力により、ブロックチェーンのような分散システムの開発に非常に適しています。
Go 言語をインストールするには、Go のダウンロードページ(https://golang.org/dl/)にアクセスし、対応するシステムの Go 言語開発環境のインストールファイルを選択してダウンロードおよびインストールします(適切な設定が必要です)。Go 言語のダウンロードページは図 6-7 に示されています。
Go 言語の開発環境のインストールが完了したら、Go のディレクトリ /usr/local/go/bin をシステムの PATH 環境変数に追加する必要があります。コマンドは以下の通りです:
$ export PATH=$PATH:/usr/local/go/bin
その後、「Hello,Golang!」を出力するプログラムを作成して、Go の開発環境が正しくインストールされているかをテストします。
新しい hello.go という名前のファイルを作成し、以下の内容を入力します:
次に、システムのコマンドライン端末ツール(terminal)を開き、go run hello.go コマンドを実行すると、「Hello,Golang!」の出力情報が表示されます(図参照)。
Go の構文は比較的シンプルで、Go 言語の公式サイトでもオンライン学習のチュートリアルが提供されています。必要な読者は、https://tour.golang.org/welcome/1 にアクセスして学習できます。
Docker はオープンソースのアプリケーションコンテナエンジンで、Go 言語を基に開発されています。現在、最も人気のあるコンテナソリューションです。Docker は Linux コンテナの一種のパッケージで、簡単に使用できるコンテナインターフェースを提供します。
Docker を使用すると、開発者はアプリケーションとその依存関係をポータブルなコンテナにパッケージ化し、任意の一般的な Linux マシンに展開することで、アプリケーションを起動して実行できます。Docker は開発者がプロジェクトを非常に便利かつ迅速に管理できるようにし、数分でプロジェクトの展開と更新を完了できます。
Docker はクライアント / サーバー(C/S)アーキテクチャモデルを使用しており、Docker クライアント(Docker Client)と Docker デーモン(Docker Daemon)の 2 つの部分で構成されています。Docker デーモンはホストマシン上で実行され、Docker コンテナの作成、実行、展開などの複雑で重いタスクを処理します。Docker クライアント(またはコマンドラインツール)は、ユーザーが Docker を使用する主な方法であり、Docker クライアントは Docker デーモンと通信し、結果をユーザーに返します。Docker クライアントと Docker デーモンは同じシステム上で実行できますが、もちろん Docker クライアントを使用してリモートの Docker デーモンに接続することもできます。Docker クライアントと Docker デーモンは、ソケットまたは RESTful API を介して通信します(図参照)。
Docker の基本構成を理解したら、Docker の 3 つの主要な概念について理解します。
●Docker イメージ:Docker イメージは読み取り専用で、実行に必要なファイルが含まれています。イメージはコンテナを作成するために使用され、1 つのイメージは複数のコンテナを実行できます。イメージは Dockerfile を使用して作成できます(Dockerfile はテキストファイルで、Docker はこのファイルに基づいてイメージを生成します)、または Docker リポジトリからダウンロードできます。
●Docker コンテナ:Docker コンテナは Docker の実行コンポーネントであり、イメージを起動するとコンテナが作成されます。コンテナは隔離された環境であり、複数のコンテナ間で相互に影響を与えず、コンテナ内のプログラムが比較的安全な環境で実行されることを保証します。
●Docker リポジトリ:Docker リポジトリは Docker イメージを共有および管理するためのもので、ユーザーはイメージをアップロードまたはダウンロードできます。
Docker リポジトリの公式アドレスはhttps://registry.hub.docker.com/ であり、独自のプライベート Docker リポジトリを構築することもできます。
次に Docker のインストールを行います。Mac と Windows では公式ウェブサイトからインストーラをダウンロードしてインストールできます。他の Linux システムでは、コマンドラインでインストールできます。
Docker のインストールパッケージのダウンロードアドレスは:https://www.docker.com/get-started#
ダウンロードしたファイルをダブルクリックして Docker インストーラを実行すればインストールが完了します。インストールが完了したら、Docker アイコンをダブルクリックして Docker デーモンを起動し、Docker クライアントと Docker デーモンとのインタラクションを開始します。すべてが正常にインストールされている場合、ターミナルで docker run hello-word コマンドを入力すると、hello-world イメージが自動的にダウンロードされ、コンテナが起動して「Hello from Docker」と出力されます(図参照)。
これで Docker が正常に使用できることが確認されました。docker コマンドを直接入力すると、Docker クライアントの一般的な使用方法を確認できます。
ここでは、いくつかの一般的な Docker コマンドを示します。
●コンテナを起動し、コマンドラインツール bash を起動します。
docker run -i -t<image_name/container_id>/bin/bash
●実行中のコンテナ内部に入り、同時に bash を実行します。
docker exec -t -i<id/container_name>/bin/bash
●コンテナのログを表示します。
docker logs<id/container_name>
●現在実行中のすべてのコンテナをリストします。
docker ps
●単一のコンテナを削除します。
docker rm Name/ID
●コンテナを停止、起動、終了、再起動します。
docker stop Name/ID
docker start Name/ID
docker kill Name/ID
docker restart name/ID
●イメージをリストします。
docker images
●イメージを検索します。
docker search image_name
●イメージをダウンロードします。
docker pull image_name
●1 つまたは複数のイメージを削除します。
docker rmi image_name
Docker に関して、最後にカスタムイメージファイルを生成する方法を知っておく必要があります。カスタムイメージファイルを生成するには、Dockerfile を作成する必要があります。Dockerfile は 1 行ずつのコマンド文で構成され、# で始まるコメント行をサポートしています。一般的に、Dockerfile は基本イメージ情報、メンテナ情報、イメージの操作指令、コンテナ起動時に実行される指令の 4 つの部分に分かれます。ここでは、nginx(高性能な HTTP およびリバースプロキシサーバー)を基本イメージとして例に取り、新しい Dockerfile の空白ファイルを作成し、以下の内容を入力します:
Dockerfile の例#
第 1 行は基にするイメージを指定する必要があります。#
FROM nginx
メンテナ情報#
MAINTAINER XXX [email protected]
イメージの操作指令#
RUN echo‘<h1>Hello,Docker!</h1>'>/usr/share/nginx/html/index.html
#コンテナ起動時に実行される指令
!!この例は機能が比較的シンプルで、コンテナ起動時に実行する指令は必要ありません!!#
ファイルを保存した後、ターミナルで docker build -t hello_docker. コマンドを実行してイメージを構築します。実行が完了すると、ローカルに hello_docker という名前のイメージが追加されていることが確認できます(図参照)。
以上が Docker の簡単な紹介です。さらに学ぶ必要がある場合は、専用の Docker チュートリアルを購入して独学することをお勧めします。例えば、『Docker 入門と実践』や『Docker 第一本』などです。
Go 言語と Docker について一定の理解を得た後、正式にファブリックの開発環境を構築することができます。
現在のファブリックの最新バージョンは 1.2.1 で、コマンドラインツールを開いて以下のコマンドを使用してインストールできます:
curl -sSL http//bit.ly/2ysbOFE|bash -s 1.2.1
このコマンドは以下の操作を実行します。
1)1.2.1 バージョンのファブリックコードがあるかどうかを確認します。
2)1.2.1 バージョンのファブリックプロジェクトのプログラムと設定ファイルを現在のフォルダにダウンロードします(図参照)。
3)1.2.1 のファブリック Docker イメージを現在のシステムにダウンロードします(図参照)。
その後、ファブリックプロジェクトのサンプルコードをローカルにダウンロードすることもできます。これらのサンプルコードはファブリックに基づいて実装されたプロジェクトであり、本書もこれらのサンプルを通じてファブリックの使用方法を説明します。サンプルコードのダウンロードコマンドは以下の通りです:
git clone https//github.com/hyperledger/fabric-samples.git
これでファブリックの開発環境が構築されました。ファブリックの公式ウェブサイトにアクセスしてインストール手順の説明を確認できます。ウェブリンクは https//hyperledger-fabric.readthedocs.io/en/latest/getting_started.html です。