スキャフォールド済Goチェーンコード・プロジェクト
ブロックチェーン・アプリケーション・ビルダーは、仕様ファイルから入力を受け取り、完全に機能するスキャフォールド済チェーンコード・プロジェクトを生成します。
main.go<chaincodeName>.model.go<chaincodeName>.controller.go
<chaincodeName>.model.goには複数のアセット定義が含まれ、<chaincodeName>.controller.goにはアセットの動作およびCRUDメソッドが含まれます。model.goおよびcontroller.goの様々なGo構造体タグおよびパッケージは、引数の自動検証、引数の整列化/非整列化、透過的永続性機能(ORM)およびリッチ問合せのコールなどの機能をサポートします。
スキャフォールド済プロジェクトは、$GOPATH/src/example.com/<chaincodeName>にあります
バリデータ
- id
id:"true"- 導出
derived:"strategy,algorithm,format"- 必須
validate:"mandatory"- デフォルト
default:"<param>"- 型の検証
- Goの基本的な型は、検証タグを定義することでプロパティに対して検証されます。型に基づく検証タグは次のとおりです:
- 文字列:
validate: "string" - 日付:
validate: "date" - 数値:
validate: "int" - ブール:
validate: "bool"
- 文字列:
- 最小バリデータ
validate:"min=<param>"- 最大バリデータ
validate:"max=<param>"- 日付バリデータ
- ビフォア・バリデータ:
- URLバリデータ
validate:"url"- 正規表現バリデータ
validate:"regexp=<param>"- 複数のバリデータ
- 複数のバリデータをプロパティに適用できます。
モデル
Asset Typeプロパティ
AssetTypeという追加プロパティがあります。このプロパティは、このタイプのアセットのみをフェッチする場合に役立ちます。このプロパティに対する変更は、アセットの作成および更新時に無視されます。デフォルトのプロパティ値は<chaincodeName>.<modelName>です。type Supplier struct {
AssetType string 'json:"AssetType" default:"TestGoProject.Supplier"'
SupplierId string 'json:"SupplierId" validate:"string,mandatory" id:"true'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default:"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}ORM
Goチェーンコードは、モデル・パッケージを使用して透過的永続性機能(ORM)を実装します。
モデル・パッケージを介して、次のORMメソッドが公開されます:
-
model.Get - 指定されたIDに基づいて、格納されたアセットの台帳を問い合せます。
-
model.Update - 台帳内の指定されたアセットを新しい値で更新します。
-
model.Save - すべての構造体タグを検証した後、アセットを台帳に保存します。
-
model.Delete - アセットを台帳から削除します。
-
model.GetByRange - IDの範囲別にアセットのリストを返します。
-
model.GetHistoryById - 指定されたIDのアセットの履歴を返します。
-
model.Query - 問合せメソッドでは、台帳に対してSQL/Couch DB問合せが実行されます。このメソッドは、Oracle Blockchain Platformでのリモート・デプロイメントでのみサポートされます。これは、台帳でSQL問合せを実行するための一般的な方法です。
コンポジット・キー・メソッド
その他のメソッド
model.GetTransactionId()model.GetTransactionTimestamp()model.GetChannelID()model.GetCreator()model.GetSignedProposal()model.GetArgs()model.GetStringArgs()model.getId
-
model.GetTransactionId - 現在のチェーンコード呼出しリクエストのトランザクションIDを返します。トランザクションIDは、チャネルのスコープ内でトランザクションを一意に識別します。
-
model.GetTransactionTimestamp - トランザクションが作成されたときのタイムスタンプを返します。これはトランザクション
ChannelHeaderから取得されるため、クライアントのタイムスタンプを示し、すべてのエンドーサで同じ値になります。 -
model.GetChannelID - チェーンコードが処理する提案のチャネルIDを返します。
-
model.GetCreator - チェーンコード呼出しの発行者のアイデンティティ・オブジェクトを返します
-
model.GetSignedProposal - 署名済トランザクション提案の完全にデコードされたオブジェクトを返します。
-
model.GetArgs - チェーンコード呼出しリクエストから引数を文字列の配列として返します。
-
model.GetStringArgs - チェーンコードの初期化および呼出し用の引数を文字列配列として返します。
ユーティリティ・パッケージ
ユーティリティ・パッケージの次のメソッドが役立つ場合があります:
コントローラ
Controller.goファイルは、アセットのCRUDおよびカスタム・メソッドを実装します。
任意の数のクラス、関数またはファイルを作成できますが、チェーンコード構造体で定義されたメソッドのみが外部から呼出し可能で、残りのメソッドは非表示になります。
CRUDメソッド
「入力仕様ファイル」で説明されているように、生成するCRUDメソッドを仕様ファイルで指定できます。たとえば、すべてのメソッドの生成を選択した場合、結果は次のようになります:
//
//Supplier
//
func (t *ChainCode) CreateSupplier(inputString string) (interface{}, error) {
var obj Supplier
err := util.CreateModel(&obj, inputString)
if err != nil {
return nil, err
}
return model.Save(&obj)
}
func (t *ChainCode) GetSupplierById(id string) (interface{}, error) {
asset, err := model.Get(id)
return asset, err
}
func (t *ChainCode) UpdateSupplier(inputString string) (interface{}, error) {
var obj Supplier
err := util.CreateModel(&obj, inputstring)
if err != nil {
return nil, err
}
return model.Update(&obj)
}
func (t *ChainCode) DeleteSupplier(id string) (interface{}, error) {
return model.Delete(id)
}
func (t *ChainCode) GetSupplierHistoryById(id string) (interface{}, error) {
historyArray, err := model.GetHistoryByld(id)
return historyArray, err
}
func (t *ChainCode) GetSupplierByRange(startkey string, endKey string) (interface{}, error) {
assetArray, err := model.GetByRange(startkey, endKey)
return assetArray, err
}
カスタム・メソッド
このサンプル仕様ファイルから、次のカスタム・メソッドが生成されました。
executeQueryは、SQLリッチ問合せのコール方法を示しています。引数に対するバリデータは、仕様ファイルで指定された引数のタイプに基づいてブロックチェーン・アプリケーション・ビルダーによって自動的に追加されます。
ビジネス・ロジックに従って機能を実装できます。
//
//Custom Methods
//
/*
* BDB sql rich queries can be executed in OBP CS/EE.
* This method can be invoked only when connected to remote OBP CS/EE network.
*/
func (t *ChainCode) ExecuteQuery(inputQuery string) (interface{}, error) {
resultArray, err := model.Query(inputQuery)
return resultArray, err
}
func (t *ChainCode) FetchRawMaterial(supplierId string, rawMaterialSupply int) (interface{}, error) {
return nil, nil
}
func (t *ChainCode) GetRawMaterialFromSupplier(manufacturerId string, supplierId string, rawMaterialSupply int) (interface{} error) {
return nil, nil
}
Func (t *ChainCode) CreateProducts(manufacturerId string, rawMaterialConsumed int, productsCreated int) (interface{}, error) {
return nil, nil
}
func (t *ChainCode) SendProductsToDistribution() (interface{}, error) {
return nil, nil
}func (t *Controller) FetchRawMaterial(supplierId string, rawMaterialSupply int) (interface{}, error) {
return nil, nil
}初期化メソッド
コントローラには、空の定義を持つinitメソッドが用意されています。このメソッドは、チェーンコードの初回インスタンス化またはアップグレード時にHyperledger FabricのInitメソッドによってコールされます。
type Controller struct {
}
func (t *Controller) Init(args string) (interface{}, error)
{ return nil, nil
}この時点でアプリケーションの状態を初期化する場合は、このメソッドを使用して初期化できます。