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

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

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

ただし、オブジェクトレベルの制御を実現するために、多くの場合、既存のAPIエンドポイントをアプリケーション内にラップします。アプリケーションに、さらに詳細な操作を含めることができます。

SDKのバージョン

Hyperledger Fabric SDKの複数のバージョンを使用できます。インスタンスのベースとなるHyperledger Fabricのバージョンと一致するSDKのバージョンを使用します。

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 v2.x SDKを更新します

OCIインフラストラクチャ・コンポーネントと、Hyperledger Fabric v2.xで提供されるJava SDKには互換性がありません。この問題を解決するには、次のステップを実行します。

Hyperledger Fabric SDKの更新方法

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

  • 変更したパッケージをコンソールからダウンロードします。更新されたgrpc-netty-shaded-1.38.0.jarファイルが作成されています。これは、変更が必要なJava SDKで参照されるモジュールです。
  • この項の説明に従って、パッケージを手動でビルドします。

grpc-netty-shaded-1.38.0.jarファイルをダウンロードするには、コンソールの「開発者ツール」タブをクリックし、「アプリケーション開発」ペインを選択します。

パッケージの手動での構築

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

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

    git clone https://github.com/grpc/grpc-java.git
  3. fabric-sdk-javaが使用するgrpcバージョンを検索し、コードを確認します。
    grpc-javaディレクトリで、fabric-sdk-javaが使用するgrpcのバージョンを確認します:
    cd grpc-java && git checkout v1.38.0
  4. alpnエラーがサーバー側から発生しないようにコードを変更します。次の内容でgrpc-java-patchパッチ・ファイルを作成します。
    diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    index 19d3e01b7..ebc4786a3 100644
    — a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    +++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    @@ -611,7 +611,8 @@ final class ProtocolNegotiators {
    SslHandshakeCompletionEvent handshakeEvent = (SslHandshakeCompletionEvent) evt;
    if (handshakeEvent.isSuccess()) {
    SslHandler handler = ctx.pipeline().get(SslHandler.class);
    
        if (sslContext.applicationProtocolNegotiator().protocols()
        + if (handler.applicationProtocol() == null
        + || sslContext.applicationProtocolNegotiator().protocols()
        .contains(handler.applicationProtocol())) {
        // Successfully negotiated the protocol.
        logSslEngineDetails(Level.FINER, ctx, "TLS negotiation succeeded.", null);
  5. パッチを適用:

    git apply grpc-java.patch
  6. ターゲットのパッチ適用済パッケージを生成するプロジェクトを構築します。grpc-java-shadedプロジェクトを構築するにはgradleを使用します。

    cd netty/shaded
    gradle build -PskipAndroid=true -PskipCodegen=true

    ビルドの完了後、ターゲットにパッチ適用された.jarパッケージはgrpc-java/netty/build/libs/grpc-netty-shaded-1.38.0.jarで入手できます。

  7. パッチ済パッケージをMavenローカル・リポジトリに追加します。

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

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

Hyperledger Fabric v1.4.7 SDKをOracle Blockchain Platformと連携するように更新します

OCIインフラストラクチャ・コンポーネントと、Hyperledger Fabric v1.4.7で提供されるNode.jsとJava SDKには互換性がありません。この問題を解決するには、次のステップを実行します。

Hyperledger Fabric SDKの更新方法

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

  • Oracleスクリプトを使用して、インストール時にコードにパッチを適用するNode.js SDKまたはJava SDKをダウンロードしてインストールします。
  • この項の説明に従って手動で実行します。

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

  • Fabric Java SDK: Java SDKが参照するモジュールで、変更が必要なgrpc-netty-1.23.0.jarファイルが作成され、更新されています。
  • Fabric Node.js SDK: ユーザーがNode.js Fabricクライアント・パッケージをダウンロードしてインストールするために実行する標準Fabric npm install操作を置換するnpm_bcs_client.shスクリプトが作成されています。スクリプトは同じnpmコマンドを実行しますが、必要なコンポーネントにパッチを適用して再ビルドします。

Fabric Node.js SDKの手動更新

grpc-nodeモジュールを再ビルドして、ピアおよびオーダラを(TLS経由で) grpcsクライアントに接続するには、次の手順を実行します。
  1. grpcモジュールのビルド・スクリプトを実行せずに、fabric-clientをインストールします。
    npm install --ignore-scripts fabric-client
  2. Windowsでは、ALPNを明示的に無効にする必要があります

    • 次を変更してnode_modules/grpc/binding.gypを更新します:
      '_WIN32_WINNT=0x0600'
      to
      '_WIN32_WINNT=0x0600','TSI_OPENSSL_ALPN_SUPPORT=0'
    • https://github.com/nodejs/node/issues/4932で説明されている問題のため、Windowsでgrpc-nodeをビルドするには、まず<node_root_dir>/include/node/openssl/を削除する必要があります。次のコマンドを実行して、<node_root_dir>を見つけます:
      node-gyp configure
  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. fabric-sdk-javaが使用するgrpcバージョンを検索し、コードをチェックアウトします。

    fabric-sdk-javaのバージョンが異なると、grpcのバージョンも異なる場合があります。pom.xmlをチェックして、fabric-sdk-javaで使用されているgrpcバージョンを確認します。たとえば、fabric-sdk-java 1.4.11は、そのpom.xml: https://github.com/hyperledger/fabric-sdk-java/blob/v1.4.11/pom.xmlにあるgrpc-java 1.23.0を使用します。

    grpc-javaディレクトリで、fabric-sdk-javaが使用するgrpcのバージョンをチェックアウトします:
    git checkout -b v1.23.0
  4. alpnエラーがサーバー側から発生しないようにコードを変更します。
    • ターゲット・コードであるgrpc-java_root/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.javaを変更します
    • userEventTriggered0関数で、次を変更します:
      if (NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
      to
      if (handler.applicationProtocol() == null || NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
      コードは次のようになります:
          @Override
          protected void userEventTriggered0(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);
            ...
          }
  5. ターゲットのパッチ適用済パッケージを生成するプロジェクトを構築します。grpc-javaプロジェクトを構築するにはgradleを使用します。または、grpc nettyディレクトリgradle buildgrpc-nettyサブプロジェクトのみ再ビルドすることもできます。

    ビルドの完了後、ディレクトリgrpc-java\netty\build\libs\grpc-netty-1.23.0.jarでターゲットにパッチ適用されたjarパッケージを取得できます。

  6. パッチ済パッケージをMavenローカル・リポジトリに追加します。

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

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