Hypeledger Fabricチェーンコードの概念と原理
3504 ワード
ブロックチェーン応用開発者としては、スマート契約の開発が不可欠であり、Hyperledger Fabricにおいては、スマート契約はチェーンマールと呼ばれています.
チェーンコードの概念
チェーンコードはチェーンコードとも呼ばれ、開発者がGolang(javaまたはnodejs)を使って作成し、分散型帳簿の状態処理ロジックを提供します.チェーンコードは、Hyperledger Fabricのネットワークノード上に展開され、安全で保護されたDocker容器内で独立して動作し、gRPCプロトコルで対応するPeerノードと通信し、分散帳におけるデータを操作することができる.Fabricでは、チェーンコードはシステムチェーンコードとユーザチェーンコードに分類される.
システムチェーンコード
システムチェーンコードは、システム構成、裏書、検証などの動作を含むFabricノード自身の処理ロジックを担当する.現在、システムチェーンコードはGolang言語のみをサポートしています.Peerノードが起動すると同時に、対応するシステムチェーンコードも登録して配置される.ここで、私達の開発者はシステムチェーンコードの作成にあまり関心を持つ必要がありません.
ユーザチェーンコード
システムチェーンコードとは違って、ユーザチェーンコードは、開発者が異なるシーンのニーズ及びメンバーによって制定された関連ルールであり、Golang、java、またはnodejsを使用して作成することができる.
ユーザーチェーンコードは、Fabricアプリケーションにおいて重要な位置を占めています.下の方に帳簿データを操作して、上の方に企業級アプリケーションにapiインターフェースを提供することができます.したがって、チェーンコードがない企業級アプリケーションはブロックチェーンアプリケーションとは言えません.
チェーンコードのライフサイクル管理
チェーンコードは作成が完了した後、一連の操作を経てFabricネットワークに適用することができます.この一連の操作は以下の5つのコマンドによって行われます. install:作成された鎖コードを指定されたpeerノードにインストールします. instantiate:インストールされたチェーンコードを実装します. uggrade:既存のチェーンコードをアップグレードします.チェーンコードはインストール後、具体的な需要の変化によってアップグレードできます. package:指定された鎖コードを包装する singnpackage:パッケージされたファイルに署名する. install、instantiate、uplgradeの3つの操作はユーザーチェーンコードにのみ適用され、システムチェーンコードには適用されません.チェーンコードはインストールと初期化を経て動きやすくなりました.その後、チェーンコードを呼び出すことができます.
チェーンコードの作成
Hyperledger Fabricによる分散帳簿アプリケーションを開放し、チェーンコードを作成することが重要な一環である.Hypeledger Fabricは、チェーンコードの作成に関するSDKを提供しています. NodeJs SDK:https://github.com/hyperledger/fabric-sdk-node Java SDK:https://github.com/hyperledger/fabric-sdk-java Python SDK:https://github.com/hyperledger/fabric-sdk-py Go SDK:https://github.com/hyperledger/fabric-sdk-go ここではgolangのSDKを使ってチェーンコードの開発を行いますが、作成前にHyperledger Fabric Goに関するAPIをローカルシステムにダウンロードする必要があります.
ダウンロードコマンドは以下の通りです.
インターフェース
スタートチェーンコードは、shimパッケージのStart関数を呼び出す必要があります.Start関数の呼び出し時に、Chancodeというタイプのパラメータを渡す必要があります.Chancodeは、未実現の2つの方法を含むインターフェースタイプです.InitとInvoke.
チェーンコード構造
Shimパケットは、チェーンコードに対して、データ状態、事物コンテキスト、および他のチェーンコードをアクセス/操作するための関連APIを提供する.peerパケットは、チェーンコード実行後の応答情報を提供する.チェーンコードを開発するには、シムバッグとパーカーバッグを導入する必要があります.チェーンコードは独立して実行可能なアプリケーションであるため、アプリケーションの入口としてメーンパケット内で宣言し、対応するメーン関数を提供する必要があります. チェーンコードは一つのプロジェクト(複数のgoファイル、複数のパッケージ)であり、このgoプロジェクトにはmain関数の入り口が必要です. ここではShimパッケージのAPIはもう説明しません.興味のある読者は公式文書を閲覧することができます.
チェーンコードの概念
チェーンコードはチェーンコードとも呼ばれ、開発者がGolang(javaまたはnodejs)を使って作成し、分散型帳簿の状態処理ロジックを提供します.チェーンコードは、Hyperledger Fabricのネットワークノード上に展開され、安全で保護されたDocker容器内で独立して動作し、gRPCプロトコルで対応するPeerノードと通信し、分散帳におけるデータを操作することができる.Fabricでは、チェーンコードはシステムチェーンコードとユーザチェーンコードに分類される.
システムチェーンコード
システムチェーンコードは、システム構成、裏書、検証などの動作を含むFabricノード自身の処理ロジックを担当する.現在、システムチェーンコードはGolang言語のみをサポートしています.Peerノードが起動すると同時に、対応するシステムチェーンコードも登録して配置される.ここで、私達の開発者はシステムチェーンコードの作成にあまり関心を持つ必要がありません.
ユーザチェーンコード
システムチェーンコードとは違って、ユーザチェーンコードは、開発者が異なるシーンのニーズ及びメンバーによって制定された関連ルールであり、Golang、java、またはnodejsを使用して作成することができる.
ユーザーチェーンコードは、Fabricアプリケーションにおいて重要な位置を占めています.下の方に帳簿データを操作して、上の方に企業級アプリケーションにapiインターフェースを提供することができます.したがって、チェーンコードがない企業級アプリケーションはブロックチェーンアプリケーションとは言えません.
チェーンコードのライフサイクル管理
チェーンコードは作成が完了した後、一連の操作を経てFabricネットワークに適用することができます.この一連の操作は以下の5つのコマンドによって行われます.
チェーンコードの作成
Hyperledger Fabricによる分散帳簿アプリケーションを開放し、チェーンコードを作成することが重要な一環である.Hypeledger Fabricは、チェーンコードの作成に関するSDKを提供しています.
ダウンロードコマンドは以下の通りです.
$ go get -u github.com/hyperledger/fabric/core/chaincode/shim
$ go get -u github.com/hyperledger/fabric/protos/peer
fabricのSDK全体をローカルにダウンロードすることもできます.この場合、git分岐をrelease-1.2バージョンに切り替える必要があります.マスター分岐にはshimパッケージが含まれていません.インターフェース
スタートチェーンコードは、shimパッケージのStart関数を呼び出す必要があります.Start関数の呼び出し時に、Chancodeというタイプのパラメータを渡す必要があります.Chancodeは、未実現の2つの方法を含むインターフェースタイプです.InitとInvoke.
type Chaincode interface{
Init(stub ChaincodeStubInterface) peer.Response
Invoke(stub ChaincodeStubInterface) peer.Response
}
チェーンコードを作るということは、ChincodeのInitとInvokeを実現する方法です.チェーンコードが初期化されたりアップグレードされたりすると、Initメソッドが起動されたり、照会されたりするとInvokeメソッドが起動されます.チェーンコード構造
Shimパケットは、チェーンコードに対して、データ状態、事物コンテキスト、および他のチェーンコードをアクセス/操作するための関連APIを提供する.peerパケットは、チェーンコード実行後の応答情報を提供する.チェーンコードを開発するには、シムバッグとパーカーバッグを導入する必要があります.
package main
import (
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/peer"
)
//
type SimpleChaincode struct{}
// Chaincode Init
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{
//
}
// Chaincode Invoke
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{
//
}
// , ,
func main(){
err := shim.Start(new(SimpleChaincode))
if err != nil{
fmt.Println(" SimpleChaincode ")
}
}
注意したいのは: