チェーンコードは、Hyperledger Fabric フレームワーク内でのスマートコントラクトの実装です。Go、Node.js、Java などの一般的なプログラミング言語をサポートしており、さらに多くの言語のサポートが開発中です。本トピックでは、チャネルに新しいチェーンコードをデプロイする方法について説明します。
本トピックは、Fabric v2.2 または v2.5 インスタンスのユーザーに適用されます。Fabric v1.4 インスタンスをご利用の場合は、「チェーンコードの管理 (v1.4)」をご参照ください。
サービスとしてのチェーンコード
2022 年 9 月 29 日以降にデプロイされたチェーンコードインスタンスでは、サービスとしてのチェーンコード機能がデフォルトで有効になっています。
サービスとしてのチェーンコード導入前
以前は、Hyperledger Fabric のチェーンコードコンテナは Docker を使用してビルドおよび実行されていました。各チェーンコードインスタンスは、ピアインスタンスと 1 対 1 の関係にありました。ビジネス規模が拡大するにつれてコンテナの数が増加し、これにより、運用保守 (O&M) エンジニアの作業が複雑化し、ユーザーのリソースコストも増大していました。
サービスとしてのチェーンコード導入後
現在、Hyperledger Fabric のチェーンコードコンテナは Kubernetes (K8s) を使用してビルドおよび実行されており、リソース構成、信頼性、安定性が大幅に向上しています。主な利点は次のとおりです。
チェーンコードリソースの弾力的な管理
デフォルトでは、1 つのチェーンコードパッケージが組織内で 1 つのコンテナを起動し、ピアが呼び出し可能なサービスとしてチェーンコードを提供します。ネイティブ K8s を使用することで、組織内のすべてのピア ノードが同じチェーンコードサービスにアクセスして、1 つのチェーンコードコンテナを共有できます。これにより、チェーンコードリソースの弾力的な管理が可能になります。
説明チェーンコードをスケーリングするには、チケットを送信してサポートエンジニアに支援を依頼できます。
高可用性
チェーンコードコンテナが K8s にデプロイされると、ネイティブ K8s がサービスの信頼性を保証し、スケーリング機能を提供します。
安定性の向上
チェーンコードがビルドされると、組織内のノードで再利用できます。ピア ノードを再起動する際に、イメージのビルド手順をスキップできます。これにより、チェーンコードコンテナが迅速に起動し、ジッターが減少します。
チェーンコードのパッケージ化
まず、Hyperledger Fabric の開発環境でチェーンコードを開発、テスト、パッケージ化する必要があります。
チェーンコード開発の詳細については、「スマートコントラクトの概要」をご参照ください。
チェーンコードがテストに合格したら、
peer lifecycle chaincode packageコマンドを使用してパッケージ化します。チェーンコードをパッケージ化する際には、必要な依存関係を含める必要があります。Go のチェーンコードの場合、次の手順に従って依存関係ファイルを vendor ディレクトリに配置します。govendor を使用して依存関係をロードする
govendor ツールをインストールします。
go get -u -v github.com/kardianos/govendorチェーンコードプロジェクトのディレクトリに移動し、vendor ディレクトリを初期化します。
govendor initプロジェクトで使用されている依存関係パッケージを GOPATH から vendor ディレクトリに自動的に移動します。
govendor add +external
go mod を使用して依存関係をロードする
mod を初期化します。
go mod init依存関係を vendor ディレクトリに自動的にパッケージ化します。
go mod vendor
パッケージ化コマンドの詳細については、「peer lifecycle chaincode command」をご参照ください。次の点にご注意ください。
-p パラメーターは、言語に基づいて正しいディレクトリを指す必要があります。Go の場合は、$GOPATH/src 配下にあるチェーンコードの main パッケージが格納されているディレクトリの相対パスを指す必要があります。Java の場合は、Java プロジェクトのディレクトリを指す必要があります。Node.js の場合は、package.json ファイルを含む Node.js プロジェクトのルートディレクトリを指す必要があります。-p パラメーターには、「./xxx」のような相対パス形式を使用しないでください。
チェーンコードの言語が Go の場合、-l オプションは省略できます。チェーンコードの言語が Node.js または Java の場合は、-l node または -l java パラメーターを使用します。
--labelパラメーターを使用して、チェーンコード名とバージョンを指定します。Java チェーンコードを使用している場合は、次の構成が完了していることを確認してください。
pom.xml の構成:
pomファイルで、buildタグに<finalName>chaincode</finalName>構成を追加します。これにより、生成される JAR ファイルの名前がchaincode.jarになります。以下のコードは構成例です。
ディレクトリ構造: チェーンコードプロジェクトのディレクトリ構造を確認します。現在のチェーンコードのルートディレクトリが
/Users/***/work/JavaChainCodeDemoであると仮定します。以下のコードはディレクトリの例です。/Users/***/work/JavaChainCodeDemo ├── core.yaml # Fabric 構成ファイル (オプション) ├── pom.xml # Maven 構成ファイル (必須) └── src └── src ├── main │ ├── java # Java ソースコードディレクトリ │ └── resources # リソースファイルディレクトリ └── test # テストコードディレクトリ
チェーンコードのパッケージ化の例:
Golang チェーンコードのパッケージ化の例
次の例では、
$GOPATH/src/github.com/hyperledger/fabric-samples/chaincode/saccディレクトリの Golang チェーンコードソースコードをsacc.tar.gzにパッケージ化します。チェーンコードのラベルはsacc_1_0です。peer lifecycle chaincode package -p github.com/hyperledger/fabric-samples/chaincode/sacc --label sacc_1_0 -l Golang sacc.tar.gzJava チェーンコードのパッケージ化の例
次の例では、
/Users/***/work/JavaChainCodeDemoディレクトリの Java チェーンコードソースコードをJavaChainCodeDemo_javacc1_v1.0.0.tar.gzにパッケージ化します。チェーンコードのラベルはJavaChainCodeDemo_javacc1_v1_0_0です。peer lifecycle chaincode package -p /Users/***/work/JavaChainCodeDemo --label JavaChainCodeDemo_javacc1_v1_0_0 -l java JavaChainCodeDemo_javacc1_v1.0.0.tar.gz
peerのダウンロードリンク:
新しいチェーンコードのデプロイには 3 つの手順が含まれます。チャネル内の既存のチェーンコードをアップグレードするには、「チェーンコードのアップグレード」をご参照ください。
チェーンコードのアップロード
Alibaba Cloud BaaS コンソールにログインします。
[概要] ページの [マイ組織] セクションで、対象の組織を見つけてその名前をクリックします。
[チェーンコードパッケージ管理] タブをクリックします。
[チェーンコードのアップロード] をクリックします。
表示されたダイアログボックスで、開発環境からチェーンコードパッケージをアップロードします。チェーンコードのパッケージ化方法の詳細については、「チェーンコードのパッケージ化」をご参照ください。
[OK] をクリックします。

チェーンコードがアップロードされると、[チェーンコードパッケージ管理] タブのリストに表示されます。[ラベル] 列のチェーンコード名は、ローカルでチェーンコードをパッケージ化したときに指定した名前です。
チェーンコードのインストール
前提条件
チェーンコードをアップロード済みであること。
手順
Alibaba Cloud BaaS コンソールにログインします。
[概要] ページの [マイ組織] セクションで、対象の組織を見つけてその名前をクリックします。
[チェーンコードパッケージ管理] タブをクリックします。
インストールするチェーンコードを見つけ、[操作] 列の [インストール] をクリックします。この操作により、現在の組織にチェーンコードがインストールされます。
インストール中に、チェーンコードはプリコンパイルされ、パッケージ内の潜在的な問題がチェックされます。

この操作には、チェーンコードの依存関係の複雑さに応じて、数秒から数分かかります。インストールが完了すると、[ステータス] が [未インストール] から [インストール済み] に変わり、[操作] 列の [インストール] が [定義の送信] に変わります。
チェーンコード定義の送信
前提条件
チェーンコードをアップロードしてインストール済みであること。
手順
Alibaba Cloud BaaS コンソールにログインします。
[概要] ページで [マイ組織] セクションを見つけ、対象の組織を見つけて組織名をクリックします。
[チェーンコードパッケージ管理] タブをクリックします。
定義を送信するチェーンコードを見つけ、[アクション] 列の [定義の送信] をクリックします。
表示されたダイアログボックスで、説明に基づいてパラメーターを入力します。

パラメーター
説明
名前
システムは、ローカルでチェーンコードをパッケージ化したときに指定したチェーンコード名を自動的に表示します。この名前を維持するか、新しい名前に変更することができます。
説明既に使用されている名前でチェーンコード定義を送信することはできません。
バージョン
定義を送信する際に、チェーンコードのバージョン番号を定義します。
デプロイチャネル
チェーンコードをデプロイするチャネルを選択します。デプロイが成功すると、チャネル内のすべての組織がチェーンコードを表示できます。チャネルの作成方法の詳細については、「チャネルの作成」をご参照ください。
初期化が必要
はい: チェーンコードが Init を実装している場合、チェーンコードを呼び出す前に、ソフトウェア開発キット (SDK) を介して特別な初期化トランザクションを送信する必要があります。使用前にチェーンコードの初期化が必要な場合は、[はい] を選択します。
いいえ: チェーンコードが Init を使用せず、初期化が不要な場合は、[いいえ] を選択します。
エンドースメントポリシー
エンドースメントポリシーの例:
OR ('org0MSP.peer','org1MSP.peer')は、このチャネル内の 2 つの組織のいずれかからのエンドースメントで十分であることを意味します。AND ('org0MSP.peer','org1MSP.peer')は、このチャネル内の両方の組織からのエンドースメントが必要であることを意味します。OutOf (a,'org0MSP.member','org1MSP.member','org2MSP.member'): a が 1 の場合、このチャネル内の 3 つの組織のいずれかからのエンドースメントで十分です。a が 2 の場合、チャネル内の少なくとも 2 つの組織からのエンドースメントが必要です。a が組織の数と等しい場合、エンドースメント条件は AND と同等です。
説明*.peerの*は、前の図のMSP IDによって決まります。詳細設定
[詳細設定] をクリックします。[プライベートデータコレクションの構成] 入力ボックスに、チェーンコードのプライベートデータコレクションの JSON 定義を入力します。チェーンコードがプライベートデータ機能を使用しない場合は、このパラメーターをスキップできます。プライベートデータコレクションの JSON 定義の例:
[{"name": "collectionName", "policy": "OR('org0MSP.peer')", "memberOnlyRead": false, "requiredPeerCount": 0, "maxPeerCount": 3, "blockToLive": 0}]。これは、チェーンコードがcollectionNameというプライベートデータ名前空間を使用し、組織Org0のノードのみがこの名前空間内のプライベートデータにアクセスできることを示します。重要プライベートデータコレクションの名前と blockToLive を設定した後は、アップグレード中にこれらの値を変更することはできません。詳細については、「Fabric でのプライベートデータの使用」をご参照ください。
[送信] をクリックします。
操作が成功すると、[チェーンコード] タブでチェーンコードのステータスを表示できます。[チャネルステータス] が [コンセンサス保留中] に変わり、[組織ステータス] には [処理済み] と表示されます。[操作] 列の [承認詳細] をクリックすると、チェーンコードの基本情報を表示できます。

チャネル内の他の組織は、チェーンコード定義の送信を確認し、完了する必要があります。
説明デフォルトでは、定義を送信する前に、チャネル内の 50% 以上の組織が承認する必要があります。
他の組織のメンバーが Alibaba Cloud BaaS コンソールにログインします。
[概要] ページの [マイ組織] セクションで、対象の組織を見つけてその名前をクリックします。
[チェーンコード] タブをクリックし、[操作] 列の [処理] をクリックします。
表示された [チェーンコード処理] ページで、送信されたチェーンコード定義が要件を満たしているかどうかを確認します。満たしている場合は、[送信] をクリックして確認を完了します。
チャネル内の 50% 以上の組織が確認を完了すると、チェーンコードがデプロイされます。[チェーンコード] タブで、[チャネルステータス] が [コンセンサス保留中] から [実行中] に変わります。[操作] 列に [アップグレード] と [ログの表示] の操作が追加されます。
説明送信されたチェーンコード定義が要件を満たさない場合、他の組織はそれを処理しないことを選択できます。独自のチェーンコードパッケージをアップロードし、インストールして、新しいチェーンコード定義を送信することができます。新しい送信のパラメーターが元のものと一致しない場合、[チェーンコード] タブに複数のコンセンサスメッセージが表示されます。
次のステップ
ユーザーを作成し、SDK を使用してブロックチェーンネットワークにアクセスすることができます。