Hyperledger Fabric SDKを使用したアプリケーションの開発

アプリケーションでは、ソフトウェア開発キット(SDK)を使用して、台帳に対する問合せおよび更新を許可するAPIにアクセスします。Hyperledger Fabric SDKをインストールして使用し、Oracle Blockchain Platform用のアプリケーションを開発できます。

Oracle Blockchain Platformに用意されているREST APIは、柔軟性を最大限に考慮して作成されており、トランザクションの呼出し、問合せの呼出し、トランザクションのステータスの表示が可能です。『Oracle Blockchain Platform REST API』を参照してください。

ただし、オブジェクトレベルの制御を実現するために、既存のAPIエンドポイントをアプリケーション内にラップする必要が生じる可能性が高くなります。アプリケーションに、精緻な操作を含めることができます。

SDKのバージョン
  • Oracle Blockchain Platformファウンダ・インスタンスが19.2.3または19.3.2を使用して作成されている場合、Hyperledger Fabric SDKのV1.4をサポートしています。

Hyperledger Fabric SDK for Node.jsのインストール

Fabric SDK for Node.jsの使用方法に関する情報は、次の場所にあります: Hyperledger Fabric SDK for Node.jsのドキュメント

開発者ツール・タブで、アプリケーション開発ペインを開きます。

Hyperledger Fabric SDK for Javaのインストール

Fabric SDK for Javaの使用方法に関する情報は、次の場所にあります: Hyperledger Fabric SDK for Javaのドキュメント

開発者ツール・タブで、アプリケーション開発ペインを開きます。

Apache Mavenなどのビルド・ツールをインストールします。

アプリケーションの構造化

Javaアプリケーションは、次のような構造にする必要があります:

/Application
  /artifacts
    /cypto
      /orderer
        Contains the certificates required for the application to act on the orderer node
        In participant instances only contains TLS certificates
      /peer
        Contains the certificates required for the application to act on the peer node
    /src
      chaincode.go if installing and deploying chaincode to the blockchain
  /java
    pom.xml or other build configuration files
    /resources
      Any resources used by the Java code, including artifacts such as the endorsement policy yaml file and blockchain configuration properties
    /src
      Java source files

Node.jsアプリケーションは、次のような構造にする必要があります:

/Application
  /artifacts
    /cypto
      /orderer
        Contains the certificates required for the application to act on the orderer node
        In participant instances only contains TLS certificates
      /peer
        Contains the certificates required for the application to act on the peer node
    /src
      chaincode.go if installing and deploying chaincode to the blockchain
  /node
    package.json file
    application.js
    /app
      Any javascript files called by the application
      /tools

アプリケーションの実行

アプリケーションを実行してテストする準備ができました。アプリケーションから返されたステータス・メッセージに加えて、Oracle Blockchain Platformコンソールで台帳をチェックして変更を確認できます:

  1. コンソールでチャネル・タブに移動し、ブロックチェーンを実行しているチャネルの名前を見つけてクリックします。
  2. チャネルの台帳ペインで、チェーンコードの台帳のサマリーを表示します。

Oracle Blockchain Platformと連携するためのHyperledger Fabric SDKの更新

OCIインフラストラクチャ・コンポーネントと、Fabricで提供されるNode.jsとJava SDKとの間には互換性がありません。このトピックのステップに従ってこの問題を修正します。

Fabric SDKの更新方法

SDKの更新には2つの方法があります:

  • Oracleスクリプトを使用してNode.js SDKまたはJava SDKをダウンロードしてインストールし、インストール時にコードにパッチを適用します。

  • この項の説明に従って、手動で行います。

スクリプトを使用するには、コンソールの開発者ツール・タブで、アプリケーション開発ペインを選択します。Node.js SDKとJava SDKの両方をダウンロードするリンクには、インストール時にコードにパッチを適用する更新が組み込まれています。

  • Fabric Java SDK: Java SDKが参照するモジュールで、変更が必要なgrpc-netty-1.15.0.jarファイルが更新されています。

  • Fabric Node.js SDK: Node.js Fabricクライアント・パッケージをダウンロードおよびインストールするためにユーザーが実行する標準Fabric npm install操作を置き換えるnpm_bcs_client.shスクリプトがあります。スクリプトは同じnpmコマンドを実行しますが、必要なコンポーネントにパッチを適用し、再ビルドします。

Go SDKには同様の非互換性の問題がないため、更新する必要はありません。

Fabric Node.js SDKの手動更新

次の手順を実行してgrpc-nodeモジュールを再ビルドし、ピアおよびオーダラを(tls経由で)grpcsクライアントに接続します。
  1. grpcモジュールのビルド・スクリプトを実行せずに、fabric-clientをインストールします:
    npm install --ignore-scripts fabric-client
  2. コードを変更して、サーバー側からのalpnエラーを回避します。

    • ターゲット・コードであるnode_modules/grpc/deps/grpc/src/core/lib/security/security_connector/security_connector.ccを変更します
    • 関数ssl_check_peerを次のように変更します:
      static grpc_error* ssl_check_peer(grpc_security_connector* sc,
                                        const char* peer_name, const tsi_peer* peer,
                                        grpc_auth_context** auth_context) {
        /* Check the ALPN. */
        const tsi_peer_property* p =
            tsi_peer_get_property_by_name(peer, TSI_SSL_ALPN_SELECTED_PROTOCOL);
         if (false) {
          return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
              "Cannot check peer: missing selected ALPN property.");
        }
         if (p != nullptr && !grpc_chttp2_is_alpn_version_supported(p->value.data, p->value.length)) {
          return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
              "Cannot check peer: invalid ALPN value.");
        }
      
        ...
      }
      
    • ターゲット・コードであるnode_modules/grpc/binding.gypを変更します。
    • 変数grpc_alpnをfalseに変更します:
      'grpc_alpn%': 'false'
  3. grpcを再ビルドします

    npm rebuild --unsafe-perm --build-from-source
これで、必要な他のモジュールをインストールしてプロジェクトを実行できます。

Fabric Java SDKの手動更新

fabric-sdk-javaの場合は、次のステップに従ってgrpc-nettyパッケージを再ビルドし、ピアおよびオーダラを(tls経由で)grpcsクライアントに接続します。grpc-nettygrpc-javaのサブプロジェクトです。

  1. プロジェクトの依存関係をインストールします:
    mvn install
  2. grpc-javaソース・コードをダウンロードします:

    git clone https://github.com/grpc/grpc-java.git
  3. コードを変更して、サーバー側からのalpnエラーを回避します。
    • ターゲット・コードであるgrpc-java_root/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.javaを変更します

    • 関数userEventTriggeredを次のように変更します:
      private static class BufferUntilTlsNegotiatedHandler extends AbstractBufferingHandler
            implements ProtocolNegotiator.Handler {
      
          ...
      
          @Override
          public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            ...
                if (handler.applicationProtocol() == null 
                    || NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
                  // Successfully negotiated the protocol.
                  logSslEngineDetails(Level.FINER, ctx, "TLS negotiation succeeded.", null);
            ...
        }
      
  4. プロジェクトをビルドして、ターゲットにパッチが適用されたパッケージを生成します。Gradleを使用してgrpc-javaプロジェクトをビルドします。あるいは、gradle buildでgrpc nettyディレクトリのgrpc-nettyサブプロジェクトのみ再ビルドすることもできます。

    ビルドが完了したら、ディレクトリgrpc-java\netty\build\libs\grpc-netty-1.15.0.jarにターゲットにパッチが適用されたjarパッケージがあります。

  5. パッチが適用されたパッケージをMavenのローカル・リポジトリに追加します。

    次の2つの方法のどちらかで、公式にgrpc-netty jarパッケージをパッチが適用されたパッケージに置き換えます:
    • Mavenを使用してローカル・ファイルでパッケージをインストールします:
      mvn install:install-file -Dfile=local_patched_grpc_netty_package_root/grpc-netty-1.15.0.jar -DgroupId=io.grpc -DartifactId=grpc-netty -Dversion=1.15.0 -Dpackaging=jar
      ターゲットのgroupidartifactidおよびversionは、置換するパッケージと同じにしておく必要があります。
    • パッケージを手動で置換します。ローカルのMavenリポジトリに移動し、ターゲット・パッケージがあるディレクトリを探し、パッケージをパッチが適用されたパッケージと置き換えます。

  6. プロジェクトを実行します。