Smart Contracts

Prev Next

VPC環境で利用できます。

チャンネル管理

チャンネルは、コンソーシアム内の特定グループ(MSPの集合)のトランザクションを処理するための1つのサブネットワークの役割を果たします。
Ordererのコンソーシアム管理は、Ordererが管理するすべての MSPを指定することであり、チャンネルのメンバー管理はコンソーシアム内の多数の MSPのうち、特定チャンネルにのみ参加する MSPを別途指定することを意味します。

チャンネル作成

チャンネルを作成する方法は次の通りです。

参考

チャンネルを作成する前にメンバー(MSP)について、まずコンソーシアムを構築する必要があります。詳細は、Ordererコンソーシアム構築をご参照ください。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストでチャンネルを作成するネットワークをクリックします。
  3. [Channels] タブをクリックした後、[Channel作成] ボタンをクリックします。
  4. チャンネルの作成情報を指定した後、 [作成] ボタンをクリックします。
    • チャンネルが作成されます。
  • チャンネルメンバーのロールは、Operator(運用者)と Participant(参加者)のどちらかを選択でき、Operatorは1人(必須)のみ指定できます。Operatorを1人を指定すると、その後に指定される MSPはすべて Participant(参加者)のロールを持つことになります。
  • チャンネルは Ordererが管理し、1人の Ordererが多数のチャンネルを管理できます。
参考

チャンネルは、このチャンネルに接続された Ordererが削除されると、チャンネルリストから削除されますが、実際には削除されません。チャンネル名は、削除した既存の名前と別の名前を使用します。

チャンネル詳細情報を確認

チャンネルの詳細情報を確認する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストでチャンネルを確認するネットワークをクリックします。
  3. [Channels] タブをクリックします。
  4. 確認するチャンネルをクリックします。
    • チャンネルの詳細情報が表示されます。

チャンネルリスト画面の各項目に関する説明は、次の通りです。

blockchain-channel_ko

領域 説明
Channel作成 新しいチャンネル作成
Channel設定 選択したチャンネルのメンバー(MSP)と Peer管理、Block作成のポリシー設定
③ チャンネル項目 チャンネル基本情報を確認
詳細情報 チャンネル詳細情報を確認
Block照会 チャンネルのブロックとトランザクションを照会
Channelメンバー チャンネルメンバー(MSP)情報を確認
Peer情報 チャンネルに参加する Peer情報を確認

Block&Transaction照会

作成したチャンネルに属する Blockや Transactionを照会できます。

Blockまたは Transactionを照会する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストで当該ネットワークをクリックします。
  3. [Channels] タブをクリックします。
  4. チャンネルリストでチャンネルを選択した後、 [Block照会] ボタンをクリックします。
  5. 照会したい BlockNumberまたは TransactionIDを入力した後、chaincode_search_ko ボタンをクリックします。
  6. トランザクションの詳細な情報を知りたい場合、照会した TransactionID値をクリックします。
    • 初回ポップアップロード時に、最新ブロックが自動で照会されます。

チャンネルメンバー(MSP)管理

作成したチャンネルにメンバーを新しく追加したり、既存のメンバーを削除できます。

チャンネルメンバー(MSP)を管理する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストで当該ネットワークをクリックします。
  3. [Channels] タブをクリックします。
  4. チャンネルリストからチャンネルメンバー(MSP)を管理するチャンネルを選択した後、 [Channel設定] ボタンをクリックします。
  5. Channelメンバー(MSP)管理 をクリックします。
  6. チャンネルメンバー(MSP)管理のポップアップでメンバー追加または削除した後、 [確認] ボタンをクリックします。
  • 既に Operatorが指定されている場合、Operatorを削除したり、新しい Operatorを追加できません。

チャンネル内の Peer管理

作成したチャンネルに、実際の通信に参加する Peerを新しく追加(join)したり、Peerに Anchor Peerを適用できます。

チャンネル内の Peerを管理する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストで当該ネットワークをクリックします。
  3. [Channels] タブをクリックします。
  4. チャンネルリストからチャンネルメンバー(MSP)を管理するチャンネルを選択した後、 [Channel設定] ボタンをクリックします。
  5. Peer管理 をクリックします。
  6. Peer追加と Anchor Peer設定が完了したら、 [閉じる] ボタンをクリックします。
  • 追加(join)された Peerは解約できません。
  • Peerは、すべて同じデータベースを使用する必要があります。
参考

Anchor Peerは、他の組織(organization)の Peerに対して互いに情報を交換する役割を果たします。詳細は、以下をご参照ください。

Hyperledger Fabricガイドに移動する

ブロック作成ポリシー設定

チャンネルにブロック(Block)作成ポリシーを設定する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストで当該ネットワークをクリックします。
  3. [Channels] タブをクリックします。
  4. チャンネルリストからチャンネルメンバー(MSP)を管理するチャンネルを選択した後、 [Channel設定] ボタンをクリックします。
  5. Block作成ポリシー設定 をクリックします。
  6. Block作成ポリシーを設定した後、 [確認] ボタンをクリックします。
  • 基準ブロックのサイズ、最大ブロックのサイズは整数型または小数点第一位までのみ入力できます。
  • デフォルト値を変更する場合、トランザクションの処理性能に影響を与える可能性があります。
参考

チャンネル構成(Configuration)に関する詳細は、以下をご参照ください。

Hyperledger Fabricガイドに移動する

チェーンコード管理

チェーンコードのインストール

ネットワーク内に作成された Peerにチェーンコードをインストールできます。

参考
注意
  • Kubernetesクラスタのネットワークタイプで Private Subnetを使用する場合、チェーンコードで外部ライブラリを使用するか、別の VPC間のネットワークを招待するために NATGWを使用します。

チェーンコードをインストールする方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。

  2. ネットワーク名 のドロップダウンリストでチェーンコードをインストールするネットワークをクリックします。

  3. [Chaincodes] タブをクリックした後、[Chaincodeインストール] ボタンをクリックします。

  4. チェーンコードのインストールポップアップの マウスでファイルをドラッグするか、ここをクリックしてください 領域に CDSパッケージファイルをドラッグするか、 マウスでファイルをドラッグするか、ここをクリックしてください をクリックして CDSパッケージファイルを選択した後、 [次へ] ボタンをクリックします。

    注意

    CDSパッケージに含まれているチェーンコードのメタ情報(名前、バージョン)が同じパッケージを再度アップロードする場合、既にアップロードされたパッケージを使用します。バージョン管理にご注意ください。

  5. アップロードしたチェーンコード(CDSパッケージ)をインストールする Peerを選択した後、 [インストール] ボタンをクリックします。

    • チェーンコードが既にインストールされている Peerには、 インストール済み と表示されます。
    • チェーンコード2.2バージョンは、ノード機能レベルのバージョン1.4がリリースされるため、チェーンコードのライフサイクル(chaincode lifecyle)機能は現在ご利用できません。その他、2.2バージョンの新規機能は正常に適用されます。
    • インストールされたチェーンコードで実際にトランザクション処理を行うには、インストールされたチェーンコードをインスタンス化する必要があります。詳細は、チェーンコードのインスタンス化をご参照ください。
参考

インストールされたチェーンコードは削除できません。インスタンス化まで完了した場合、 [ログを見る] ボタンをクリックし、チェーンコードのコンテナログを確認できます。

チェーンコード詳細情報の確認

ネットワークにインストールされたチェーンコードの詳細情報を確認する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンリストでチェーンコードを確認するネットワークをクリックします。
  3. [Chaincodes] タブをクリックします。
  4. 確認するチェーンコードをクリックします。
    • チェーンコードの詳細情報が表示されます。

チェーンコードリスト画面の各項目に関する説明は、次の通りです。

blockchain-new-contract-ko

領域 説明
Chaincodeインストール 新しいチェーンコードのインストール
インスタンス化 チェーンコードをインスタンス化
バージョン変更 インスタンス化されているチェーンコードバージョンを変更
④ 検索ボックス 検索条件を設定した後、chaincode_search_ko ボタンをクリックして項目を検索
⑤ チェーンコードの詳細情報 インストールされたチェーンコードとインスタンス化されたチェーンコード情報の確認
⑥ チェーンコード実行 インスタンス化されたチェーンコードの実行

チェーンコードのインスタンス化

チェーンコードをインストールした後、インスタンス化の過程を経てからトランザクション処理を行えます。

チェーンコードをインスタンス化する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。

  2. ネットワーク名 のドロップダウンリストでチェーンコードを確認するネットワークをクリックします。

  3. [Chaincodes] タブをクリックし、[インスタンス化] ボタンをクリックします。

  4. チェーンコードのインスタンス化項目を設定した後、 [確認] ボタンをクリックします。

    • トランザクション保証メンバー : ドランザクション保証メンバーに MSPを追加するには、Ordererのコンソーシアム構築機能で MSPを追加します。
    • トランザクション保証ポリシー : トランザクション保証メンバーが多数の場合、トランザクション保証ポリシーを1/2、2/3のように設定できます。トランザクション保証ポリシーが2/3というのは、3つの保証メンバーのうち、2つ以上の保証メンバーから保証を受ける必要があることを意味します。
    • 初期化関数実行 : チェーンコードに初期化関数を指定した場合、インスタンス時にその関数を実行できます。
参考
  • インスタンス化には数分かかります。コンソールの一番右上にある [通知] ボタンで結果を確認できます。
  • インスタンス化に成功すると、インスタンス化されたチェーンコードリストで照会できます。
  • インスタンス化されたチェーンコードは削除できません。

チェーンコードバージョン変更(アップグレード)

一度インスタンス化されたチェーンコードは、新しいバージョンをインストールすると、再度インスタンス化する代わりにバージョン変更を行います。
現在インスタンス化されたチェーンコードバージョンよりも上位のバージョンがインストールされると、インスタンス化されたチェーンコードリストの当該チェーンコードバージョンに アップグレード可能 バッジが表示されます。

インスタンス化されたチェーンコードバージョンを変更する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。

  2. ネットワーク名 のドロップダウンリストでチェーンコードをアップグレードするネットワークをクリックします。

  3. [Chaincodes] タブをクリックした後、[バージョン変更] ボタンをクリックします。

  4. チェーンコードのアップグレード項目を設定した後、 [確認] ボタンをクリックします。

    • トランザクション保証メンバー : ドランザクション保証メンバーに MSPを追加するには、Ordererのコンソーシアム構築機能で MSPを追加します。
    • トランザクション保証ポリシー : 例) トランザクション保証ポリシーが2/3というのは、3つの保証メンバーのうち、2つ以上の保証メンバーから保証を受ける必要があることを意味します。
    • 初期化関数実行 : チェーンコードに初期化関数を指定した場合、インスタンス時にその関数を実行できます。
参考
  • バージョンを変更するには、インストールしたチェーンコードの名前を同じにしてください。
  • バージョン変更には数分かかります。コンソールの一番右上にある [通知] ボタンで結果を確認できます。
  • バージョン変更に成功すると、インスタンス化されたチェーンコードリストで照会できます。

チェーンコード実行

インスタンス化されたチェーンコードは [Chaincode実行] ボタンで実行できます。

チェーンコードを実行する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Smart Contracts メニューを順にクリックします。
  2. ネットワーク名 のドロップダウンメニューで実行したいチェーンコードがインストールされたネットワークをクリックします。
  3. [Chaincodes] タブをクリックして インスタンス化された Chaincodeリスト で呼び出したいチェーンコードを選択した後、[Chaincode実行] ボタンをクリックします。
  4. 希望するコマンド(Invoke/Query)、契約名、関数名、パラメータを入れて、 [実行] ボタンをクリックします。
参考
  • 契約名はチェーンコードが Multi Contractになっている場合、入力してください。
  • チェーンコードの呼び出し時にチェーンコードを呼び出した mspId、Identity、チェーンコードのレスポンス値を確認できます。
  • パラメータは呼び出す関数のパラメータと同じ順序で追加します。
  • 送信パラメータがオブジェクトの場合、以下のように JSON形式で追加します。
    {"carNumber":"CAR1001","color":"red"}
    

チェーンコードリリース構成の変更

Ncloud Kubernetes Serviceは、今後 worker nodeで docker.sockファイルを削除して運用することにより、以下のように docker.sockファイルがインストールされたコンテナにチェーンコードコンテナをリリースする方式に変更されます。

  • AS-IS
    image-5GIN2YZF

  • TO-BE
    image-JTT8UPJC

2023.12.21以前にノードを構成してチェーンコードをリリースした場合、以下のような手続きを経てノード構成を変更し、再起動する必要があります。

  1. Kubernetesクラスタで Peerノードの deployment.yamlを input.yamlファイルで保存します。
    $ kubectl -n [namespace] get deploy [peer deployment yaml] - o yaml > input.yaml
    
参考

namespaceを確認する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、 i_menu > Services > Blockchain > Blockchain Service > Networks メニューを順にクリックします。
  2. [ネットワークリスト] タブで namespaceを確認するネットワークをクリックします。
  3. 詳細情報の ロードバランサ名(Instance No) の値で先頭の文字列が bcの場合、ingress以降を除いた部分が namespaceです。
    image-6NAF3M4S
  1. 以下の変換ツールを用いて1で作成した input.yamlの内容を変更します。

    変換ツールファイル(圧縮解除後、OS環境に適するファイルを使用します)
    $ ./blockchain-migrtation_darwin_amd64 -r blockchain.kr.private-ncr-ntruss.com -i input.yaml -o output.yaml
    
  2. 変更された output.yamlファイルを適用します。

    $ kubectl apply -f output.yaml -n [namespace]
    
注意
  • 上記のタスクに従って、既にリリースされたノードは変更・再起動を行います。その過程で約1程度の downtimeが発生する場合があります。
  • 上記のタスクを実行しない場合、Kubernetesクラスタのバージョンアップグレード、worker nodeを追加するなどの変更事項が発生すると、既存動作に影響を与える可能性があります。

アプリケーション開発

Hyperledger Fabricでアプリケーションを開発する手順は、以下のように構成されています。

  1. チェーンコードの開発
  2. チェーンコードのパッケージング
  3. チェーンコードのインストールとインスタンス化、アップグレード
  4. アプリケーションの開発、ビルド、実行

1. チェーンコードの開発

Hyperledger Fabricでは、Go、Java、Javascriptの3つの言語に対してチェーンコードの開発をサポートするライブラリである Chaincode Shim APIを提供します。ライブラリは Hyperledger Fabricのバージョンに応じて差があるため、ブロックチェーンサービスを利用する際は、バージョンに適したライブラリを使用する必要があります。各言語ごとのバージョンに合うライブラリを選択し、ビルド環境を構成する方法は、以下の参考リンクのうち、 チェーンコードのサンプル をご参照ください。

ブロックチェーンにデータを保存したり、読み取るためのインターフェースは、ChaincodeStubInterfaceです。ChaincodeStubInterfaceは、putState(key, value)getState(key)などの関数を提供して、key/value形式でブロックチェーンにデータを保存するようにサポートします。詳細は以下の参考リンクのうち、 チェーンコードの開発ガイド をご参照ください。

参考

チェーンコードの開発に関する詳細は、以下をご参照ください。

注意

Hyperledger Fabric 1.4バージョンのリリース以降、Go言語の Chaincode Shim APIはライブラリのパスが一部変更されました。そのため、1.4バージョン用のチェーンコードサンプルでは、import構文を以下の 変更後 構文に変更してください。

  • 変更前
import (
    "github.com/hyperledger/fabric/core/chaincode/shim"
    sc "github.com/hyperledger/fabric/protos/peer"
)
  • 変更後
import (
    "github.com/hyperledger/fabric-chaincode-go/shim"
    "github.com/hyperledger/fabric-chaincode-go/shimtest"
    sc "github.com/hyperledger/fabric-protos-go/peer"
)
注意

Hyperledger Fabric 2.xバージョンでは、Chaincode Shim API以外に Contract APIを提供してチェーンコードの開発をサポートしています。Contract APIは Hyperledger Fabric 1.4バージョン用のライブラリも提供されるため、NAVERクラウドの Blockchain Serviceでも使用できます。ただし、Contract APIを利用したチェーンコードサンプルは、Hyperledger Fabric 2.xバージョンを基準に作成されていますので、ご注意ください。

2. チェーンコード(CDS)のパッケージング

チェーンコードの開発が完了すると、CDSフォーマットでのパッケージングが必要です。CDSはチェーンコードのコード、名前、バージョンのようなプロパティを Hyperledger Fabricで定義する方式です。この CDSでチェーンコードのインストールができます。
CDSパッケージは Fabric SDK、CLIで作成できます。

参考

CDSパッケージに関する詳細は、以下をご参照ください。

このガイドでは、 fabric-toolsコンテナを利用して CDSを作成する方法をユースケースで説明します。

ユースケースの事前準備(必須)

このユースケースを行うために、ローカル環境に以下のアプリケーションをインストールします。このアプリケーションのダウンロードと詳しい使用方法については、リンクをご参照ください。

サンプルコードのダウンロード

ローカル環境で以下のコマンドを実行して、サンプルコードをダウンロードします。

$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
$ git clone -b v1.4.12 https://github.com/hyperledger/fabric.git

fabric-toolsコンテナ実行と CDSファイルパッケージング

  1. 以下のコマンドを実行して、CLIファイルが含まれた fabric-toolsコンテナを実行します。

    $ docker run -ti --rm -v $GOPATH/src:/opt/gopath/src hyperledger/fabric-tools:1.4.12 /bin/bash
    
  2. 以下のコマンドを実行して fabric-toolsコンテナ内の $GOPATH/opt/gopathであることを確認し、ローカルの $GOPATHパスが当該パスにマウントされたかを確認します。

    root@073c6694cadb echo $GOPATH
    /opt/gopath
    
  3. $GOPATH/src フォルダに移動した後、以下のコマンドを実行してサンプルコードを CDSファイルにパッケージングします。

    root@073c6694cadb: cd $GOPATH/src
    root@073c6694cadb:/opt/gopath/src# peer chaincode package -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/example02/cmd -v 1.0 mycc.cds
    2021-04-27 12:53:18.821 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
    2021-04-27 12:53:18.821 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
    
参考

peer chaincode package コマンドを利用して1.0バージョンの CDSファイルを使用言語別に作成するユースケースは、次の通りです。

peer chaincode package [パッケージ名] -n [チェーンコード名] -v [バージョン] -p [チェーンコード絶対パス] -l [チェーンコード言語]

  • java チェーンコードの場合

    peer chaincode package fabcar.v1.cds -n fabcar -v 1.0 -p chaincode/fabcar/java -l java
    
  • javascript チェーンコードの場合

    peer chaincode package fabcar.v1.cds -n fabcar -v 1.0 -p chaincode/fabcar/javascript -l node
    
  • go チェーンコードの場合

    goチェーンコードの場合、-p値として$GOPATH/srcの相対パスを使用します。
    cp -r chaincode/fabcar/go/* $GOPATH/src/fabcar
    peer chaincode package fabcar.v1.cds -n fabcar -v 1.0 -p fabcar
    
  1. CDSパッケージングの完了後、ローカル内の $GOPATH/srcmycc.cdsファイルが作成されたことを確認します。

3. チェーンコードのインストールとインスタンス化、アップグレード

CDSパッケージファイルが作成されたら、Blockchain Serviceのコンソールを利用して Peerノードにインストールし、インスタンス化します。詳細は、以下をご参照ください。

一度インスタンス化されたチェーンコードは、新しいバージョンをインストールすると、再度インスタンス化する代わりにアップグレードを行います。詳細は、以下をご参照ください。

4. アプリケーションの開発、ビルド、実行

チェーンコードのインスタンス化が完了すると、チェーンコードを利用してブロックチェーンにアクセスするアプリケーションを開発して実行できます。

参考

アプリケーションの開発に関する詳細は、以下をご参照ください。

注意

以下の例は、1.4バージョンをベースに説明しています。

Hyperledger Fabricでは、チェーンコードと同様に、アプリケーション開発のためのライブラリである Fabric SDKを go、java、javascriptの3つのバージョンで提供します。Fabric SDKは1.4バージョンと2.xバージョンに分かれているため、1.4バージョンを使用してください。互換性に問題のない場合は、最新バージョンの SDKを使用してもかまいません。

Fabric SDKはチェーンコードを呼び出す機能以外にも、Peerノードにアクセスしてネットワークの詳細情報を取得する機能(service discovery)、CAノードにアクセスして IDを作成したり証明書を発行する機能、発行された証明書を walletファイルで保存する機能、チャンネルを作成したりチェーンコードを登録する機能などの様々な機能を提供します。

このガイドでは、アプリケーションの構成要素を node.jsのユースケースで説明します。

事前準備

アプリケーションを実行するには、Peerノードのアクセスアドレスと Peerノードにアクセスするための CA(証明書)が必要です。この情報は Blockchain Serviceのコンソールでダウンロードできます。

  • connection profile: Blockchain Serviceの Organizations メニューでダウンロードしたファイルを download/connection_profile.jsonに保存します(MSPアクセス情報のダウンロードを参照)。
  • 証明書: Nodes メニューからエクスポート(export)したファイルを download/user.jsonに保存します。CAユーザー ID管理を参照)
参考

コンソールから証明書をダウンロードせず、アプリケーションサンプルと同様に、CAサーバから直接証明書を登録(enroll)して財布(wallet)を作成することもできます。

アプリケーション(JavaScript)のユースケース

  1. ユースケースを参考にしてコンソールでダウンロードした証明書でウォレット(wallet)を作成し、これを利用して fabcarというチェーンコードを呼び出して結果を表示するアプリケーションを作成します(query.js)。
/*
 * Copyright IBM Corp. All Rights Reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

'use strict';

const { Gateway, Wallets } = require('fabric-network');
const path = require('path');
const fs = require('fs');

async function main() {
    try {
        // load the network configuration
        const ccpPath = path.resolve(__dirname, 'download/connection_profile.json');
        const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));
        const mspId = ccp.client.organization;

        // load the exported user
        const userPath = path.resolve(__dirname, 'download/user.json');
        const user = JSON.parse(fs.readFileSync(userPath, 'utf8'));

        // Create a new file system based wallet for managing identities.
        const walletPath = path.join(process.cwd(), 'wallet');
        const wallet = await Wallets.newFileSystemWallet(walletPath);

        var identity = await wallet.get(user.name);
        if (!identity) {
            const x509Identity = {
                credentials: {
                    certificate: Buffer.from(user.cert, 'base64').toString('utf8'),
                    privateKey: Buffer.from(user.key, 'base64').toString('utf8'),
                },
                mspId: mspId,
                type: 'X.509',
            };
            await wallet.put(user.name, x509Identity);
            identity = await wallet.get(user.name);
        }

        // Create a new gateway for connecting to our peer node.
        const gateway = new Gateway();
        await gateway.connect(ccp, {wallet: wallet, identity: user.name, discovery: { enabled: true, asLocalhost: false } });

        // Get the network (channel) our contract is deployed to.
        const network = await gateway.getNetwork('defaultchannel');

        // Get the contract from the network.
        const contract = network.getContract('fabcar');

        // Evaluate the specified transaction.
        // queryCar transaction - requires 1 argument, ex: ('queryCar', 'CAR4')
        // queryAllCars transaction - requires no arguments, ex: ('queryAllCars')
        const result = await contract.evaluateTransaction('queryAllCars');
        console.log(`Transaction has been evaluated, result is: ${result.toString()}`);

        // Disconnect from the gateway.
        await gateway.disconnect();
        
    } catch (error) {
        console.error(`Failed to evaluate transaction: ${error}`);
        process.exit(1);
    }
}

main();
  1. package.json ファイルを以下のように作成します。
{
    "name": "fabcar",
    "version": "1.0.0",
    "description": "FabCar application implemented in JavaScript",
    "engines": {
        "node": ">=8",
        "npm": ">=5"
    },
    "scripts": {
        "lint": "eslint ."
    },
    "engineStrict": true,
    "author": "Hyperledger",
    "license": "Apache-2.0",
    "dependencies": {
        "fabric-network": "^2.1.0"
    }
}
  1. 以下のようにビルドして実行します。
    • ブロックチェーンに保存された情報を表示します。
$ npm install
$ node query.js
Transaction has been evaluated, result is: [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]

アプリケーション(java)のユースケース

  1. コンソールでダウンロードした証明書で walletを作成し、これを利用して fabcarというチェーンコードを呼び出して結果を表示するアプリケーションを作成します(ClientApp.java)。
/*
SPDX-License-Identifier: Apache-2.0
*/

package org.example;

import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;

import org.hyperledger.fabric.gateway.Contract;
import org.hyperledger.fabric.gateway.Gateway;
import org.hyperledger.fabric.gateway.Network;
import org.hyperledger.fabric.gateway.Wallet;
import org.hyperledger.fabric.sdk.NetworkConfig;
import org.hyperledger.fabric.sdk.security.CryptoPrimitives;

import javax.json.Json;
import javax.json.JsonObject;

public class ClientApp {

	static {
		System.setProperty("org.hyperledger.fabric.sdk.service_discovery.as_localhost", "false");
	}

	public static void main(String[] args) throws Exception {
		// Load a file system based wallet for managing identities.
		Path walletPath = Paths.get("wallet");
		Wallet wallet = Wallet.createFileSystemWallet(walletPath);

		// load a CCP
		Path networkConfigPath = Paths.get("download", "connection_profile.json");
		InputStream is = new FileInputStream(networkConfigPath.toFile());
		NetworkConfig ccp = NetworkConfig.fromJsonStream(is);
		String mspId = ccp.getClientOrganization().getMspId();

		// load the exported user
		Path userPath = Paths.get("download", "user.json");
		is = new FileInputStream(userPath.toFile());
		JsonObject userObject = (JsonObject) Json.createReader(is).read();
		String userId = userObject.getString("name");

		boolean userExists = wallet.exists(userId);
		if (!userExists) {
			CryptoPrimitives crypto = new CryptoPrimitives();
			Wallet.Identity user = Wallet.Identity.createIdentity(mspId,
					new String(Base64.getDecoder().decode(userObject.getString("cert"))),
					crypto.bytesToPrivateKey(Base64.getDecoder().decode(userObject.getString("key"))));
			wallet.put(userId, user);
		}

		Gateway.Builder builder = Gateway.createBuilder();
		builder.identity(wallet, userId).networkConfig(networkConfigPath).discovery(true);

		// create a gateway connection
		try (Gateway gateway = builder.connect()) {

			// get the network and contract
			Network network = gateway.getNetwork("defaultchannel");
			Contract contract = network.getContract("fabcar");

			byte[] result;

			result = contract.evaluateTransaction("queryAllCars");
			System.out.println(new String(result));
			System.exit(0);
		}
	}

}
  1. pom.xml ファイルを以下のように作成します。
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>fabcar-java</groupId>
   <artifactId>fabcar-java</artifactId>
   <version>1.4.0-SNAPSHOT</version>
   <build>
      <plugins>
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
               <source>1.8</source>
               <target>1.8</target>
            </configuration>
         </plugin>
      </plugins>
   </build>
   <repositories>
      <repository>
         <id>oss-sonatype</id>
         <name>OSS Sonatype</name>
         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      </repository>
   </repositories>
   <dependencies>
      <dependency>
         <groupId>org.hyperledger.fabric</groupId>
         <artifactId>fabric-gateway-java</artifactId>
         <version>1.4.1</version>
      </dependency>
   </dependencies>
</project>
  1. 以下のようにビルドして実行します。
    • ブロックチェーンに保存された情報を表示します。
$ mvn compile
$ mvn exec:java -Dexec.mainClass=org.example.ClientApp
[{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]