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

Hyperledger Fabric SDKは非推奨になりました。ただし、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 Node.js SDKをインストールできます。

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 Go SDKの更新

Hyperledger Fabric Go SDKのNormalizeURL関数を更新して、KubernetesベースのバージョンのOracle Blockchain Platformで使用する必要があります。

  1. Hyperledger Fabric Go SDKのclient.goファイルを編集用に開きます。vendor/github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/lib/client.go
  2. 次のコードに示すように、NormalizeURL関数を更新します。
    編集前のNormalizeURL関数:
    // NormalizeURL normalizes a URL (from cfssl)
    func NormalizeURL(addr string) (*url.URL, error) {
    	addr = strings.TrimSpace(addr)
    	u, err := url.Parse(addr)
    	if err != nil {
    		return nil, err
    	}
    	if u.Opaque != "" {
    		u.Host = net.JoinHostPort(u.Scheme, u.Opaque)
    		u.Opaque = ""
    	} else if u.Path != "" && !strings.Contains(u.Path, ":") {
    		u.Host = net.JoinHostPort(u.Path, "")
    		u.Path = ""
    	} else if u.Scheme == "" {
    		u.Host = u.Path
    		u.Path = ""
    	}
    	if u.Scheme != "https" {
    		u.Scheme = "http"
    	}
    .
    .
    .
    編集後のNormalizeURLファンクション:
    // NormalizeURL normalizes a URL (from cfssl)
    func NormalizeURL(addr string) (*url.URL, error) {
    	addr = strings.TrimSpace(addr)
    	u, err := url.Parse(addr)
    	if err != nil {
    		return nil, err
    	}
    	if u.Opaque != "" {
    		u.Host = net.JoinHostPort(u.Scheme, u.Opaque)
    		u.Opaque = ""
    	} else if u.Host != "" && !strings.Contains(u.Host, ":") {
    		u.Host = net.JoinHostPort(u.Host, "")
    		u.Path = ""
    	} else if u.Scheme == "" {
    		u.Host = u.Path
    		u.Path = ""
    	}
    .
    .
    .
  3. client.goファイルを保存します。

Oracle Blockchain Platformと連携するようにHyperledger Fabric Java SDKを更新する

OCIインフラストラクチャ・コンポーネントと、Hyperledger Fabric v2.xで提供されているJava SDKには互換性がありません。SDKをOracle Blockchain Platformで使用するように更新する必要があります。

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パッケージを再構築し、ピアおよびオーダラは(TLS経由で)grpcsクライアントに接続します。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. ターゲットのパッチ適用済パッケージを生成するプロジェクトを構築します。Gradleを使用してgrpc-java-shadedプロジェクトをビルドします:

    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. プロジェクトを実行します。