banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

Chaincodeの開発、展開、および使用

スーパー・レッジャーの開発について、まずは Chaincode の概念を理解し、その後 Chaincode の開発方法、Fabric への Chaincode のデプロイ方法、Chaincode の使用方法について紹介します。

Chaincode は、一般的に中国語で链码と呼ばれ、スーパー・レッジャーにおけるスマートコントラクトであり、本質的にはコンピュータ言語で実装されたプログラムの一部です。Chaincode はスーパー・レッジャーの重要な構成要素であり、通常は Go 言語で記述され、Java や JavaScript などのコンピュータ言語でも記述がサポートされています。本書の Chaincode は Go 言語で記述されています。

では、Chaincode はどのように実行されるのでしょうか?Chaincode が完成した後、コンパイルしてスーパー・レッジャーにデプロイする必要があります。デプロイが完了すると、Chaincode は保護された Docker コンテナ内で実行され、背書ノードの実行と相互に隔離されます。スーパー・レッジャーは Chaincode を通じて台帳データの読み取りおよび変更操作を実現し、操作のログをスーパー・レッジャーのデータベースに保存します。Chaincode によって作成された状態は、その Chaincode がアクセス権を持つ限りに制限され、別の Chaincode から直接アクセスすることはできません。しかし、同じスーパー・レッジャー内で適切な権限が与えられた場合、ある Chaincode は別の Chaincode を呼び出してその作成した状態にアクセスすることができます。

Chaincode のライフサイクルは、パッケージング、インストール、インスタンス化、アップグレードの 4 つの段階を含み、具体的なプロセスは以下の例で説明します。

Chaincode の開発は特定のインターフェースを実装することを意味し、このインターフェースには 2 つのメソッド —Init () メソッドと Invoke () メソッドが含まれます。これら 2 つのメソッドの役割は以下の通りです:Chaincode が instantiate または upgrade トランザクションを受信すると、Init () メソッドが呼び出され、Chaincode は必要な初期化を実行できます。Invoke () メソッドは、受信した呼び出しトランザクションに応じてトランザクション提案を処理するために使用されます。

以下は、最もシンプルな Chaincode を実装した例であり、この例の目的は Chaincode の開発方法と Chaincode の実行フローを示すことです。この Chaincode ではデータを処理せず、メソッドを呼び出した後に直接戻るだけでよいので、Init () メソッドと Invoke () メソッドの主体機能を記述する際には空の値を返すだけで済みます。コードは以下の通りです:

image

ここで main 関数は Go プログラムのエントリポイントであり、ノードに Chaincode をデプロイすると、main 関数内の内容が実行されます。main 関数の最初の行 Err := shim.Start (new (SampleChaincode)) は、サンプルの Chaincode を起動し、エラーが発生した場合は起動失敗の情報を出力し、そうでなければ成功した情報を出力します。

上記の例では Chaincode の 3 つのメソッド、すなわち Init、Query、Invoke が実装されています。次にこれら 3 つのメソッドの役割を順に理解していきましょう。

●Init () メソッド。Init () メソッドは Chaincode が初めてブロックチェーンにデプロイされる際に各ノードによって呼び出され、このメソッドは初期化、ブートストラップ、または設定に関連する任意のタスクを実行するために使用されます。

●Query () メソッド。ブロックチェーン上で任意のクエリ操作を実行すると、Query () メソッドが呼び出されます。Query () メソッドはブロックチェーンの状態を変更しないため、トランザクションコンテキスト内では実行されません。Query () メソッド内でブロックチェーンの状態を変更しようとするとエラーが発生します。また、このメソッドはブロックチェーンの状態を読み取るためだけに使用されるため、その呼び出しはブロックチェーンに記録されません。

●Invoke () メソッド。ブロックチェーンの状態を変更する場合は Invoke () メソッドが呼び出されるため、すべてのブロックチェーンに対する更新または削除操作は Invoke メソッド内にカプセル化されるべきです。このメソッドはブロックチェーンの状態を変更するため、スーパー・レッジャーは自動的にトランザクションコンテキストを作成し、このメソッドがその中で実行されます。このメソッドへのすべての呼び出しはトランザクションとしてブロックチェーンに記録され、これらのトランザクションは最終的にブロックに書き込まれます。

上記のコードを実装した後、この Chaincode を操作できるようになります。Fabric は Chaincode を管理するための 4 つのコマンドを提供しており、それぞれパッケージ(package)、インストール(install)、インスタンス化(instantiate)、アップグレード(upgrade)です。まず package コマンドを使用して Chaincode をパッケージ化し、次に install コマンドで Chaincode をインストールし、最後に instantiate で Chaincode をインスタンス化します。Chaincode をアップグレードする必要がある場合は、新しいバージョンの Chaincode をインストールし、その後 upgrade コマンドでアップグレードを行う必要があります。

将来のバージョンでは、公式は Chaincode をアンインストールすることなく無効化および再有効化する stop および start コマンドの追加を検討しています。Chaincode を正常にインストールしインスタンス化した後、Chaincode はアクティブな状態(実行中)になります。インストールが完了した後も、いつでも Chaincode をアップグレードできます。

image

Chaincode には 2 つのインストール方法があります。1 つはソースコードを直接インストールする方法、もう 1 つは package コマンドを使用してパッケージ化し署名してパッケージファイルを生成し、その後 install コマンドで生成されたパッケージファイルをインストールする方法です。

以上が Chaincode の開発と使用のプロセスです。最後に Chaincode のパッケージングプロセスについて補足説明を行います。

Chaincode を管理および署名認証するために、通常 Chaincode をパッケージ化する操作が必要です。したがって、このセクションでは Chaincode のパッケージングプロセスを詳しく説明します。

Chaincode パッケージは 3 つの部分で構成されており、Chaincode コード自体、オプションのインスタンス化ポリシー、および Chaincode エンティティを所有する一連の署名が含まれます。ブロックチェーン上で Chaincode がインスタンス化されてトランザクションが行われる際、Chaincode に対応するインスタンス化ポリシーによって検証されます。

署名には以下の役割があります。

●Chaincode の所有権を確立する

●パッケージの内容を検証する。

●パッケージが改ざんされていないかを検出する。

Chaincode をパッケージ化する方法は 2 つあります。1 つ目は Chaincode に複数の所有者がいる場合、Chaincode パッケージが複数の所有者によって署名される必要があります。この場合、署名が必要な Chaincode パッケージを作成し、このパッケージを各所有者が順に署名します。2 つ目は比較的簡単で、署名されたノード上で install コマンドを使用してパッケージ化操作を行うだけです。

以上が Chaincode に関する内容であり、次にスーパー・レッジャーの実際の開発に入ります。

最初の例はローカルの Fabric ネットワークを構築することであり、このケースを通じてスーパー・レッジャーに基づいてシンプルなブロックチェーンネットワークを構築し、このネットワークと基本的な相互作用を行う方法、例えばスーパー・レッジャーのブロックチェーンデータのクエリや更新を学ぶことができます。

スーパー・レッジャーのローカル環境インストールのセクションでは、Fabric Samples のコードがダウンロードされており、これらのサンプルコードの中に「first-network」という名前のフォルダーがあります。このフォルダー全体が完全な Fabric プロジェクトのサンプルであり、複数のノードとコマンドラインツールを含む Fabric ネットワークを実現しています。以下ではこのサンプルを使用して最初の Fabric ネットワークを構築します。

fabric-network のサブディレクトリ first-network に入ると、そのディレクトリ内に byfn.sh という名前のスクリプトファイルがあることがわかります。このスクリプトファイルには非常に詳細なコメントがあり、「./byfn.sh -h」を実行すると、このスクリプトファイルの使用説明が表示され、Fabric ネットワークの起動や停止などの操作に関するコマンドが含まれています。

image

では、このシンプルな Fabric ネットワークを構築していきましょう。「./byfn.sh -m generate」というコマンドを使用して、ネットワークに必要な証明書と創世ブロックを生成します。コマンド実行中にはいくつかの設定が必要で、ここではデフォルト設定を使用し、コマンドラインツールで「Y」と入力して確認します。

image

このプロセスでは、まず cryptogen ツールを使用してさまざまなネットワークエンティティの証明書と鍵を生成します(cryptogen は Fabric プロジェクトで提供される必要な証明書を生成するためのツールです)。これらの証明書はアイデンティティの代表であり、ネットワーク内での通信や取引の際に署名 / アイデンティティの検証を許可します。次に、orderer ノードに対して順序サービスを導入するための genesis block(創世ブロック)を生成し、最後に Channel に必要な取引設定情報を生成してファイルに保存します。

“first network” ネットワークの起動

ネットワークの起動成功

このネットワークを停止するには、./byfn.sh -m down コマンドを使用します。

この Fabric ネットワークを起動した後、私たちはこのネットワークと相互作用することができます。相互作用の内容には、ネットワーク内のチャネル(channel、Fabric ネットワーク内のノードを接続し、他の無関係なノードを隔離するための通路)の管理や Chaincode の操作が含まれ、Fabric ネットワークをより深く理解することができます。Fabric ネットワークと相互作用する方法は、コマンドラインツール(CLI)を通じて Fabric API を呼び出すことによって実現されます。

CLI を使用するには、まず CLI コンテナ(コマンドラインツール CLI を含む docker コンテナで、CLI を実行できる独立した環境と理解できます)に入る必要があります。コンテナに入るコマンドは「docker exec -it cli bash」です。

ネットワークの停止

CLI コンテナに入る

CLI コンテナに入ると、コンテナ内の内容を確認し、Fabric ネットワークに対してクエリや更新操作を行うことができます。CLI で使用されるコマンドは主に 2 種類に分かれます。1 つはチャネルに関するコマンド、もう 1 つは Chaincode に関するコマンドです。

(1)チャネルに関するコマンド

チャネルに関するコマンドは以下の通りです。

●チャネルの作成。

CLI コンテナに入ったら、以下のコマンドを使用してチャネルを作成できます:

peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

ここでのパラメータの意味は以下の通りです。

●-o orderer.example.com:7050:順序サービスとして使用される orderer のサービス定義を指定します。

●-c mychannel:作成するチャネルの名前。

●-f ./channel-artifacts/channel.tx:configtxgen などのツールによって生成された設定トランザクションファイルを指定し、orderer ノードに提出します。

●--tls true:orderer との通信で TLS を起動するかどうか。

--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem:orderer ノードの TLS 証明書を指定します。この証明書は PEM 形式です。

●チャネルへの参加。

チャネルへの参加コマンドは peer channel join -b mychannel.block であり、-b はブロックパスを指し、ここでは創世ブロックを含むファイルパスを指します。

●すべてのチャネルの列挙。

すべてのチャネルを列挙するコマンドは peer channel list です。

●チャネルの更新。

チャネルを更新するコマンドは peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem であり、パラメータはチャネルの作成時と似ています。

(2)Chaincode に関するコマンド

Chaincode に関するコマンドは以下の通りです。

●Chaincode のインストール:peer chaincode install [flags]。

●Chaincode のインスタンス化:peer chaincode instantiate [flags]。

●Chaincode の呼び出し:peer chaincode invoke。

●Chaincode のパッケージ化:peer chaincode package。

●Chaincode のクエリ:peer chaincode query。

●Chaincode に署名:peer chaincode signpackage。

●Chaincode の更新:peer chaincode upgrade。

主に使用できるパラメータは以下の通りです。

●-C:チャネル ID。

●-c:JSON 文字列のチェーンコードコンストラクタメッセージ(デフォルトは “{}”)。

●-h:ヘルプ。

●-l:Chaincode を記述する言語、デフォルトは “golang”。

●-n:Chaincode 名。

●-p:Chaincode パス。

●-v:Chaincode バージョン。

●-o:orderer ノード。

以下は Chaincode コマンドを使用してスーパー・レッジャーをクエリおよび更新する方法です。

スーパー・レッジャーのクエリと更新#

CLI コンテナ内で、まず query を使用して a と b の残高をクエリします(a と b は byfn.sh -m up コマンドを使用してネットワークを起動した際に自動的に作成された 2 つのアカウントです)。a は 90、b は 210 であることがわかります。

image

次に、b アカウントから a アカウントに 80 を転送します。このトランザクションは新しいブロックを作成し、ブロックチェーンを更新します。操作コマンドは以下の通りです。

b アカウントから a アカウントに 80 を転送

上の図から操作が成功したことがわかります。この時点で a アカウントと b アカウントをクエリすると、a アカウントは 170、b アカウントは 130 であることがわかります。

更新後の a と b の残高をクエリ

以上が Chaincode を使用してスーパー・レッジャーをクエリおよび更新する方法です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。