スキャフォールド済TypeScriptチェーンコード・プロジェクト

ブロックチェーン・アプリケーション・ビルダーは、仕様ファイルから入力を受け取り、完全に機能するチェーンコード・プロジェクトを生成します。このプロジェクトには、自動生成されたクラスと関数、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;
}
この例では、assetSupplierタイプです。
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[ ] - 作成されるコンポジット・キーに基づく属性。
戻り値:
  • string - コンポジット・キーを返します。
getByCompositeKey
このメソッドは、コンポジット・キーの作成中に属性パラメータに指定されたキーおよび列に一致するアセットを返します。indexOfIdパラメータは、スタブ・メソッドSplitCompositeKeyの配列で返されるキーの索引を指定します。内部的には、Hyperledger FabricのgetStateByPartialCompositeKeysplitCompositeKeyおよび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
パラメータ:
  • なし
戻り値:
  • string - チャネルIDを返します。
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;
}

この時点でアプリケーションの状態を初期化する場合は、このメソッドを使用して初期化できます。