ブロックチェーン・アプリケーション・ビルダーは、仕様ファイルから入力を受け取り、完全に機能するチェーンコード・プロジェクトを生成します。このプロジェクトには、自動生成されたクラスと関数、CRUDメソッド、SDKメソッド、引数の自動検証、マーシャリング/アンマーシャリングおよび透過的な永続性機能(ORM)が含まれます。
チェーンコード・プロジェクトでTypeScript言語を使用する場合、スキャフォールディング済プロジェクトには次の3つのメイン・ファイルが含まれます:
main.ts
<chaincodeName>.model.ts
<chaincodeName>.controller.ts
必要なライブラリがすべてインストールされ、パッケージ化されます。
tsconfig.json
ファイルには、TypeScriptプロジェクトのコンパイルおよびビルドに必要な構成が含まれています。
model
サブディレクトリの<chaincodeName>.model.ts
ファイルには複数のアセット定義が含まれ、controller
サブディレクトリの<chaincodeName>.controller.ts
ファイルにはアセットの動作とCRUDメソッドが含まれます。
model.ts
およびcontroller.ts
の各種デコレータは、引数の自動検証、引数の整列化/非マーシャリング、透過的永続性機能(ORM)およびリッチ問合せのコールなどの機能をサポートしています。
モデル
すべてのモデル・クラスは、OchainModel
クラスを拡張します。このクラスには、assetType
という追加の読取り専用プロパティがあります。このプロパティは、このタイプのアセットのフェッチにのみ使用できます。このプロパティへの変更は、アセットの作成および更新時に無視されます。デフォルトのプロパティ値は<modelName>
です。
OchainModel
クラスは、クラスのプロパティに対してデコレータの動作を強制します。
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
public readonly assetType = 'supplier';
@Mandatory()
@Validate(yup.string())
public supplierId: string;
デコレータ
-
クラス・装飾
@Id(identifier)
- このデコレータは、基礎となるアセットを一意に定義するプロパティを識別します。このプロパティは、チェーンコードの状態でこのアセットを表すレコードのキーとして使用されます。このデコレータは、新しいTypeScriptプロジェクトがスキャフォールドされると自動的に適用されます。デコレータの識別子引数は、仕様ファイルから値を取得します。
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
プロパティ・デコレータ
- 複数のプロパティ・装飾を使用できます。デコレータは上から下の順に解決されます。
@Mandatory()
- これにより、次のプロパティが必須としてマークされるため、レジャーへの保存中にスキップできません。スキップすると、エラーがスローされます。
@Mandatory()
public supplierID: string;
@Default(param)
- このプロパティーにはデフォルト値を指定できます。台帳への保存中にプロパティがスキップされると、引数(
param
)のデフォルト値が使用されます。@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
- 次のプロパティは、パラメータに指定されたスキーマに対して検証されます。引数
param
はyupスキーマを使用し、多数のスキーマ・メソッドを連鎖させることができます。多数の複雑な検証を追加できます。詳細は、https://www.npmjs.com/package/yupを参照してください。@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- このプロパティ・デコレータは、基礎となるプロパティを読取り専用値としてマークします。引数の値(paramなど)は、プロパティが元帳に保存されるときに使用されます。一度設定した値は、編集または削除できません。
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- このプロパティ・装飾は、基礎となるプロパティを埋込み可能アセットとしてマークします。埋込み可能クラスをパラメータとして使用します。このクラスは、
EmbeddedModel
クラスを拡張する必要があります。これはデコレータによって検証されます。
- この例では、
Employee
には、Employee
アセットに埋め込まれるAddress
タイプのaddress
というプロパティがあります。これは、@Embedded()
デコレータによって示されます。
export class Employee extends OchainModel<Employee> {
public readonly assetType = 'employee';
@Mandatory()
@Validate(yup.string())
public emplyeeID: string;
@Mandatory()
@Validate(yup.string().max(30))
public firstName: string;
@Mandatory()
@Validate(yup.string().max(30))
public lastName: string;
@Validate(yup.number().positive().min(18))
public age: number;
@Embedded(Address)
public address: Address;
}
export class Address extends EmbeddedModel<Address> {
@Validate(yup.string())
public street: string;
@Validate(yup.string())
public city: string;
@Validate(yup.string())
public state: string;
@Validate(yup.string())
public country: string;
}
Address
クラスの新しいインスタンスが作成されると、Address
クラスのすべてのプロパティが@Validate()
デコレータによって自動的に検証されます。Address
クラスには、assetType
プロパティまたは@Id()
クラス・デコレータがありません。このアセットとそのプロパティは、元帳に個別に保存されませんが、Employee
アセットとともに保存されます。埋込みアセットは、値タイプとして機能するユーザー定義クラスです。このクラスのインスタンスは、含まれているオブジェクト(OchainModel
アセット)の一部としてのみレジャーに格納できます。前述のデコレータはすべて、プロジェクトのスキャフォールド時に入力ファイルに基づいて自動的に適用されます。
@Derived(STRATEGY, ALGORITHM, FORMAT)
- この装飾は、他のプロパティから導出された属性を定義するために使用します。このデコレータには、次の2つの必須パラメータがあります:
STRATEGY
: CONCAT
またはHASH
の値を使用します。HASH
が選択されている場合は、追加のパラメータALGORITHM
が必要です。デフォルトのアルゴリズムはsha256
で、md5
もサポートされています。
FORMAT
: 戦略で使用される仕様文字列と値の配列を使用します。
@Id('supplierID')
export class Supplier extends OchainModel<Supplier> {
public readonly assetType = 'supplier';
@Mandatory()
@Derived(STRATEGY.HASH.'sha256',['IND%1IND%2','license','name'])
@Validate(yup.string())
public supplierID: string;
@Validate(yup.string().min(2).max(4))
public license: string;
@Validate(yup.string().min(2).max(4))
public name: string;
-
メソッド・デコレータ
@Validator(…params)
- このデコレータは、メイン・コントローラ・クラスのメソッドに適用されます。この装飾は、引数を解析し、すべてのプロパティ・デコレータに対して検証し、モデル/タイプ・オブジェクトを返す際に重要です。コントローラメソッドを呼び出すには、このデコレータが必要です。複数のユーザーで作成されたモデルまたはyupスキーマをパラメータとして使用します。
- パラメータの順序は、メソッド内の引数の順序とまったく同じである必要があります。
- 次の例では、メソッド引数の
asset
タイプに対応するパラメータでSupplier
モデル参照が渡されます。実行時に、デコレータはメソッド引数を解析してJSONオブジェクトに変換し、Supplier
バリデータに対して検証し、検証に成功すると、JSONオブジェクトをSupplier
オブジェクトに変換してasset
変数に割り当てます。次に、基礎となるメソッドが最終的に呼び出されます。@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
- 次の例では、メソッド引数のオブジェクト型に対応する、複数のアセット参照が渡されます。パラメータの順序に注意してください。
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
- 引数が基本的な型の場合は、アセット参照とは別に、yupスキーマ・オブジェクトも渡すことができます。次の例では、
supplierId
およびrawMaterialSupply
はそれぞれstring
およびnumber
型であるため、同様の型および正しい順序のyupスキーマがデコレータに渡されます。yupスキーマ・メソッドのチェーンに注意してください。@Validator(yup.string(), yup.number().positive())
public async fetchRawMaterial(supplierID: string, rawMaterialSupply: number) {
const supplier = await this.Ctx.Model.get(supplierID, Supplier);
supplier.rawMaterialAvailable = supplier.rawMaterialAvailable + rawMaterialSupply;
return await this.Ctx.Model.update(supplier);
}
ORM
透過的永続性機能または簡略化されたORMは、コンテキスト(Ctx
)オブジェクトのModel
クラスに取得されます。モデルで次のSDKメソッドのいずれかをコールする場合は、this.Ctx.Model
を使用してアクセスします。
ORMを実装するSDKメソッドは次のとおりです。
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のメソッドを参照してください。
SDKメソッド
ノート:
バージョン21.3.2以降、ORMメソッドにアクセスする方法が変更されました。
ochain --version
コマンドを実行して、ブロックチェーン・アプリケーション・ビルダーのバージョンを確認します。
以前のリリースでは、ORMメソッドはOchainModel
クラスから継承されていました。バージョン21.3.2以降では、メソッドはContext (Ctx
)オブジェクトのModel
クラスで定義されます。これらのメソッドをコールするには、this.Ctx.Model.<method_name>
を使用してアクセスします。
次の例は、以前のリリースでのメソッド・コールを示しています。
@Validator(Supplier)
public async createSupplier(asset: Supplier){
return await asset.save();
}
次の例は、バージョン21.3.2以降からのメソッド・コールを示しています。
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
バージョン21.3.2にアップグレードした後、以前のバージョンのブロックチェーン・アプリケーション・ビルダーで作成したすべてのチェーンコード・プロジェクトで、この変更を行います。sync
コマンドを使用して仕様ファイルとソース・コード間の変更を同期すると、すぐに使用できるメソッドの変更がコントローラに自動的に反映されます。競合は手動で解決する必要があります。
-
save
save
メソッドは、コール元のasset
詳細をレジャーに追加します。
- このメソッドは、Hyperledger Fabricの
putState
を内部的にコールします。すべてのマーシャリング/アンマーシャリングは内部的に処理されます。save
メソッドは、Ctx
オブジェクトを使用してアクセスするModel
クラスの一部です。
-
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- パラメータ:
extraMetadata : any
(オプション) - アセットとは別にメタデータをレジャーに保存します。
- 戻り値:
Promise<any>
- 完了時にpromiseを返します
- 次に例を示します:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
-
get
get
メソッドは、{chaincodeName}.model.ts
の具象モデル・クラスによって継承されるOchainModel
クラスのメソッドです。get
メソッドは、Ctx
オブジェクトを使用してアクセスするModel
クラスの一部です。
- 指定された
id
によってアセットを返す場合は、汎用コントローラ・メソッドgetAssetById
を使用します。
-
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
modelName: <Model Asset Class Name>
- (オプション)返すモデル・アセット・クラス。
- 戻り値:
Promise: <Asset>
- modelName
パラメータが指定されておらず、データがレジャーに存在する場合、Promise<object>
が返されます。id
パラメータが元帳に存在しない場合は、エラー・メッセージが返されます。modelName
パラメータを指定すると、<Asset>
型のオブジェクトが返されます。指定されたid
を持つアセットがレジャーから返されても、このメソッドはコール元のAsset
タイプにキャストします。台帳から返されたアセットがAsset
タイプでない場合は、エラーがスローされます。このチェックは、Model
クラスの読取り専用のassetType
プロパティによって行われます。
- 次に例を示します:
@Validator(yup.string())
public async getSupplierById(id: string) {
const asset = await this.Ctx.Model.get(id, Supplier);
return asset;
}
この例では、asset
はSupplier
タイプです。
-
update
update
メソッドは、レジャーのコール元asset
の詳細を更新します。このメソッドは、Promiseを返します。
- このメソッドは、Hyperledger Fabricの
putState
を内部的にコールします。整列化/非整列化はすべて内部的に処理されます。update
メソッドは、Model
クラスの一部であり、Ctx
オブジェクトを使用してアクセスできます。
-
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- パラメータ:
extraMetadata : any
(オプション) - アセットとは別にメタデータをレジャーに保存します。
- 戻り値:
Promise<any>
- 完了時にpromiseを返します
- 次に例を示します:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
-
delete
- これにより、
id
で指定されたレジャーからアセットが削除されます(存在する場合)。このメソッドは、Hyperledger FabricのdeleteState
メソッドを内部的にコールします。delete
メソッドは、Model
クラスの一部であり、Ctx
オブジェクトを使用してアクセスできます。
-
Ctx.Model.delete(id: string): Promise <any>
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
- 戻り値:
Promise <any>
- 完了時にpromiseを返します。
- 次に例を示します:
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
-
history
history
メソッドは、Model
クラスの一部であり、Ctx
オブジェクトを使用してアクセスできます。このメソッドは、レジャーからid
によって指定されたアセット履歴を返します(存在する場合)。
- このメソッドは、Hyperledger Fabricの
getHistoryForKey
メソッドを内部的にコールします。
-
Ctx.Model.history(id: string): Promise <any>
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
- 戻り値:
Promise <any[]>
- 完了時に任意の[]を返します。
- 例
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
getSupplierHistoryById
に対して返されるアセット履歴の例:[
{
"trxId": "8ef4eae6389e9d592a475c47d7d9fe6253618ca3ae0bcf77b5de57be6d6c3829",
"timeStamp": 1602568005,
"isDelete": false,
"value": {
"assetType": "supplier",
"supplierId": "s01",
"rawMaterialAvailable": 10,
"license": "abcdabcdabcd",
"expiryDate": "2020-05-28T18:30:00.000Z",
"active": true
}
},
{
"trxId": "92c772ce41ab75aec2c05d17d7ca9238ce85c33795308296eabfd41ad34e1499",
"timeStamp": 1602568147,
"isDelete": false,
"value": {
"assetType": "supplier",
"supplierId": "s01",
"rawMaterialAvailable": 15,
"license": "valid license",
"expiryDate": "2020-05-28T18:30:00.000Z",
"active": true
}
}
]
-
getByRange
getByRange
メソッドは、{chaincodeName}.model.ts
の具体的なModel
クラスによって継承されるOchainModel
クラスの静的メソッドです。
- これは、
startId
からendId
の範囲のアセットのリストを返します。このメソッドは、Hyperledger FabricのgetStateByRange
メソッドを内部的にコールします。
modelName
パラメータが指定されていない場合、メソッドはPromise<Object [ ] >
を返します。modelName
パラメータが指定されている場合、メソッドは呼出し側のModel
型へのキャストを処理します。次の例では、結果配列はSupplier
型です。台帳から返されたアセットがModel
タイプでない場合は、リストには含まれません。このチェックは、Model
クラスの読取り専用のassetType
プロパティによって行われます。
startId
からendId
の範囲のすべてのアセットを返すには、汎用コントローラ・メソッドgetAssetsByRange
を使用します。
-
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
- パラメータ:
startId : string
- 範囲の開始キー。範囲に含まれます。
endId : string
- 範囲の終了キー。範囲から除外されます。
modelName: <Model Asset Class Name>
- (オプション)返すモデル・アセット・クラス。
- 戻り値:
Promise< Asset[ ] >
- 完了時に<Asset>
の配列を返します。
- 次に例を示します:
@Validator(yup.string(), yup.string())
public async getSupplierByRange(startId: string, endId: string) {
const result = await this.Ctx.Model.getByRange(startId, endId, Supplier);
return result;
}
-
getByRangeWithPagination
getByRangeWithPagination
メソッドは、{chaincodeName}.model.ts
の具象Model
クラスによって継承されるOchainModel
クラスの静的メソッドです。
- これは、
startId
からendId
の範囲のアセットのリストを返します。このメソッドは、Hyperledger FabricのgetStateByRangeWithPagination
メソッドを内部的にコールします。
modelName
パラメータが指定されていない場合、メソッドはPromise<Object [ ] >
を返します。modelName
パラメータが指定されている場合、メソッドは呼出し側のModel
型へのキャストを処理します。次の例では、結果配列はSupplier
型です。台帳から返されたアセットがModel
タイプでない場合は、リストには含まれません。このチェックは、Model
クラスの読取り専用のassetType
プロパティによって行われます。
- ページ・サイズおよびブックマークでフィルタされた、
startId
からendId
の範囲内のすべてのアセットを返すには、汎用コントローラ・メソッドgetAssetsByRange
を使用します。
-
public async getByRangeWithPagination<T extends OchainModel<T>>(startId: string, endId: string, pageSize: number, bookmark?: string, instance?: new (data: any, skipMandatoryCheck: boolean, skipReadOnlyCheck: boolean) => T): Promise<T[]>
- パラメータ:
startId : string
- 範囲の開始キー。範囲に含まれます。
endId : string
- 範囲の終了キー。範囲から除外されます。
pageSize : number
- 問合せのページ・サイズ。
bookmark : string
- 問合せのブックマーク。出力はこのブックマークから始まります。
modelName: <Model Asset Class Name>
- (オプション)返すモデル・アセット・クラス。
- 戻り値:
Promise< Asset[ ] >
- 完了時に<Asset>
の配列を返します。
-
getId
- アセットに
ID
として導出キーがある場合、このメソッドを使用して導出IDを取得できます。導出キーに%t
(タイムスタンプ)が含まれている場合、このメソッドはエラーを返します。
- パラメータ:
object
- オブジェクトには、導出キーが依存するすべてのプロパティが含まれている必要があります。
- 戻り値:
- 次に例を示します:
@Validator(yup.string(), yup.string())
public async customGetterForSupplier(license: string, name: string){
let object = {
license : license,
name: name
}
const id = await this.Ctx.Model.getID(object);
return this.Ctx.Model.get(id);
}
トークンSDKメソッドについては、「ブロックチェーン・アプリケーション・ビルダーを使用したトークン化サポート」のトピックを参照してください。
コントローラ
メイン・コントローラ・クラスは、OchainController
を拡張します。メインコントローラは1つのみです。
export class TSProjectController extends OchainController{
クラス、関数またはファイルはいくつでも作成できますが、メイン・コントローラ・クラス内で定義されているメソッドのみが外部から呼出し可能で、残りのメソッドは非表示になります。
自動生成されたメソッド
「入力仕様ファイル」で説明されているように、生成するCRUDメソッドを仕様ファイルで指定できます。たとえば、すべてのメソッドの生成を選択した場合の結果は次のようになります:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
@Validator(yup.string())
public async getSupplierById(id: string) {
const asset = await this.Ctx.Model.get(id, Supplier);
return asset;
}
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
@Validator(yup.string(), yup.string())
public async getSupplierByRange(startId: string, endId: string) {
const result = await this.Ctx.Model.getByRange(startId, endId, Supplier);
return result;
}
管理者の方法の詳細
前述のモデルのCRUDメソッドおよびCRUD以外のメソッドとは別に、ブロックチェーン・アプリケーション・ビルダーでは、コントローラからの他のHyperledger Fabricメソッドに即時対応可能なサポートを提供しています。メソッドは次のとおりです。
getAssetById
getAssetsByRange
getAssetHistoryById
query
queryWithPagination
generateCompositeKey
getByCompositeKey
getTransactionId
getTransactionTimestamp
getChannelID
getCreator
getSignedProposal
getArgs
getStringArgs
getMspID
getNetworkStub
ノート:
これらのメソッドは、
OChainController
クラスを拡張する任意のクラスの
this
コンテキストで使用できます。
たとえば次のようにします。
public async getModelById(id: string) {
const asset = await this.getAssetById(id);
return asset;
}
@Validator(yup.string(), yup.string())
public async getModelsByRange(startId: string, endId: string) {
const asset = await this.getAssetsByRange(startId, endId);
return asset;
}
public async getModelHistoryById(id: string) {
const result = await this.getAssetHistoryById(id);
return result;
}
-
getAssetById
getAssetById
メソッドは、指定されたid
に基づいてアセットを返します。これは汎用メソッドで、任意のタイプのアセットを取得するために使用されます。
this.getAssetById(id: string): Promise<byte[]>
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
- 戻り値:
Promise <byte [ ]>
- 完了時にpromiseを返します。byte[]
をオブジェクトに変換する必要があります。
-
getAssetsByRange
getAssetsByRange
メソッドは、アセット・タイプに関係なく、startId
(これを含む)からendId
(これを含まない)までのすべてのアセットを返します。これは汎用メソッドであり、任意のタイプのアセットを取得するために使用できます。
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
- パラメータ:
startId : string
- 範囲の開始キー。範囲に含まれます。
endId : string
- 範囲の終了キー。範囲から除外されます。
- 戻り値:
Promise< shim.Iterators.StateQueryIterator>
- 完了時にイテレータを返します。これに対して反復する必要があります。
-
getAssetHistoryById
getAssetHistoryById
メソッドは、指定されたid
に対するアセットの履歴イテレータを返します。
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
- 戻り値:
Promise<shim.Iterators.HistoryQueryIterator>
- 履歴問合せ反復子を返します。これに対して反復する必要があります。
-
query
query
メソッドは、レジャーに対してリッチSQL/Couch DB問合せを実行します。このメソッドは、Oracle Blockchain Platformでのリモート・デプロイメントでのみサポートされます。これは、レジャーでSQL問合せを実行するための一般的な方法です。
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
- パラメータ:
queryStr : string
- Rich SQL/Couch DB問合せ。
- 戻り値:
Promise<shim.Iterators.StateQueryIterator>
- 状態問合せ反復子を返します。これに対して反復する必要があります。
-
queryWithPagination
- このメソッドは、ページ・サイズおよびブックマークでフィルタされた、元帳に対してリッチSQL/Couch DB問合せを実行します。このメソッドは、Oracle Blockchain Platformでのリモート・デプロイメントでのみサポートされます。これは、レジャーでSQL問合せを実行するための一般的な方法です。
-
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
- パラメータ:
query : string
- Rich SQL/Couch DB問合せ。
pageSize : number
- 問合せのページ・サイズ。
bookmark : string
- 問合せのブックマーク。出力はこのブックマークから始まります。
- 戻り値:
Promise<shim.Iterators.StateQueryIterator>
- 状態問合せ反復子を返します。これに対して反復する必要があります。
-
generateCompositeKey
- このメソッドは、
indexName
および引数で指定された属性に基づいてコンポジット・キーを生成し、返します。
this.generateCompositeKey(indexName: string, attributes:
string[]): string
- パラメータ:
indexName : string
- レジャーへのデータの保存に使用されるキーのオブジェクト・タイプ。
attributes: string[ ]
- 作成されるコンポジット・キーに基づく属性。
- 戻り値:
-
getByCompositeKey
- このメソッドは、コンポジット・キーの作成中に属性パラメータに指定されたキーおよび列に一致するアセットを返します。
indexOfId
パラメータは、スタブ・メソッドSplitCompositeKey
の配列で返されるキーの索引を指定します。内部的には、Hyperledger FabricのgetStateByPartialCompositeKey
、splitCompositeKey
およびgetState
をコールします。
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
- パラメータ:
key: string
- レジャーへのデータの保存に使用されるキー。
columns: string[ ]
- キーに基づく属性が生成されます。
indexOfId: number
- キーから取得される属性の索引。
- 戻り値:
Promise< any [ ]
- 完了時に任意の[]
を返します。
-
getTransactionId
- 現在のチェーンコード呼出しリクエストのトランザクションIDを返します。トランザクションIDは、チャネルのスコープ内でトランザクションを一意に識別します。
this.getTransactionId(): string
- パラメータ:
- 戻り値:
string
- 現在のチェーンコード呼出しリクエストのトランザクションIDを返します。
-
getTransactionTimestamp
- トランザクションが作成されたときのタイムスタンプを返します。これはトランザクション
ChannelHeader
から取得されるため、クライアントのタイムスタンプを示し、すべてのエンドーサで同じ値になります。
this.getTransactionTimestamp(): Timestamp
- パラメータ:
id : string
- レジャーにデータを保存するために使用されるキー。
- 戻り値:
Timestamp
- トランザクションが作成されたときのタイムスタンプを返します。
-
getChannelID
- 処理するチェーンコードの提案のチャネルIDを返します。
this.getChannelID(): string
- パラメータ:
- 戻り値:
-
getCreator
- チェーンコード呼出しの発行者のアイデンティティ・オブジェクトを返します。
this.getCreator(): shim.SerializedIdentity
- パラメータ:
- 戻り値:
shim.SerializedIdentity
- アイデンティティ・オブジェクトを返します。
-
getSignedProposal
- 署名済トランザクション提案の完全にデコードされたオブジェクトを返します。
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
- パラメータ:
- 戻り値:
shim.ChaincodeProposal.SignedProposal
- 署名済トランザクション提案のデコードされたオブジェクトを返します。
-
getArgs
- チェーンコード呼出しリクエストから引数を文字列の配列として返します。
this.getArgs(): string[]
- パラメータ:
- 戻り値:
string [ ]
- チェーンコード呼出しから文字列の配列として引数を返します。
-
getStringArgs
- チェーンコード呼出しリクエストから引数を文字列の配列として返します。
this.getStringArgs(): string[]
- パラメータ:
- 戻り値:
string [ ]
- チェーンコード呼出しから文字列の配列として引数を返します。
-
getMspID
- 呼出し側アイデンティティのMSP IDを返します。
this.getMspID(): string
- パラメータ:
- 戻り値:
string
- 呼出し側アイデンティティのMSP IDを返します。
-
getNetworkStub
- ユーザーは、
getNetworkStub
メソッドをコールすることでshimスタブにアクセスできます。これは、ユーザーがアセットを直接操作する独自の実装を記述するのに役立ちます。
this.getNetworkStub(): shim.ChaincodeStub
- パラメータ:
- 戻り値:
shim.ChaincodeStub
- チェーンコード・ネットワーク・スタブを返します。
-
invokeCrossChaincode
- このメソッドをチェーンコードで使用して、別のチェーンコード内の関数を呼び出すことができます。両方のチェーンコードが同じピアにインストールされている必要があります。
-
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- パラメータ:
chaincodeName
- コールするチェーンコードの名前。
methodName
- チェーンコード内でコールするメソッドの名前。
arg
- コール元のメソッドの引数。
channelName
- コールするチェーンコードがあるチャネル。
- 戻り値:
Promise<any>
- 3つのフィールドを含むJSONオブジェクトを返します:
isValid
- コールが有効な場合はtrue
。
payload
- JSONオブジェクトとしてクロスチェーンコード・コールによって返される出力。
message
- UTF-8形式のクロスチェーンコード・コールによって返されるメッセージ。
-
invokeChaincode
- このメソッドをチェーンコードで使用して、別のチェーンコード内の関数を呼び出すことができます。両方のチェーンコードが同じピアにインストールされている必要があります。
-
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- パラメータ:
chaincodeName
- コールするチェーンコードの名前。
methodName
- チェーンコード内でコールするメソッドの名前。
arg
- コール元のメソッドの引数。
channelName
- コールするチェーンコードがあるチャネル。
- 戻り値:
Promise<any>
- 3つのフィールドを含むJSONオブジェクトを返します:
isValid
- コールが有効な場合はtrue
。
payload
- JSONオブジェクトとしてクロスチェーンコード・コールによって返される出力。
message
- UTF-8形式のクロスチェーンコード・コールによって返されるメッセージ。
カスタム・メソッド
この例の仕様ファイルから、次のカスタム・メソッドが生成されました。
executeQuery
は、SQLリッチ問合せのコール方法を示しています。引数に対するバリデータは、仕様ファイルで指定された引数のタイプに基づいてブロックチェーン・アプリケーション・ビルダーによって自動的に追加されます。
/**
*
* 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.
*
*/
@Validator(yup.string()}
public async executeQuery(query: string) {
const result = await OchainController.query(query);
return result;
}
@Validator(yup.string(), yup.number()}
public async fetchRawMaterial(supplierId: string, rawMaterialSupply: number) {
}
@Validator(yup.string(), yup.string(), yup.number())
public async getRawMaterialFromSupplier(manufacturerId: string, supplierId: string, rawMaterialSupply: number) {
}
@Validator(yup.string(), yup.number(), yup.number())
public async createProducts(manufacturerId: string, rawMaterialConsumed: number, productsCreated: number) {
}
public async sendProductsToDistribution() {
}
初期メソッド
コントローラには、空の定義を持つカスタムinit
メソッドが用意されています。ブロックチェーン・アプリケーション・ビルダーを使用してデプロイまたはアップグレードする場合、init
メソッドが自動的にコールされます。Hyperledger Fabric v1.4.7プラットフォームでOracle Blockchain Platformコンソールからデプロイまたはアップグレードすると、init
メソッドも自動的にコールされます。Hyperledger Fabric v2.xプラットフォームでOracle Blockchain Platformコンソールからデプロイまたはアップグレードする場合は、init
メソッドを手動でコールする必要があります。Postmanなどのサードパーティ・ツールを使用して、init
メソッドを手動でコールできます。
export class TestTsProjectController extends OchainController {
public async init(params: any) {
return;
}
この時点でアプリケーションの状態を初期化する場合は、このメソッドを使用して初期化できます。