Gateway

対象読者: アーキテクト、アプリケーションおよびスマートコントラクト開発者

ゲートウェイは、ビジネスロジック開発に注力するために、アプリケーションの代理としてネットワークでのやりとりを管理するものです。アプリケーションはゲートウェイに接続し、それに続く全てのネットワークやりとりはゲートウェイの構成により管理されます。

このトピックでは、次のことについて扱います。

Scenario

Hyperledger Fabricネットワークのチャネルは常に変化することがあります。ネットワーク内の異なる組織に存在するピア、ordererとCAは、絶えず入れ替わります。それは、ビジネス需要の変化や計画済みもしくは計画されていないシステム停止に柔軟に対応するためです。ビジネス課題を解決することに専念するために、ゲートウェイはアプリケーション開発の負担を減らします。

gateway.scenario

MagnetoCorp と DigiBankのアプリケーション(発行と購入)は、ネットワーク上のやり取りをそれぞれのゲートウェイに委譲しています。それぞれのゲートウェイは、MagnetoCorp と DigiBankの2組織の複数のピアとordererで構成するネットワークチャネルトポロジを把握しており、アプリケーションと切り離すことでビジネスロジックの開発に専念することを可能にします。ピアはゴシッププトロコルを使用して組織内及び組織外のピアとやり取りします。

ゲートウェイは2つの異なる方法によってアプリケーションで使用されます。:

  • 静的: ゲートウェイの設定は、全て コネクションプロファイルで定義します。アプリケーションから使用される全てのピア、ordererとCAは、コネクションプロファイルで静的に定義し、ゲートウェイを設定します。例えば、ピアに関しては、エンドーシングピアかイベント通知ハブかのロールをコネクションプロファイルに設定します。コネクションプロファイルに設定するロールの詳細については、コネクションプロファイルを参照してください。

    SDKは、トランザクション送信と通知プロセスを管理するために、ゲートウェイコネクションオプションとともに、この静的トポロジを使用します。コネクションプロファイルは、ゲートウェイがアプリケーションの代わりにネットワークとのやり取りを実施するために十分なネットワークトポロジ、つまり、ネットワークチャネル、組織、orderer、ピアやそれらのロールなどを含む必要があります。

  • 動的: ゲートウェイの設定はコネクションプロファイルで最小限に定義します。基本的にはアプリケーションの組織から使用する1つもしくは2つのピアが指定されており、使用可能なネットワークトポロジを見つけるためにサービスディスカバリが使用されています。これにピア、orderer、チャネル、デプロイされたスマートコントラクトとそのエンドースメントポリシーが含まれます。(本番環境では、可用性を踏まえて、ゲートウェイ設定に少なくとも2つのピアを指定することが良いです。)

    SDKは、トランザクション送信と通知プロセスを管理するために、ゲートウェイコネクションオプションとともに、静的及び見つかった全てのトポロジ情報を使用します。その中で、インテリジェントに見つかったトポロジを使用します。例えば、スマートコントラクトのエンドースメントポリシーを実行する際に必要な最少のエンド―シングピアを算出 します。

静的か動的か、どちらのゲートウェイを使用するべきか、気になりますよね?どちらを選んでも、予見可能性と反応性にトレードオフが存在します。静的ネットワークは、ネットワークは変化していないと捉え、常に同じ挙動になります。これは予見可能ということを示し、使用可能であれば常に同じピアとordererを使用します。動的ネットワークは、ネットワークがどの様に変化したかを捉え、より敏感に反応します。これにより、新しく追加されたピアとordererを使用し、予見可能性を低下させる一方で、レジリエンスとスケーラビリティ向上をもたらします。一般的には、動的ネットワークを使用する方が良く、ゲートウェイのデフォルトモードは、動的ネットワークです。

静的でも動的でも、同じ コネクションプロファイルを使用出来ます。明確に静的ゲートウェイを使用する場合、コネクションプロファイルの記載量は多くなります。一方で、動的ゲートウェイを使用する場合は、わずかな記載量になります。

どちらの形式のゲートウェイもアプリケーションに対しては透過的です。アプリケーションのプログラム設計は、静的・動的ゲートウェイのどちらを使用したとしても変わりません。これは、アプリケーションはサービスディスカバリを使用する場合もあれば使用しない場合もあることを意味します。一般的に、SDKにより動的ディスカバリを使用することで定義量を少なく出来、インテリジェントに動作出来ます。これがデフォルトです。

Connect

アプリケーションをゲートウェイに接続する際に、2つのオプションがあります。これらは、SDKの処理で使用されています。

  await gateway.connect(connectionProfile, connectionOptions);
  • コネクションプロファイル: コネクションプロファイルは、静的か動的かに関わらず、SDKによるトランザクション処理で使用されるゲートウェイの設定です。YAMLもしくはJSONの形式で記載し、ゲートウェイに渡す際はJSONオブジェクトに変換する必要があります。:

    let connectionProfile = yaml.safeLoad(fs.readFileSync('../gateway/paperNet.yaml', 'utf8'));
    

    詳細については、コネクションプロファイルを参照し、設定してください。

  • コネクションオプション: コネクションオプションは、アプリケーションにトランザクション処理のふるまいを示します。コネクションオプションは、ネットワークコンポーネントとのやり取りのパターンを制御するためにSDKによって解釈されます。例えば、どのアイデンティを使用して接続するのか、どのピアをイベント通知の際に使用するのかを、を設定します。これらのオプションは、機能性を低下させることなくアプリケーションの複雑さを減らします。これは、アプリケーションに求められる多くの低レベルなロジックをSDKで実装されているためです。コネクションオプションは、このロジックフローを制御します。

    詳細については、コネクションオプションを参照し、設定してください。

Static

静的なゲートウェイは、固定のネットワークビューを定義します。MagnetoCorp scenarioにおいて、ゲートウェイはMagnetoCorpの1つのピア、DigiBankの1つのピアとMagentoCorpのordererを識別します。もう1つの方法として、ゲートウェイは、MagnetoCorpとDigiBankの全ての ピアとordererを定義します。どちらの方法でも、コマーシャルペーパートランザクションがエンドースされ分散されるのに十分なネットワークビューをゲートウェイは定義しなければなりません。

gateway.connect() APIのコネクションオプションdiscovery: { enabled:false }を明示的に指定することで、アプリケーションは静的ゲートウェイを使用出来ます。もう1つの方法として、環境変数FABRIC_SDK_DISCOVERY=falseを指定することで常に静的ゲートウェイを使用出来ます。

MagnetoCorpで使用される発行アプリケーションのコネクションプロファイルを確認してください。ロールを含めて、全てのピア、ordererとCAがこのファイルに記載されています。

静的ゲートウェイは、その時点 でのネットワークビューを表していることを念頭に置かなければなりません。ネットワークが変わった場合、その変更点をゲートウェイファイルに反映する必要があります。再度ゲートウェイファイルを読込むことで、アプリケーションはその変更を自動的に取り込みます。

Dynamic

動的ゲートウェイは、ネットワークの固定の開始点 を定義します。MagnetoCorpのシナリオにおいて、動的ゲートウェイはMagnetoCorpの1つのピアのみを識別し、他の全ては後に見出します。(レジリエンシーを向上させるためには、ブートストラップピアを2つ定義することが良いです。)

もしサービスディスカバリがアプリケーションで選択されている場合、ゲートウェイファイルで定義されるトポロジは、サービスディスカバリによって拡張されていきます。サービスディスカバリはゲートウェイ定義から始まり、ゴシッププロトコルを用いて、MagnetoCorp組織内にある全てのピアとordererを見つけ出します。もしアンカーピアがチャネル内で設定されている場合、サービスディスカバリは接続している他組織のコンポーネントを見つけ出すために、組織を越えてゴシッププロトコルを用います。この処理は、チャネルレベルで定義されピアにインストールされているスマートコントラクトとそれらに紐づくエンドースメントポリシーも見つけ出します。静的ゲートウェイと同様に、見つけ出したネットワークは、コマーシャルペーパートランザクションがエンドースされ分散されるのに十分である必要があります。

gateway.connect() APIのコネクションオプションdiscovery: { enabled:true }を明示的に指定することでアプリケーションは動的ゲートウェイを使用出来ます。もう1つの方法として、環境変数FABRIC_SDK_DISCOVERY=trueを指定することで常に動的ゲートウェイを使用出来ます。

動的ゲートウェイは最新のネットワークビューを表します。ネットワークが変われば、サービスディスカバリは、アプリケーションに対して、ネットワークビューが正確に反映をされていることを保証します。アプリケーションは自動的に変更箇所を取り込みます。また、アプリケーションはゲートウェイファイルを再読み込みする必要はありません。

Multiple gateways

最後に、アプリケーションは、同じもしくは異なるネットワークで複数のゲートウェイを定義出来ます。さらに、アプリケーションは同じゲートウェイを静的にも動的にも使用出来ます。

複数のゲートウェイを使用することでいくつかのメリットがあります。以下に具体的なメリットを示します。:

  • 異なるユーザのリクエストを処理することが可能
  • 異なるネットワークへの同時接続が可能
  • 新たなネットワーク設定を、既存設定と同時に比較したテストが可能