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のドキュメントを参照してください。
- このタブのリンクを使用して、Hyperledger Fabric Java SDKをインストールできます。
- (Hyperledger Fabric v2.x) Oracle Blockchain Platformと連携するようにSDKを変更するには、Oracle Blockchain Platformと連携するようにHyperledger Fabric Java SDKを更新するの手順に従う必要があります。
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コンソールでレジャーをチェックして変更を確認できます:
- コンソールで「チャネル」タブに移動し、チェーンコードを実行しているチャネルの名前を見つけてクリックします。
- チャネルのレジャー・ペインで、チェーンコードのレジャー・サマリーを表示します。
Oracle Blockchain Platformと連携するためのHyperledger Fabric Go SDKの更新
Hyperledger Fabric Go SDKのNormalizeURL関数を更新して、KubernetesベースのバージョンのOracle Blockchain Platformで使用する必要があります。
- Hyperledger Fabric Go SDKの
client.goファイルを編集用に開きます。vendor/github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric-ca/lib/client.go - 次のコードに示すように、
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 = "" } . . . 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のサブプロジェクトです。
-
プロジェクトの依存関係をインストールします。
mvn install -
grpc-javaソース・コードをダウンロードします:git clone https://github.com/grpc/grpc-java.git fabric-sdk-javaプロジェクトが使用するgrpcバージョンを検索し、コードをチェックアウトします。grpc-javaディレクトリで、fabric-sdk-javaプロジェクトが使用するgrpcのバージョンのチェックアウトを行います:cd grpc-java && git checkout v1.38.0-
コードを変更して、サーバー側からの
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); -
パッチを適用:
git apply grpc-java.patch -
ターゲットのパッチ適用済パッケージを生成するプロジェクトを構築します。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で利用可能になります。 -
パッチが適用されたパッケージを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=jargroupid、artifactidおよびversionは、置換するパッケージと同じにしておく必要があります。 -
パッケージを手動で置き換えます。ローカルのMavenリポジトリに移動し、ターゲット・パッケージがあるディレクトリを探し、パッケージにパッチが適用されるパッケージと置き換えます。
-
-
プロジェクトを実行します。