ブロックチェーン・アプリケーション・ビルダーは、仕様ファイルから入力を受け取り、完全に機能しているスキャフォールド済チェーンコード・プロジェクトを生成します。このプロジェクトには、自動的に生成されたクラスと関数、CRUDメソッド、SDKメソッド、引数の自動検証、マーシャリング/アンマーシャリングおよび透過的永続性機能(ORM)が含まれます。
チェーンコード・プロジェクトでGo言語を使用する場合、スキャフォールド済プロジェクトには3つのメイン・ファイルが含まれます:
main.go
<chaincodeName>.model.go
<chaincodeName>.controller.go
必要なすべてのライブラリがインストールされ、パッケージ化されています。
modelサブディレクトリの<chaincodeName>.model.goファイルには複数のアセット定義が含まれ、controllerサブディレクトリの<chaincodeName>.controller.goファイルにはアセットの動作とCRUDメソッドが含まれます。model.goおよびcontroller.goの様々なGo構造体タグおよびパッケージは、引数の自動検証、引数の整列の化/非整列の化、透過的永続性機能(ORM)およびリッチ問合せのコールなどの機能をサポートします。
スキャフォールドされたプロジェクトは、$GOPATH/src/example.com/<chaincodeName>ディレクトリにあります。
モデル
Asset Typeプロパティ
デフォルトでは、すべての構造体に
AssetTypeという追加プロパティがあります。このプロパティを使用して、このタイプのアセットのみをフェッチできます。このプロパティに対する変更は、アセットの作成または更新時に無視されます。デフォルトのプロパティ値は
<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"'
}
バリデータ
-
ID
id:"true"
- このバリデータは、基礎となるアセットを一意に定義するプロパティを識別します。アセットは、このキーの値によって保存されます。このバリデータは、新しいGoプロジェクトがスキャフォールドされると自動的に適用されます。
- 次の例では、
SupplierIdがサプライヤ・アセットのキーで、SupplierIdプロパティのタグ・プロパティid:"true"があります。type Supplier struct {
Supplierld string 'json:"Supplierld" 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"'
}
-
計算結果
derived:"strategy,algorithm,format"
- このデコレータは、他のプロパティから導出された属性を定義するために使用します。このデコレータには、次の2つの必須パラメータがあります:
strategy: concatまたはhashの値を取得します。hashが指定されている場合は、追加のパラメータalgorithmが必要です。デフォルトのアルゴリズムはsha256で、md5もサポートされています。
format: 戦略で使用される仕様文字列と値の配列を取得します。
type Supplier struct{
AssetType string 'json:"AssetType" final:"chaincode1.Supplier"'
SupplierId string 'json:"SupplierId" validate:"string" id:"true" mandatory:"true" derived:"strategy=hash,algorith=sha256,format=IND%1%2,License,Name"'
Name string 'json:"Name" validate:"string,min=2,max=4"'
License string 'json:"License" validate:"string,min=2,max=4"'
}
-
必須
validate:"mandatory"
- このデコレータは、次のプロパティを必須としてマークするため、レジャーへの保存中にスキップできません。スキップすると、エラーがスローされます。次の例では、
SupplierIdプロパティにvalidate:"mandatory"タグがあります。Type Supplier struct {
Supplierld string 'json:"Supplierld" 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"'
}
-
デフォルト
default:"<param>"
- このデコレータは、次のプロパティにデフォルト値があることを示します。台帳への保存中にプロパティがスキップされると、デフォルト・タグの値が使用されます。次の例では、
Activeのデフォルト値はtrueで、タグdefault:"true"として指定されています。Type Supplier struct {
Supplierld string 'json:"Supplierld" 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"'
}
-
タイプの検証
- Goの基本的な型は、検証タグを定義することでプロパティに対して検証されます。次の検証タグは、基本タイプに基づいています。
- 文字列:
validate: "string"
- 日付:
validate: "date"
- 数値:
validate: "int"
- ブール:
validate: "bool"
-
最小バリデータ
validate:"min=<param>"
minバリデータを使用して、数値型または文字列型のプロパティの最小値を設定できます。
- int型の場合: 次の例では、
RawMaterialAvailableプロパティの最小値は0です。0未満の値がRawMaterialAvailableプロパティに適用されると、エラーが返されます。
- 型文字列の場合: 最小バリデータは、指定された値に対して文字列の長さをチェックします。次の例では、
Licenseプロパティの長さは10文字以上である必要があります。
Type Supplier struct {
Supplierld string 'json:"Supplierld" 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"'
}
-
最大バリデータ
validate:"max=<param>"
- 最大バリデータを使用して、数値型および文字列型のプロパティの最大値を設定できます。
- int型の場合: 最小バリデータと同様に、構造体フィールドに指定された値がバリデータに指定された値よりも大きい場合、エラーが返されます。
- 型文字列の場合: 最小バリデータと同様に、最大バリデータは指定された値に対して文字列の長さをチェックします。次の例では、
Domainプロパティの最大値は50であるため、Domainプロパティの文字列長が50文字を超える場合、エラー・メッセージが返されます。
type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
日付バリデータ
- 検証前:
validate:"before=<param>"
- ビフォア・バリデータは、
date型のプロパティを検証して、パラメータに指定された値よりも小さい値を持つようにします。
- 次の例では、
ExpiryDateプロパティは"2020-06-26"より前である必要があります。そうでない場合はエラーが返されます。Type Supplier struct {
Supplierld string 'json:"Supplierld" 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"'
}
- バリデータの後:
validate:"after=<param>"
- ビフォア・バリデータは、
date型のプロパティを検証して、パラメータに指定された値よりも大きい値を持つようにします。
- 次の例では、
CompletionDateプロパティは"2020-06-26"の後にある必要あり、そうでない場合はエラーが返されます。Type Supplier struct {
Manufacturerld string 'json:"Manufacturerld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,max=8"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int"'
CompletionDate date.Date 'json:"CompletionDate" validate:"date,after=2020-06-26"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
URLバリデータ
validate:"url"
- URLバリデータは、URL文字列のプロパティを検証します。
- 次の例では、
Domainプロパティは有効なURLである必要があります。type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"string,url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
正規表現バリデータ
validate:"regexp=<param>"
- 正規表現バリデータは、指定された正規表現を使用してプロパティを検証します。
- 次の例では、
PhoneNumberプロパティが正規表現に従ってモバイル番号に対して検証されます。type Customer struct {
Customerld string 'json:"Customerld" validate:"string,mandatory" id:"true"'
Name string 'json:"Name" validate:"string,mandatory"'
ProductsBought int 'json:"ProductsBought" validate:"int"'
OfferApplied int 'json:"OfferApplied" validate :"int,nax=0"'
PhoneNumber string 'json:"PhoneNumber" validate:"string,regexp=A\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$"'
Received bool 'json:"Received" validate:"bool"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
複数のバリデータ
- 複数のバリデータをプロパティに適用できます。
- 次の例では、
Domainプロパティに文字列、URL、最小および最大文字列長の検証があります。type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"string,url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
ORM
透過的永続性機能または簡略化されたORMは、コンテキスト(Ctx)オブジェクトのModelクラスで取得されます。モデルが次のSDKメソッドのいずれかをコールする場合は、t.Ctx.Modelを使用してアクセスします。
次のSDKメソッドは、ORMを実装します。
Saveは、Hyperledger FabricのPutStateメソッドをコールします。
Getは、Hyperledger FabricのGetStateメソッドをコールします。
Updateは、Hyperledger FabricのPutStateメソッドをコールします。
Deleteは、Hyperledger FabricのDeleteStateメソッドをコールします。
Historyは、Hyperledger FabricのGetHistoryForKeyメソッドをコールします。
GetByRangeは、Hyperledger FabricのGetStateByRangeメソッドをコールします。
GetByRangeWithPaginationは、Hyperledger Fabric GetStateByRangeWithPaginationメソッドをコールします。
SDKメソッド
Goチェーンコードは、モデル・パッケージを使用して透過的永続性機能(ORM)を実装します。
ノート:
バージョン21.2.3以降、ORMメソッドへのアクセス方法が変更されました。
ochain --versionコマンドを実行して、ブロックチェーン・アプリケーション・ビルダーのバージョンを確認します。
以前のリリースでは、ORMメソッドはモデル・パッケージの静的メソッドとして公開されていました。メソッドは、トランザクション・スタブを保持するモデル・レシーバで定義されるようになりました。これらのメソッドをコールするには、コントローラのトランザクション・コンテキストによって保持されているモデル・レシーバを使用します。これらのメソッドは、model.<method_name>ではなくt.Ctx.Model.<method_name>としてコールします。
次の例は、以前のリリースのSaveおよびGetメソッド・コールを示しています:
func (t *Controller) CreateSupplier(asset Supplier) (interface{}, error) {
return model.Save(&asset)
}
func (t *Controller) GetSupplierById(id string) (Supplier, error) {
var asset Supplier
_, err := model.Get(id, &asset)
return asset, err
}
次の例は、バージョン21.2.3以降のSaveおよびGetメソッド・コールを示しています:
func (t *Controller) CreateSupplier(asset Supplier) (interface{}, error) {
return t.Ctx.Model.Save(&asset)
}
func (t *Controller) GetSupplierById(id string) (Supplier, error) {
var asset Supplier
_, err := t.Ctx.Model.Get(id, &asset)
return asset, err
}
バージョン21.2.3にアップグレードした後、以前のバージョンのブロックチェーン・アプリケーション・ビルダーで作成したすべてのチェーンコード・プロジェクトで、この変更を行います。syncコマンドを使用して仕様ファイルとソース・コードの間の変更を同期すると、変更はすぐに使用できるメソッドのコントローラに自動的にを反映されます。競合は手動で解決する必要があります。
次のORMメソッドがモデル・パッケージによって公開されます。
-
Get
- 指定されたIDに基づいて、格納されたアセットのレジャーを問い合せます。
func Get(Id string, result ...interface{}) (interface{}, error)
- パラメータ:
Id - 元帳から取得するアセットのID。
result (interface{}) - 特定のタイプの空のアセット・オブジェクトで、参照によって渡されます。このオブジェクトには、このメソッドからの結果が含まれます。このパラメータは、型固有の結果が必要な場合にのみ使用します。
asset (interface) - 参照によって渡される空白のアセット・オブジェクト。このオブジェクトには、このメソッドからの結果が含まれます。このパラメータは、型固有の結果が必要な場合にのみ使用します。
- 戻り値:
interface {} - インタフェースには、map[string]interface{}形式のアセットが含まれます。このマップを操作する前に、返されたインタフェースをmap[string]interface{}型でアサートする必要があります。このマップをアセット・オブジェクトに変換するには、ユーティリティAPI util.ConvertMaptoStructを使用します(「ユーティリティ・パッケージ」を参照)。
error - 返される場合はエラーが含まれるか、そうでない場合はnilです。
-
Update
- 元帳内の指定したアセットを新しい値で更新する。
func Update(args ...interface{}) (interface{}, error)
- パラメータ:
obj (interface) - 元帳で更新するオブジェクトは、参照によって新しい値とともにこのAPIに渡されます。入力アセットは、モデル仕様に記載されている構造体タグに従って検証および確認され、レジャーに格納されます。
- 戻り値:
interface{} - 保存されたアセットはインタフェースとして返されます。
error - 返される場合はエラーが含まれるか、そうでない場合はnilです。
-
Save
- すべての構造体タグを検証した後、アセットをレジャーに保存します。
func Save(args ...interface{}) (interface{}, error)
- パラメータ:
obj/args[0] (interface{}) - 元帳に格納するオブジェクトは、このユーティリティ・メソッドで参照によって渡されます。
metadata/args[1] (interface{}) - (オプション)このパラメータを使用して、実行時にアセットとともに元帳にメタデータを格納できます。
- 戻り値:
interface {} - アセットはインタフェースとして返されます。
error - 返される場合はエラーが含まれるか、そうでない場合はnilです。
-
Delete
- アセットをレジャーから削除します。
func Delete(Id string) (interface{}, error)
- パラメータ:
id (string) - 元帳から削除する資産のID。
- 戻り値:
interface {} - 削除されるアセットがmap[string]interface{}の形で含まれます。
-
GetByRange
- IDの範囲別にアセットのリストを返します。
func GetByRange(startKey string, endKey string, asset ...interface{})
([]map[string]interface{}, error)
- パラメータ:
startkey (string) - 取得するオブジェクトの範囲の開始ID。
endkey (string) - 取得するオブジェクトの範囲の終了ID。
asset interface - (オプション)参照によって渡されるアセットの空の配列。この配列には、メソッドの結果が含まれます。このパラメータは、型固有の結果が必要な場合に使用します。
- 戻り値:
[]map[string]interface{} - この配列には、レジャーから取得されたアセットのリストが含まれます。オブジェクトにアクセスするには、この配列に対する反復処理を行い、オブジェクトをmap[string]interface{}としてアサートのうえ、ユーティリティを使用してアセット・オブジェクトに変換します。
error - 返される場合はエラーが含まれるか、そうでない場合はnilです。
-
GetByRangeWithPagination
GetByRangeWithPaginationメソッドは、{chaincodeName}.model.tsの具象Modelクラスによって継承されるOchainModelクラスの静的メソッドです。
- このメソッドは、ページ・サイズおよびブックマークでフィルタされた、
startIdからendIdの範囲のアセットのリストを返します。このメソッドは、Hyperledger FabricのGetStateByRangeWithPaginationメソッドを内部的にコールします。
modelNameパラメータが指定されていない場合、メソッドはPromise<Object [ ] >を返します。modelNameパラメータが指定されている場合、メソッドはコール元のModelタイプへのキャストを処理します。次の例では、結果の配列はSupplier型です。台帳から返されたアセットがModelタイプでない場合、リストには含まれません。このチェックは、Modelクラスの読取り専用のassetTypeプロパティによって行われます。
- ページ・サイズおよびブックマークでフィルタされた、
startIdからendIdの範囲のすべてのアセットを返すには、汎用コントローラ・メソッドgetAssetsByRangeを使用します。
func (m *Model) GetByRangeWithPagination(startKey string, endKey string, pageSize int32, bookmark string, asset ...interface{}) ([]map[string]interface{}, error)
- パラメータ:
startkey : string– 範囲の開始キー(範囲に含まれます)。
endkey : string– 範囲の終了キー。範囲から除外されます。
pageSize : number– 問合せのページ・サイズ。
Bookmark : string – 問合せのブックマーク。出力はこのブックマークから始まります。
asset interface – (オプション)参照によって渡されるアセットの空の配列。この配列には、このメソッドからの結果が含まれます。このパラメータを使用して、タイプ固有の結果を取得します。
- 戻り値:
[]map[string]interface{} – 台帳から取得されたアセットのリストを含む配列。オブジェクトにアクセスするには、この配列に対して反復し、オブジェクトをmap[string]interface{}としてアサートし、ユーティリティを使用してアセット・オブジェクトに変換します。
error – エラーが返された場合はエラーが含まれ、それ以外の場合はnilが含まれます。
-
GetHistoryById
- 指定されたIDのアセットの履歴を返します。
func GetHistoryByID(Id string) ([]interface{}, error)
- パラメータ:
- 戻り値:
[]interface{} - このスライスには、レジャーから取得されたアセットの履歴がmap[string]interface{}のスライスの形式で含まれます。各履歴要素にアクセスするには、このスライスに対して反復し、オブジェクトをmap[string]interface{}としてアサートのうえ、ユーティリティを使用してアセット・オブジェクトに変換します。
error - 返される場合はエラーが含まれます。
-
Query
- このメソッドは、元帳に対してSQL/Couch DB問合せを実行します。この方法は、Oracle Blockchain Platform上のリモート・デプロイメントでのみサポートされます。これは、元帳でSQL問合せを実行するための一般的な方法です。
func Query(queryString string) ([]interface{}, error)
- パラメータ:
queryString (string) - 問合せ文字列。
- 戻り値:
[]interface{} - インタフェースのスライスの形式で出力される問合せ。スライスに対して反復し、適切なタイプに変換して要素を使用する必要があります。
error - 返される場合はエラーが含まれます。
-
QueryWithPagination
- このメソッドで台帳に対してSQL/Couch DB問合せが実行され、ページ・サイズおよびブックマルクでフィルタされます。この方法は、Oracle Blockchain Platform上のリモート・デプロイメントでのみサポートされます。これは、元帳でSQL問合せを実行するための一般的な方法です。
func (m *Model) QueryWithPagination(queryString string, pageSize int32, bookmark string) ([]interface{}, error)
- パラメータ:
queryString (string) - リッチSQL/Couch DB問合せ。
pageSize : number - 問合せのページ・サイズ。
bookmark : string - 問合せのブックマーク。出力はこのブックマークから始まります。
- 戻り値:
[]interface{} - インタフェースのスライスの形式で出力される問合せ。スライスに対して反復し、適切なタイプに変換して要素を使用する必要があります。
error - 返される場合はエラーが含まれます。
-
InvokeCrossChaincode
- チェーンコードでこのメソッドを使用して、別のチェーンコード内の関数をコールできます。両方のチェーンコードが同じピアにインストールされている必要があります。
func InvokeCrossChaincode(chaincodeName string, method string, args []string, channelName string) (interface{}, error)
- パラメータ:
chaincodeName – コールするチェーンコードの名前。
methodName - チェーンコードでコールするメソッドの名前。
arg - コール元メソッドの引数。
channelName - コールするチェーンコードがあるチャネル。
- 戻り値:
interface{} - 3つのキーを含むmap[string]interface{}オブジェクトを返します:
isValid - コールが有効な場合はtrue。
payload - クロスチェーンコード・コールによってJSONオブジェクトとして返される出力。
message - クロスチェーンコード・コールによって返されるメッセージ(UTF-8形式)。
- 戻り値の例:
{
"isValid": true,
"message": "Successfully invoked method [CreateAccount] on sub-chaincode [erc721_go_453]",
"payload": {
"AccountId": "oaccount~6b83b8ab931f99442897dd04cd7a2a55f808686f49052a40334afe3753fda4c4",
"AssetType": "oaccount",
"BapAccountVersion": 0,
"NoOfNfts": 0,
"OrgId": "appdev",
"TokenType": "nonfungible",
"UserId": "user2"
}
}
-
InvokeChaincode
- チェーンコードでこのメソッドを使用して、別のチェーンコード内の関数をコールできます。両方のチェーンコードが同じピアにインストールされている必要があります。
func InvokeChaincode(chaincodeName string, method string, args []string, channelName string) (interface{}, error)
- パラメータ:
chaincodeName – コールするチェーンコードの名前。
methodName - チェーンコードでコールするメソッドの名前。
arg - コール元メソッドの引数。
channelName - コールするチェーンコードがあるチャネル。
- 戻り値:
interface{} - 3つのキーを含むmap[string]interface{}オブジェクトを返します:
isValid - コールが有効な場合はtrue。
payload - クロスチェーンコード・コールによって返される出力(UTF-8形式)。
message - クロスチェーンコード・コールによって返されるメッセージ(UTF-8形式)。
- 戻り値の例:
{
"isValid": true,
"message": "Successfully invoked method [CreateAccount] on sub-chaincode [erc721_go_453]",
"payload": "{\"AssetType\":\"oaccount\",\"AccountId\":\"oaccount~c6bd7f8dcc339bf7144ea2e1cf953f8c1df2f28482b87ad7895ac29e7613a58f\",\"UserId\":\"user1\",\"OrgId\":\"appdev\",\"TokenType\":\"nonfungible\",\"NoOfNfts\":0,\"BapAccountVersion\":0}"
}
コンポジット・キー・メソッド
-
GenerateCompositeKey
- このメソッドは、
indexNameおよび引数で指定された属性に基づいてコンポジット・キーを生成して返します。
func GenerateCompositeKey(indexName string, attributes []string)
(string, error)
- パラメータ:
indexName (string) - コンポジット・キーのオブジェクト・タイプ。
attrbutes ([]string) - 作成する必要があるコンポジット・キーに基づいたアセットの属性。
- 戻り値:
string - コンポジット・キーの結果。
error - 返される場合はエラーが含まれます。
-
GetByCompositeKey
- このメソッドは、指定されたキーおよび列に一致するアセットを返します。
indexパラメータは、スタブ・メソッドSplitCompositeKeyの配列で返されるキーの索引を示します。
- 内部的には、このメソッドはHyperledger Fabricの
getStateByPartialCompositeKey、splitCompositeKey、およびgetStateをコールします。
func GetByCompositeKey(key string, columns []string, index int)
(interface{}, error)
- パラメータ:
key (string) - コンポジット・キーの作成時に指定されたオブジェクト・タイプ。
column ([]string) - コンポジット・キーを使用してレジャーに問い合せられる必要がある属性のスライス。
index(int) - 属性の索引。
- 戻り値:
Interface{} - 一致するアセットのリスト。
error - 返される場合はエラーが含まれます。
スタブ・メソッド
-
GetNetworkStub
- このメソッドは、Hyperledger Fabricの
chaincodeStub値を返します。
- shimスタブにアクセスするには、
GetNetworkStubメソッドをコールします。これにより、アセットと直接連携する独自の実装を記述できます。
func GetNetworkStub() shim.ChaincodeStubInterface
- パラメータ:
- 戻り値:
shim.ChaincodeStubInterface - Hyperledger Fabricチェーンコード・スタブ。
その他の方法
GetTransactionId()
GetTransactionTimestamp()
GetChannelID()
GetCreator()
GetSignedProposal()
GetArgs()
GetStringArgs()
GetCreatorMspId()
GetId
-
GetTransactionId
- このメソッドは、現在のチェーンコード呼出しリクエストのトランザクションIDを戻します。トランザクションIDは、チャネルのスコープ内でトランザクションを一意に識別します。
func GetTransactionId() string
- パラメータ:
- 戻り値:
-
GetTransactionTimestamp
- トランザクションが作成されたときのタイムスタンプを返します。値はトランザクション
ChannelHeaderから取得されるため、クライアントのタイム・スタンプを示し、すべてのエンドーサで同じ値を持ちます。
func GetTransactionTimestamp() (*timestamp.Timestamp, error)
- パラメータ:
- 戻り値:
timestamp.Timestamp - タイムスタンプ。
error - 返される場合はエラーが含まれます。
-
GetChannelID
- チェーンコードが処理する提案のチャネルIDを返します。
func GetChannelID() string
- パラメータ:
- 戻り値:
string - リクエストされたチャネルID(文字列形式)。
-
GetCreator
- チェーンコード呼出しの発行者のアイデンティティ・オブジェクトを返します。
func GetCreator() ([]byte, error)
- パラメータ:
- 戻り値:
[]byte - シリアライズされた形式で必要なアイデンティティ・オブジェクト。
error - エラーが返された場合はエラーが含まれます。
-
GetSignedProposal
- 署名済トランザクション提案の完全にデコードされたオブジェクトを返します。
func GetSignedProposal() (*peer.SignedProposal, error)
- パラメータ:
- 戻り値:
*peer.SignedProposal - 署名付き提案オブジェクト。
error - エラーが返された場合はエラーが含まれます。
-
GetArgs
- チェーンコード呼出しリクエストから文字列の配列として引数を返します。
func GetArgs() [][]byte
- パラメータ:
- 戻り値:
-
GetStringArgs
- チェーンコードの
InitおよびInvokeメソッド用の引数を文字列配列として返します。
func GetStringArgs() []string
- パラメータ:
- 戻り値:
-
GetCreatorMspId
- 呼出し側アイデンティティのMSP IDを返します。
func GetCreatorMspId() string
- パラメータ:
- 戻り値:
-
GetId
- アセットに
Idとして導出キーがある場合、このメソッドを使用して導出IDを取得できます。このメソッドは、導出キーに%t (タイムスタンプ)が含まれている場合にエラーを返します。
- パラメータ:
object - オブジェクトは、導出キーが依存しているすべてのプロパティを含む必要があります。
- 戻り値:
- 次に例を示します:
func (t *Controller) CustomGetterForSupplier(License string, Name string)(interface{}, error){
var asset Supplier
asset.License = License
asset.Name = Name
id,err := t.Ctx.Model.GetId(&asset)
if err !=nil {
return nil, fmt.Errorf("error in getting ID %v", err.Error())
}
return t.GetSupplierById(id)
}
ユーティリティ・パッケージ
ユーティリティ・パッケージには、次のメソッドが用意されています。
-
Util.CreateModel
- 指定されたJSON文字列を解析し、指定されたタイプのアセット・オブジェクトを作成します。
func CreateModel(obj interface{}, inputString string) error
- パラメータ:
inputString (string) - オブジェクトの作成に使用する入力JSON文字列。
obj (interface{}) - JSON文字列から作成するオブジェクトの参照。このオブジェクトには、バリデータ・タグを使用して検証される、作成済モデルも格納されます。
- 戻り値:
error - アセットの作成中または検証中にエラーが返された場合はエラーが含まれます。
-
util.ConvertMapToStruct
- 指定されたマップを指定されたタイプのオブジェクトに変換します。
func ConvertMapToStruct(inputMap map[string](interface{}), resultStruct
interface{}) error
- パラメータ:
inputMap (map[string](interface{})) - アセット・オブジェクトに変換するマップ。
resultStruct (interface{}) - マップから作成するアセット・オブジェクトの参照。
- 戻り値:
error - アセットの作成中または検証中にエラーが返された場合はエラーが含まれます。
トークンSDKメソッドについては、「ブロックチェーン・アプリケーション・ビルダーを使用したトークン化のサポート」のトピックを参照してください。
コントローラ
Controller.goファイルは、アセットの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
}
Goチェーンコードの場合、すべてのカスタム・メソッドは、次の例に示すように、
empty interfaceと
errorの2つの値を返す必要があります。
func (t *Controller) FetchRawMaterial(supplierId string, rawMaterialSupply int) (interface{}, error) {
return nil, nil
}
初期化メソッド
カスタムのInitメソッドが、空の定義でコントローラに提供されます。ブロックチェーン・アプリケーション・ビルダーを使用してデプロイまたはアップグレードする場合、Initメソッドが自動的にコールされます。Oracle Blockchain Platformコンソールからデプロイまたはアップグレードする場合は、Initメソッドを手動でコールする必要があります。Postmanなどのサードパーティ・ツールを使用して、Initメソッドを手動でコールできます。
type Controller struct {
}
func (t *Controller) Init(args string) (interface{}, error)
{ return nil, nil
}
このメソッドを使用して、すべてのアプリケーションの状態を初期化できます。