Amazon Web Services ブログ
Amazon マネージドブロックチェーンで、ハイパーレジャーファブリックのアプリケーションを構築およびデプロイする
2018 年の re:Invent で、AWS は Amazon マネージドブロックチェーンを発表しました。一般的なオープンソースフレームワークのハイパーレジャーファブリックおよびイーサリアムを使用して、スケーラブルなブロックチェーンネットワークを簡単に作成および管理できる完全マネージド型のサービスです。このサービスのプレビューは、ハイパーレジャーファブリックフレームワークのサポートとともに利用できます。イーサリアムのサポートも間もなく開始されます。マネージドブロックチェーンの詳細については、「Amazon マネージドブロックチェーンとは何ですか?」を参照してください。 サービスを利用するには、プレビューにサインアップしてください。
この記事では、マネージドブロックチェーンを使用して、ハイパーレジャーファブリックのブロックチェーンネットワークを構築する方法を学びます。ファブリックネットワークを作成したら、そのネットワークを使用して非営利組織への寄付を追跡する 3 層アプリケーションをデプロイします。非営利組織は、その後援者に可視性を提供し、寄付金の使い方に対して透明性を保ちたいと思っています。ハイパーレジャーファブリックは、篤志家による各寄付金の使い方について詳細を追跡します。篤志家はこの情報を使用して、非営利組織が期待通りに寄付金を使っているかどうかを判断できます。
ブロックチェーンは、援助機関、投資家、慈善機関、サプライヤー、および非営利組織自身を含むネットワーク内の全メンバーの間で信頼を深められるため、このシナリオに適しています。ネットワーク内の全メンバーは、寄付および支出記録に対して、独自の不変で暗号化された安全なコピーを持ちます。メンバーは単独で、寄付金がいかに効果的に使われているかを見直すことができます。透明性は、非営利組織のコスト削減に対する効率性と洞察力の向上につながります。
アーキテクチャの概要
アプリケーションは次の層で構成されています。
- ファブリックピアノードで実行されるハイパーレジャーファブリックのチェーンコード。チェーンコードは、ファブリックネットワーク上でデータをクエリしてトランザクションを呼び出すスマートコントラクトです。
- ハイパーレジャーファブリックのクライアント SDK を使用して、ファブリックネットワークと対話し、チェーンコードによって提供される機能を公開する RESTful API。ハイパーレジャーファブリックのクライアント SDK には、チャネルの作成と参加、チェーンコードのインストールとインスタンス化、およびデータのクエリやトランザクションの呼び出しを行うための API が用意されています。
- RESTful API によって提供される API を呼び出すユーザーインターフェイスアプリケーション。
このアーキテクチャは、アプリケーションのエンドユーザーがハイパーレジャーファブリックネットワークの内部動作に公開されないように、疎結合と抽象化を提供します。実際、ファブリックネットワークから受信したブロックを表示するユーザーインターフェイスのスライダーコンポーネント以外に、基になるテクノロジがブロックチェーンであることをエンドユーザーに示すことはできません。
この疎結合は、RESTful API によって提供される機能を使用するだけで、ハイパーレジャーファブリックやチェーンコードについて何も知らないユーザーインターフェイス開発者にまで影響が及びます。したがって、疎結合を使用すると、ウェブ、モバイル、その他の種類のアプリケーションにかかわらず、使い慣れた外観のアプリケーションを開発できます。
この記事の残り部分は 4 つのセクションに分かれています。それぞれのセクションでは、アーキテクチャのさまざまなレイヤーについて次のように説明します。
- パート 1 では、Amazon マネージドブロックチェーンを使用して、ハイパーレジャーファブリックネットワークを構築します。
- パート 2 では、チェーンコードの形式でビジネスロジックをファブリックネットワークにデプロイします。
- パート 3 では、ハイパーレジャーファブリッククライアント SDKを使用して、チェーンコードと対話する RESTful API をデプロイします。
- パート 4 では、RESTful API によって公開されている機能を使用するアプリケーションをデプロイします。
エンドユーザーによる要求は、図 1 に示すようにレイヤーを通過します。ユーザーインターフェイス上のユーザーによるアクティビティは、RESTful API サーバーへの REST API 呼び出しにつながります。次に、ファブリック SDK を使用して、マネージドブロックチェーンのハイパーレジャーファブリックコンポーネントと対話し、トランザクションを呼び出したりデータをクエリしたりします。
図 1 – ハイパーレジャーファブリックアプリケーションと対話するユーザー
添付リポジトリ
この記事に添付する Git リポジトリには、エンドアプリケーションを作成するために、パート 1 から 4 の完了に必要なアーティファクトが含まれています。
https://github.com/aws-samples/non-profit-blockchain
この記事の各パートは、Git リポジトリの一致する部分に関連付けられています。各パートの進行につれて、記事は添付リポジトリの README ファイルの手順について詳しく説明します。
現在、マネージドブロックチェーンのプレビュー自体は料金がかかりませんが、この記事の手順を実行すると、該当する料金が請求される他の AWS リソースを消費します。
パート 1 から始めましょう。
パート 1:Amazon マネージドブロックチェーンを使用して、ハイパーレジャーファブリックネットワークを構築する
まず、AWS アカウントがマネージドブロックチェーンのプレビューに追加されていることを確認してください。次に、AWS マネジメントコンソールを使用すると、数回クリックするだけで、マネージドブロックチェーンを使用してハイパーレジャーファブリックネットワークを作成できます。マネージドブロックチェーンのコンソールを開いて、[ネットワークの作成] を選択します。ハイパーレジャーファブリックのフレームワークを選択し、ネットワークに名前を付けます。次に、[次へ] を選択します。
ネットワークに追加する最初のメンバーの名前を入力してください。メンバーはハイパーレジャーファブリック組織と同等であり、多くの場合、実際の組織にマッピングされます。ファブリックネットワークが互いに取引したいコンソーシアム組織で構成されていると考えられる場合、メンバーはそのコンソーシアム組織の一つになります。
最後に、メンバーの管理者のユーザー名とパスワードを入力します。Amazon マネージドブロックチェーンネットワークの各メンバーには、メンバーのユーザー登録と登録を担当する独自の証明機関 (CA) があります。ここに情報を入力すると、ハイパーレジャーファブリックメンバーの管理者ロールを持つ ID が定義されます。
入力した詳細を確認したら、ネットワークとメンバーを作成します。
手順の詳細については、「パート 1、手順 1:添付リポジトリにハイパーレジャーファブリックブロックチェーンのネットワークを作成する」を参照してください。
マネージドブロックチェーンは完全に管理されたサービスです。ハイパーレジャーファブリック順序サービスと各メンバーのファブリック CA など、共有コンポーネントを作成および管理し、エンドポイントで公開します。先の手順では、Virtual Private Cloud (VPC) エンドポイントを使用して、アカウント内の VPC でコンポーネントのエンドポイントを使用できるようにします。
ハイパーレジャーファブリックピアノードの作成
ハイパーレジャーファブリックネットワークとメンバーのステータスがアクティブになったら、ファブリックピアノードを作成します。ピアノードは、ファブリックのスマートコントラクトが実行される場所(例:チェーンコード)です。ピアノードには、ファブリックのレジャーも含まれています。不変で暗号化されたトランザクションのログ (または「ブロックチェーン」) を保持するジャーナルと、レジャーの現在の状態を保存するワールドステートとして知られるキーバリューストアの 2 つの部分から構成されます。
パート 1、手順 2 には、ピアノードを作成する手順が含まれています。ネットワーク上の各メンバーは独自のピアノードを作成するために、以前作成したメンバーを選択し、リンクを選択して、ピアノードを作成します。ノードのインスタンスタイプとストレージ容量を選択してから、ピアノードを作成します。
順序サービスや CA と同様に、各メンバーのピアノードは Amazon マネージドブロックチェーンによって管理され、VPC エンドポイントを介して VPC からアクセスできます。
この段階では、高可用性の順序サービスと CA、および単一ピアを備えたハイパーレジャーファブリックのネットワークがあります。この記事の残り部分では、スコープを縮小するために単一メンバーのネットワークを使用します。ただし、マルチメンバーの分散ネットワークをシミュレートする、より堅牢なテストまたは本番シナリオでは、Amazon マネージドブロックチェーンのコンソールまたは API を使用して、他のメンバーをネットワークに参加させることができます。後に続くブログ投稿では、これらの手順について説明します。
これで、ファブリックネットワークと対話することによって、チャネルの作成、チェーンコードのインストール、およびトランザクションの呼び出しを行えるようになりました。
VPC でハイパーレジャーファブリックのクライアントノードを作成する
Amazon マネージドブロックチェーンによってプロビジョニングされたファブリックコンポーネントと対話するには、オープンソースのハイパーレジャーファブリック CLI または SDK をダウンロードして使用します。これらのクライアントは、マネージドブロックチェーンによって公開されているエンドポイントと対話するように構成します。ピアバイナリである CLI を使用すると、チェーンコードのインストール、クエリ、呼び出し、およびチャネルの作成と参加ができます。
図 2 に示すように、Amazon マネージドブロックチェーンによって管理されているハイパーレジャーファブリックのコンポーネントには、アカウントの VPC でプロビジョニングしたファブリックのクライアントノード(クライアント A など)を介してアクセスします。ファブリッククライアントノードはオープンソースのハイパーレジャーファブリック CLI をホストし、VPC エンドポイントを介してファブリックネットワークとの対話を可能にします。VPC とマネージドファブリックネットワーク間のネットワークトラフィックは、すべて AWS バックボーンを介して発生し、パブリックインターネットには公開されません。
図 2 – 2 つのメンバーを持つ Amazon マネージドブロックチェーンネットワークのレイアウト
AWS アカウントで新しい VPC、ファブリックのクライアントノードとして構成された Amazon EC2 インスタンス、およびファブリックネットワークと通信する VPC エンドポイントをプロビジョニングするには、AWS CloudFormation を使用します。
GitHub リポジトリのパート 1、手順 3 と 4 では、ファブリッククライアントノードのプロビジョニングと準備方法について説明しています。AWS Cloud9 環境を作成するには、忘れずにパート 1 の前提条件に従ってください。AWS Cloud9 はクラウドベースの統合開発環境(IDE)で、ブラウザを使用してコードを作成、実行、およびデバッグできます。ただし、お客様は IDE 機能を使用することができません。代わりに、AWS Cloud9 などの Linux コマンドラインを使用します。AWS CLI など、必要なパッケージの一部が事前にインストールされているためです。
ハイパーレジャーファブリックのチャネルを作成してチェーンコードをインストールする
ファブリックのクライアントノードから、ファブリックネットワークにチャネルを作成します。ハイパーレジャーファブリックのチャネルは、アプリケーションとピアノードが相互対話し、プライベートで取引するための手段です。ファブリックネットワークは、各チャネルに異なるメンバーの組み合わせがある、多くのチャネルをサポートできます。
チャネルを作成するプロセスには、チャネル構成ファイル(configtx.yaml)の作成が含まれます。このファイルには、プロファイル形式でチャネル定義が含まれています。ハイパーレジャーファブリックのチャネル構成(configtxgen)ツールを使用して、configtx.yaml のプロファイルの一つに基づき、バイナリチャネルを作成するトランザクションファイルを生成します。次に、チャネルを作成するトランザクションファイルを、チャネルが作成されたファブリックの順序サービスに送信します。この時点で、チャネルブロックの起源である、ブロック 0 が作成されます。その後チャネルに追加され、ピアノードに返され、ピアをチャネルに参加させるために使用します。
チャネルを作成したら、ピアノードにサンプルチェーンコードをインストールし、チャネル上でチェーンコードをインスタンス化します。サンプルチェーンコードはハイパーレジャーファブリックのサンプルリポジトリに由来しており、すでにファブリックのクライアントノードに複製されています。チェーンコードをインストールすることで、単にチェーンコードをパッケージ化してピアにコピーします。それに対して、チェーンコードをインスタンス化することは、チェーンコードをチャネルにバインドするバインディングプロセスです。
チェーンコードをインスタンス化すると、いくつかのタスクが実行されます。
- チェーンコードの保証ポリシーを設定します。詳細については、ハイパーレジャーファブリックサイトの保証ポリシーを参照してください。
- チェーンコードがインスタンス化されたピアノードで、チェーンコードが起動される Docker イメージを構築します。
- チェーンコードの init メソッドを呼び出して、レジャーを初期化します。
チャネルを作成して、チェーンコードをインストールおよびインスタンス化するには、GitHub リポジトリのパート 1、手順 5~9 に従います。
チェーンコードのクエリとトランザクションの呼び出し
手順 10~12 では、チェーンコードをクエリし、チェーンコードトランザクションを呼び出してから、再度チェーンコードをクエリしてトランザクションの効果を確認します。図 3 に示すように、ピアノードでチェーンコードのクエリが行われます。チェーンコードがワールドステートをクエリすることを含みます。これは、レジャーの現在の状態を保存するキーバリューストアです。ワールドステートと一致するコピーが、チャネルに参加している各ピアノードに保存されます。
図 3 – ピアを介してハイパーレジャーファブリックのレジャーと対話するチェーンコード
これは、トランザクションを呼び出すときに開始されるトランザクションフローです。ファブリックのクライアントアプリケーションは、保証目的でネットワーク内の保証ピアにトランザクション提案を送信します。保証ピアはトランザクションをシミュレートし、結果をクライアントアプリケーションに返します。クライアントアプリケーションは、保証されたすべてのトランザクション応答をパッケージ化し、そのパッケージを順序サービスに送信します。トランザクションに順序付けして、チャネルに参加しているすべてのピアノードに返される前にブロックに割り込まれます。ここではトランザクションが検証され、読み取り/書き込みセットがチェックされ、さらに各トランザクションがワールドステートを更新します。ブロックは最終的にレジャーに追加されます。
パート 1 の最後に、次の作業を行いました。
- Amazon マネージドブロックチェーンを使用して、ハイパーレジャーファブリックのネットワークを作成し、ピアノードをプロビジョニングする
- VPC エンドポイントを介して、ファブリックネットワークに接続するファブリックのクライアントノードを使用して、新しい VPC を作成する
- 新しいチャネルを作成する
- ピアにチェーンコードをインストールし、チャネルにチェーンコードをインスタンス化する
- チェーンコードをクエリし、ワールドステートを更新するトランザクションを呼び出した結果、ブロックチェーンに新しいブロックが追加される
パート 2:非営利取引向けチェーンコードのデプロイとテスト
チェーンコードのデプロイは、パート 1 で学んだプロセスです。パート 2 の唯一の違いは、ハイパーレジャーファブリックのクライアントノードにすでに存在するサンプルチェーンコードをデプロイする代わりに、リポジトリから非営利アプリケーションのチェーンコードを取得してデプロイするという点です。
このプロセスを明確にするには、ファブリッククライアントノードの背景が役立つかもしれません。ファブリックのクライアントノードは、cli という名前の Docker コンテナを実行する EC2 インスタンスです。これを確認するには、SSH を使用して、ハイパーレジャーファブリックのクライアントノードに接続した後に docker ps
と入力します。docker inspect cli
と入力すると、Docker コンテナにマウントされているホスト EC2 インスタンス上のディレクトリを含む、cli コンテナに関する詳細情報が表示されます。例えば、directory /home/ec2-user/fabric-samples/chaincode がマウントされています。つまり、EC2 ファブリックのクライアントノードのディレクトリにチェーンコード(または任意のファイル)をコピーするだけで、cli コンテナ内で利用できるようになります。cli コンテナで利用可能になったら、ピアチェーンコードのインストール
コマンドを使用して、ピアノードにチェーンコードをインストールできます。
チャンネルの非営利チェーンコードをコピー、インストール、およびインスタンス化するには、GitHub リポジトリのパート 2:非営利組織(NGO)チェーンコードの手順に従います。
パート3:RESTful API サーバーをデプロイする
RESTful API サーバーは、ハイパーレジャーファブリックのクライアント SDK を使用して、ファブリックネットワークと対話する Node.js 高速アプリケーションです。前述のように、ハイパーレジャーファブリックのクライアント SDK は豊富な機能を提供します。これには、チャネルの作成と参加、チェーンコードのインストールとインスタンス化、ブロックの高さやチャネル構成情報などのブロックチェーンメタデータのクエリを実行する API が含まれています。この記事では、チェーンコードのクエリとトランザクションの呼び出しを可能にする SDK 機能のサブセットを使用します。
RESTful API Node.js アプリケーションは、どのようにファブリックネットワークに接続しますか? 2 つのオプションがあります。
- ハイパーレジャーファブリックのクライアント SDK が提供する API を使用して、順序サービス、CA、およびネットワーク内のピアノードに接続します。
- ファブリックネットワークの構造を記述する YAML ファイル、つまり接続プロファイルを作成します。このファイルをファブリックのクライアント SDK に渡します。SDK はそれを使用して、ファブリックネットワークに接続して対話します。
接続プロファイルを作成することによって 2 番目のアプローチを使用します。これはパート 3 の手順 3 で確認できます。ここでは、スクリプトを使用してネットワークの単純な接続プロファイルを生成します。
パート 3:RESTful API の手順に従って、Node.js RESTful API サーバーをデプロイするチェーンコードを公開します。
パート 4:Node.js/Angular ユーザーインターフェイスアプリケーションを実行する
ユーザーインターフェイスアプリケーションは、RESTful API サーバーによって提供される API を呼び出す Node.js/Angular アプリケーションです。ハイパーレジャーファブリックのクライアント SDK は使用されず、ファブリックネットワークへの接続もありません。代わりに、アプリケーション内の各アクションが対応する REST API 関数を呼び出します。
注目するべきところは、すべてのアプリケーションデータがファブリックネットワークによって所有されていることです。ギャラリーに表示されている画像以外で、すべてのデータは RESTful API とファブリックチェーンコードを介して、ファブリックワールドステータスのデータベースから取得されます。アプリケーションは、篤志家が寄付金の使い方を追跡できる機能を提供します。以下の機能を含みます。
- 篤志家は各非営利組織を見直し、資金を寄付し、評価することができます。
- 篤志家は、各非営利組織が資金を使った項目を表示し、寄付金を使用した各項目の金額を確認することができます。
- 篤志家は、個人的に行われた寄付金を追跡することができます。
アプリケーションをデプロイする手順は、他の Node.js アプリケーションと同じです。RESTful API のエンドポイントを Node.js アプリケーションに提供するには、少し編集が必要です。これについては、手順 3 で説明します。
パート 4:ユーザーインターフェイスの手順に従って Node.js ユーザーインターフェイスアプリケーションをデプロイします。
結論
この記事の手順をうまく完了できました。Amazon マネージドブロックチェーンを使用してハイパーレジャーファブリックのネットワークを構築し、チェーンコード、RESTful API、およびユーザーインターフェイスアプリケーションで構成される多層アプリケーションをデプロイしました。基になるデータソースとしてブロックチェーンを使用する、作業アプリケーションもデプロイしました。
ハイパーレジャーファブリックのネットワークから受信したブロックを表示するユーザーインターフェイスのスライダーコンポーネント以外に、基になるテクノロジがブロックチェーンであることをエンドユーザーに示すことはできません。ウェブやモバイルなどの複数のチャネルをサポートできる REST API を使用して、ブロックチェーンからアプリケーションを抽象化し、標準 WebSocket プロトコルを介してブロック通知を提供しました。
テストネットワークが分散型アーキテクチャでこのアプリケーションをシミュレートするには、次の手順として、ファブリックネットワークにメンバーを追加し、それらのメンバーに同じチャネルに参加するピアをプロビジョニングさせます。これは今後のブログ記事のトピックになります。
プレビューにサインアップして Amazon マネージドブロックチェーンをお試しください。
以下の皆様に感謝します。
- 優れた UI アプリケーションを構築した Siva Puppala、Khan Iftikhar、Rangavajhala Srikanth、Pentakota Deekshitulu
- 添付リポジトリのレビューとテストを担当した Michael Braendle
著者について
Michael Edge は、AWS プロフェッショナルサービスのシニアクラウドアーキテクトで、ブロックチェーン、コンテナ、マイクロサービスを専門としています。