Hyperledger Fabric では、Chaincode はスマートコントラクトとも呼ばれ(以下、まとめて chaincode と呼びます)、Go、node.js、または Java で記述されたプログラムであり、主に台帳上のデータを操作するために使用されます。ユーザーのアプリケーションは、chaincode を介して Fabric 台帳データと対話します。
概要
完全な Fabric ブロックチェーンアプリケーションは、ユーザーのアプリケーションとユーザーが記述した chaincode の 2 つの部分で構成されます。ユーザーのアプリケーションは、ブロックチェーンネットワークにデプロイされたピアノードを介して chaincode を呼び出し、ユーザー chaincode はブロックチェーンネットワークのピアノードを介して台帳データを操作します。次の図は、ルーティングアルゴリズムの違いを示しています。

Fabric のピアノードは、chaincode 関連サービスを呼び出すためのインターフェイスを提供します。ユーザーのアプリケーションは、関連インターフェイスを呼び出すことで、Fabric ピアと対話できます。ピアノードは、chaincode コンテナーと対話して、アプリケーションと chaincode 間の対話を完了します。
ユーザーのアプリケーションは、次の 2 つの方法で Fabric ピアと対話できます。
Fabric が提供する SDK を使用して、Fabric ピアと対話します。詳細については、「Fabric SDK」をご参照ください。
Alibaba Cloud BaaS が提供する API を使用して、Fabric ピアと対話します。
RLP
chaincode を開発および記述した後、直接使用することはできません。クライアントから送信されたトランザクションを処理するために Hyperledger Fabric ネットワークに適用する前に、一連の操作が必要です。この一連の操作は、chaincode のライフサイクルによって管理されます。
Fabric 1.x で Chaincode のライフサイクルを管理するには、次のコマンドを使用します。
package: 指定された chaincode をパッケージ化する操作です。
記述された chaincode をネットワークノードに install: インストールします。
インストールされた chaincode を instantiate: インスタンス化します。
upgrade: 既存の chaincode をアップグレードします。chaincode は、特定の要件が変更された後、インストール後にアップグレードできます。
Fabric 2.x で ChainCode の生成サイクルを管理するには、次のコマンドを使用します。
package: 指定された chaincode をパッケージ化する操作です。
approveformyorg: 記述された chaincode をネットワークに提案します。
commit: 完成した chaincode をネットワークに正式に送信します。デフォルトでは、半数以上のメンバーが提案を承認すると有効になります。
Alibaba Cloud BaaS [コンソール] では、コマンドラインに依存せずに chaincode をアップロード、インストール、およびインスタンス化できます。
Chaincode の種類
Hyperledger Fabric では、chaincode は一般的に次の種類に分けられます。
ユーザー chaincode
システム chaincode
システム chaincode は、システム構成、エンドースメント、検証など、Fabric ノード自体の処理ロジックを担当します。システム chaincode は Go 言語のみをサポートします。 [受付] とデプロイメントは、ピアノードの起動時に自動的に完了します。したがって、インストール、インスタンス化、およびアップグレードはシステム chaincode には適用されません。
システム chaincode には、主に次の種類があります。
Lifecycle System Chaincode (LSCC): Lifecycle System Chaincode は、ユーザー chaincode のライフサイクルを管理します。
Configuration System Chaincode (CSCC): Configuration System Chaincode は、ピアエンドのチャンネル構成を担当します。
クエリシステムチェーンコード(QSCC): ブロックやトランザクションなどの情報を取得するための、クエリシステムチェーンコード用の、台帳クエリアPI を提供します。
ユーザー chaincode
ユーザー chaincode は、アプリケーション開発者がビジネスシナリオの要件に基づいて Golang、node.js、または Java 言語で記述したビジネス処理ロジックコードであり、ブロックチェーン分散台帳の状態を操作します。ユーザー chaincode は chaincode コンテナー内で実行され、Fabric が提供するインターフェイスを介して台帳の状態と対話します。
ユーザー chaincode は、ブロックチェーンアプリケーションにおいて非常に重要なリンクであり、ユーザービジネスロジックからの呼び出しを直接受け入れて、ブロックチェーン分散台帳データを操作します。
エンドースメントポリシー
各スマートコントラクトには、関連付けられたエンドースメントポリシーがあります。このエンドースメントポリシーは、スマートコントラクトによって生成されたトランザクションが有効なトランザクションとして認識される前に、どの組織が承認する必要があるかを決定します。 chaincode をアップロードして chaincode をインスタンス化するときは、chaincode のエンドースメントポリシーを指定する必要があります。
エンドースメントポリシーの例:
OR ('Org1MSP.peer','Org2MSP.peer')は、このチャンネルの 2 つの組織のいずれかがエンドースできることを示します。AND ('Org1MSP.peer','Org2MSP.peer')は、このチャンネルの 2 つの組織がエンドースする必要があることを示します。
詳細については、「Fabric の設計 > エンドースメントポリシー」をご参照ください。
トランザクション実行プロセス
Hyperledger Fabric では、トランザクションの実行には、ピアノード、オーダーラーノード、CA ノード、およびクライアントの参加が必要です。
ピアノード: このノードはトランザクションの主体であり、チェーンに関与する各メンバーを表すと言えます。完全な台帳データ、つまりブロックチェーンデータを格納し、コンセンサスリンクでのスマートコントラクトの実装、ブロックとトランザクションの検証、および正当なトランザクション(コミット)の台帳への送信を担当します。
オーダーラーノード: このノードは、エンドースメント署名を含むトランザクション [リクエスト] を受け入れてソートおよびパッケージ化し、新しいブロックを生成します。主な機能はトランザクションをソートして、各ピアノードのデータ整合性を確保することです。
CA ノード: このノードは、上位レイヤークライアントエンドを含む、参加チェーン内のすべてのノードの承認と認証を担当します。各ノードには、トランザクションプロセスで識別するために、CA ノードによって発行された [証明書] があります。
クライアント: Fabric はクライアント側に SDK を提供するため、開発者はブロックチェーンのトランザクションリンクに簡単に接続できます。トランザクションは SDK を介して開始されます。
トランザクション実行プロセスは、次の 4 つの主要なステップで構成されます。

トランザクション実行フローチャートは、Fabric コミュニティのオープンソース技術 [ドキュメント] からの引用であり、Creative Commons Attribution 4.0 International License Agreement の下でライセンスされています。
トランザクション [リクエスト] はクライアントによって開始されます。クライアントは、chaincode のエンドースメントポリシーに従って、トランザクションを送信するエンドースメントピアノードを決定します。ピアノードは投票を行い、クライアントは各エンドースメントノードの結果をまとめます。前の図のエンドースメントポリシーでは、Peer1、Peer2、および Peer3 がトランザクションに参加する必要があります。したがって、クライアントは Pee1、Peer2、および Peer3 にそれぞれ [リクエスト] を送信します。
トランザクション [リクエスト] を受信した後、3 つのピアノードは対応する chaincode を実行し、結果に署名してから、出力結果をクライアントに返します。
クライアントはすべての実行結果を各ピアのエンドースメント(投票結果とエンドースメント署名を含む)と共にパッケージ化し、オーダーラーノードに送信します。
オーダーラーは、トランザクションプールで受信したトランザクションをソートし、それらを組み合わせて新しいブロックを生成し、新しいブロックをすべてのピアノードに送信します。新しいブロックを受信した後、各ピアノードは各トランザクション結果の署名がエンドースメントポリシーに準拠しているかどうかを確認し、読み取り/書き込みセットがローカルバージョンと同じかどうかを比較します。すべての条件が満たされると、新しいブロックがローカル台帳に書き込まれ、トランザクションが完了します。
詳細については、「Fabric の設計 > トランザクションプロセス」をご参照ください。
使用上の注意
チャンネルをまたがるチェーン間呼び出し
呼び出された chaincode が呼び出し元の chaincode とは異なるチャンネルにある場合、読み取りクエリのみが許可されます。つまり、他のチャンネルで呼び出された chaincode はクエリのみであり、後続のコミットフェーズでのステータス検証チェックには参加しません。
同じチャンネル下でのチェーン code 間呼び出し
呼び出された chaincode と呼び出し元の chaincode が同じチャンネルにある場合、呼び出された chaincode によって生成された読み取り/書き込みセットは、呼び出し元の chaincode に対応するトランザクションに追加されます。つまり、異なるトランザクションを生成せずに同じトランザクションが共有されます。
chaincode shim パッケージの依存関係
chaincode は、shim [パッケージ] (ChainCodeStub) に依存してピアノードと通信する必要があります。一部の言語 shim [パッケージ] は、拡張インターフェイスも提供します(たとえば、呼び出し元の ID を処理するため)。デフォルトでは、chaincode をインスタンス化してコンパイルすると、ピアノードはノードと同じバージョンの shim [パッケージ] を提供します。 chaincode が別の互換バージョン (v1.4.x) の shim [パッケージ] に依存している場合は、chaincode [ファイル] にパッケージ化します。
2020 年 4 月 29 日より前に作成されたノードのバージョンは v1.4.2 で、それ以降に作成されたノードのバージョンは v1.4.5 です。
Golang の依存関係:
古いバージョン: github.com/hyperledger/fabric/core/chaincode/shim, github.com/hyperledger/fabric/protos/peer
新しいバージョン: github.com/hyperledger/fabric-chaincode-go/shim, github.com/hyperledger/fabric-protos-go/peer
Java の依存関係: fabric-chaincode-shim-1.4.x.jar および fabric-chaincode-protos-1.4.x.jar