スキャフォールド済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
}
この時点でアプリケーションの状態を初期化する場合は、このメソッドを使用して初期化できます。