スキップしてメインコンテンツへ

Hyperledger Fabricのスマートコントラクトの必須コンポーネントの概要

4月5日、2022年お知らせ

Matt ZandとNavil Rodrigues

Hyperledger Fabricのアーキテクチャは、設計上、エンタープライズブロックチェーンアプリケーションの運用に不可欠な重要なコンポーネントを備えています。実際、大規模なプロジェクトがスケールアップして大規模なトランザクションを安全かつリアルタイムで管理し始めると、Hyperledger Fabricの能力が最もよく理解され評価されるようになります。そのため、Ethereumのようなパブリックなブロックチェーンプラットフォームとは異なり、Hyperledger Fabricの学習曲線は比較的急です。それでも、アプリケーションが本番環境に移行し、運用のスケーリングが必要になると、それまでの忍耐が報われるでしょう。 

Hyperledger Fabricのスマートコントラクト、つまりチェーンコードは、他のコンポーネントよりも重要な役割を果たします。実際、プロのHyperledger Fabric開発者は、論理設計から開発、テスト、展開まで、チェーンコードのすべての側面を徐々に習得する必要があります。イーサリアムとは異なり、チェーンコード内では、複数のスマートコントラクトを同時に実行できます。実際、コンソーシアムモデルでは、各メンバーはそのノードに独自のスマートコントラクト、プライベートチャネル内で他のメンバーと通信するスマートコントラクト、およびOrdererとシステム管理ノードに接続されるシステムスマートコントラクトを持つことができます。チェーンコードは重要であるため、この記事ではその重要な部分を簡単に確認します。 

開発者になるためには、チェーンコードでコーディングし、Hyperledger Fabricのスマートコントラクトを開発する最も簡単な方法は、JavaScriptプログラミング言語を使用することから始めるべきです(ただし、Java、Python、またはGoを使用することもできます)。コーディング用に任意のテキストエディタを選択することもできます。基本的なセットアップが完了したら、ファブリックチェーンコードを開発するための次の基本的な概念を理解する必要があります。 

  1. 契約クラス
  2. 契約構造
  3. ChaincodeStubインターフェース
  4. 分散型台帳データ表現
  5. チェーンコードへのログイン

次のセクションでは、これらの概念を簡単に紹介し、それらを使用する方法と場所を示します。 

I-チェーンコードのコントラクトクラス

Hyperledger Fabricでは、スマートコントラクトは、fabric-contract-api npmパッケージで提供されるコントラクトクラスからすべてのメソッドを継承する必要があります。これらの異なるメソッドは、ブロックチェーンで呼び出されるトランザクションに応答して呼び出されます。コントラクトAPIから継承されたコントラクトクラスの例を次に示します。その後に、その主要なメソッドについて簡単に説明します。

コンストラクタ

コントラクトクラスのコンストラクターは、スマートコントラクトに名前を付けるために使用されるオプションの入力パラメーターとして名前を受け入れます。名前が指定されていない場合は、クラス名が使用されます。

isContract

この関数は、入力として渡されたオブジェクトがコントラクトタイプであるかどうかを識別するために使用されます。チェックが成功するとtrueを返します。

beforeTransaction

この関数は、スマートコントラクトのトランザクション関数が呼び出される前に呼び出されます。標準のメソッドをオーバーライドして、代わりに独自のロジックを使用できます。

afterTransaction

この関数は、特定のトランザクション関数が呼び出された後に呼び出されます。デフォルトのメソッドをオーバーライドして、代わりに独自のロジックを使用できます。

unknownTransaction

この関数は、要求されたトランザクション関数が書面のスマートコントラクトに存在しない場合に呼び出されます。デフォルトのメソッドをオーバーライドして、代わりに独自のロジックを使用できます。

createContext

この関数は、トランザクション関数が呼び出されたときに追加の処理のためにアクセスできる独自のカスタムトランザクションオブジェクトを作成するために使用されます。

getName

これは、コントラクト名を返す単純なゲッター関数です。

II-チェーンコードの契約構造

fabric-contract-apiとfabric-shimは、Hyperledgerファブリックでチェーンコードを記述するために必要な2つの重要な依存関係です。 node.jsでチェーンコードの開発を開始するとき、次のようにpackage.jsonファイルに依存関係を追加します。

開始コマンド fabric-chaincode-node startは、ネットワーク内のピアが、メインのエントリポイントであるindex.jsファイルにエクスポートされるチェーンコードを開始するために使用します。

libディレクトリには、Contractクラスから派生した1つ以上のスマートコントラクトを含めることができます。さらに、契約をテストするためのテストケースを含むテストディレクトリを作成することもできます。チェーンコードフォルダの構造は次のとおりです。

III-チェーンコードのChaincodeStubインターフェース

Hyperledger Fabricでは、すべてのチェーンコードがShimパッケージで定義されたチェーンコードインターフェイスを実装し、トランザクションが要求されたときに呼び出される2つの重要なメソッドを定義します。

ご覧のとおり、インターフェースはInitとInvokeの2つのメソッドを実装しています。 Initは、Dockerコンテナに最初にデプロイされたときにチェーンコードの内部データを初期化するために呼び出されます。いっぽう、Invokeメソッドは、後続のトランザクションで変更または読み取りに使用されます。 元帳;トランザクション操作の結果として変更された状態変数は、トランザクションがコミットされたときにのみ元帳にコミットされることに注意してください。

どちらのメソッドも、タイプchaincodeStubInterfaceのstubという名前の単一のパラメーターを受け入れます。チェーンコードでは、すべての関数にctxフィールドがあります。これは、世界の状態、プライベートコレクション、イベントの発行、クロスチェーンコードの呼び出しなどとやり取りするために不可欠なAPIを提供するchaincodeStubInterface実装を含むコンテキストオブジェクトです。

IV-チェーンコードでの分散型台帳データ表現

Hyperledger Fabricでは、Ledgerは、ネットワークに参加しているノードのコンセンサスを通じてデータが追加および変更される不可欠なコンポーネントです。これには、ワールドステートとブロックチェーンという2つの異なる関連部分があります。

ワールドステート–現在および最新の値を保持するデータベースの一種。ワールドステートは、トランザクションログ全体をトラバースして計算するのではなく、チェーンコードがデータの現在の値をすばやくフェッチするのに役立ちます。元帳に記録されたデータやステートは、キーと値のペアとして表されます。 LeveldbとCouchdbの2つのデータベースオプションを利用できます。

ブロックチェーン–現在のワールドステートで発生するすべての変更は、トランザクションログとして記録されます。形成されたトランザクションはブロック内に収集され、ブロックチェーンに追加されます。これにより、誰でも保存されているアセットのステートの履歴を表示できます。ブロックチェーンのデータ構造は不変です。つまり、変更が行われると、再び変更することはできません。変更が加えられると、新しいステートを表します。

元帳データとの単純な相互作用-putState、getState、delState

ご存知のように、元帳の状態はキーと値のペアとして表されます。それらと対話する最も簡単な方法は、chaincodeStubインターフェイスによって提供されるAPIを使用することです。元帳の状態を照会、変更、および削除するための最も重要で基本的なAPIについて説明します。

putState – APIには、キー(文字列)と値(バイト配列)が必要です。本APIは、元帳にコミットされるデータ書き込みプロポーザルを形成するために使用されます。トランザクションが検証され、ネットワーク内のピアによって正常にコミットされた後にのみ、元帳が影響を受けることに注意してください。キーは空であってはならず、空の文字で始まってはなりません。

getState – APIにはキー(文字列)が必要です。元帳からキーに対応する値を返します。キーが状態データベースに存在しない場合は、空の配列を返します。

delState – APIにはキー(文字列)が必要です。これは、元帳状態からレコードを削除する提案を形成します。操作が成功すると、キーとそれに対応する値がワールドステートから削除済みとしてマークされます。ただし、レコードは引き続きブロックチェーンで利用可能であり、取得できます。

V-チェーンコードのロギング

ロギングは、ソフトウェア開発プロセスで最も重要な部分です。データを分析し、エラーを解決し、問題を早期に検出することで、重要な決定を下すのに役立ちます。チェーンコードロギングは、チェーンコード開発者の最終的な責任です。

stdoutまたはstderrにメッセージを出力するロギングユーティリティは、以下のコマンドを記述して、関連するDockerコンテナで調べることができます。

概要 

この記事では、Hyperledger Fabricを使用してプライベートブロックチェーンアプリケーションを構築する際のチェーンコードの重要性を学びました。また、コントラクトクラス、構造など、チェーンコードのすべての重要な側面を確認しました。 

Certified Hyperledger Fabric Developer (CHFD) の受験準備のためには、この記事は素晴らしい出発点です。さらに、この記事のフォローアップとして、チェーンコードのライフサイクルを調査するとともに、元帳データに対して単純なクエリから複雑なクエリの実行をしてみてください。また、Node.JS SDKを介してHyperledger Fabric V2で導入されたチェーンコード外部ランチャー機能を調べることもできます。他に関連するトレーニングコースとして、 Hyperledger Fabric for Developers (LFD272)があります。

Matt Zandについて

Mattは シリアル アントレプレナーであり、 5つのテックスタートアップ: RealBig, DC Web Makers, HashFlow, Coding Bootcamps High School Technology Servicesの創設者です。彼は O'Reilly Mediaの書籍 Hands-on Smart Contract Development with Hyperledger Fabric の筆頭著者です。 彼は、IBM、SAP、Alibaba Cloud、Hyperledger、The Linux Foundationなどのサイトで、Hyperledger、Ethereum、CordaR3プラットフォームのブロックチェーン開発に関する100を超える技術記事とチュートリアルを執筆しています。 彼はICOを介して資金を調達しながら、 RealBigでNFTとDeFiを統合する仮想リーグを構築するためのブロックチェーンエキスパートのチームを率いています。 Linkedinで彼とつながることができます https://www.linkedin.com/in/matt-zand-64047871

Navil Rodriguesについて

NavilはLinux FoundationのCertified Hyperledger Fabric Developer (CHFD) です。 現在、彼は Mckinley Riceでブロックチェーン開発者として働いており、Ethereumとバイナンス スマートチェーン、ポリゴンなどのサイドチェーンのスマートコントラクトの作成と実装に取り組んでいます。彼はまた、さまざまなチェーンを接続するためのICO契約とブリッジングソリューションの開発と設計にも手を出しています。さらに、彼は最初から最後までフルスタックおよび分散型アプリケーションを構築した経験があります。 LinkedInで彼とつながることができます: https://www.linkedin.com/in/navil-rodrigues-295784a4/

Linux Foundationのトレーニングと認定に関心をお寄せいただきありがとうございます。私たちは、中国のトレーニングサイトからより良いサービスを提供できると考えています。このサイトにアクセスするには、以下をクリックしてください。

Linux Foundationのカルチャに対するフィードバックは、より適切に、中国のカルチャウェブサイトに反映されることを期待しています。