鷹架式 TypeScript 鏈碼專案

Blockchain App Builder 會從您的規格檔案中取得輸入,並產生功能完整的鷹架式鏈碼專案。專案包含自動產生的類別和函數、CRUD 方法、SDK 方法、自動驗證引數、封送處理 (Marshal) / 解除封送處理 (un-marshal) 以及通透保存功能 (ORM)。

如果鏈碼專案使用 TypeScript 語言,則鷹架式專案包含三個主要檔案:
  • main.ts
  • <chaincodeName>.model.ts
  • <chaincodeName>.controller.ts
會安裝並封裝所有必要的磁帶櫃。tsconfig.json 檔案包含編譯和建置 TypeScript 專案的必要組態。

model 子目錄中的 <chaincodeName>.model.ts 檔案包含多個資產定義,而 controller 子目錄中的 <chaincodeName>.controller.ts 檔案包含資產行為和 CRUD 方法。

model.tscontroller.ts 中的各種裝飾器支援自動驗證引數、封送處理 (Marshal) / 解除封送處理 (Unmarshal) 引數、通透保存功能 (ORM) 以及呼叫 Rich 查詢等功能。

模型

每個模型類別都會擴充 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 專案時,會自動套用此修飾器。修飾器的 'identifier' 引數採用規格檔案中的值。
@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 具有名為 address 的特性,其類型為 Address,要內嵌於 Employee 資產中。這是由 @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 類別的新執行處理時,@Validate() 修飾器會自動驗證 Address 類別的所有特性。請注意,Address 類別沒有 assetType 特性或 @Id() 類別修飾器。此資產及其特性不會個別儲存在分類帳中,但會與 Employee 資產一起儲存。內嵌資產是使用者定義的類別,可作為值類型。此類別的執行環境只能儲存於分類帳中,作為包含物件 (OchainModel 資產) 的一部分。上述所有修飾器均會根據輸入檔自動套用,同時鷹架專案。
@Derived(STRATEGY, ALGORITHM, FORMAT)
此修飾器用於定義衍生自其他特性的屬性。此修飾條件有兩個必要參數:
  • STRATEGY:採用 CONCATHASH 的值。如果選取 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 綱要作為參數。
參數的順序必須與方法中引數的順序完全相同。
在下列範例中,Supplier 模型參照會傳送到與方法引數中 asset 類型對應的參數中。在程式實際執行時,修飾器會將方法引數剖析並轉換成 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 綱要物件。在下列範例中,supplierIdrawMaterialSupply 的類型分別為 stringnumber,因此會將類似類型和正確順序的 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

在 Context (Ctx) 物件的 Model 類別中擷取「通透保存功能」或簡化的 ORM。如果您的模型呼叫下列任一 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 命令以判斷 Blockchain App Builder 的版本。

在先前的發行版本中,ORM 方法是從 OchainModel 類別繼承而來。在版本 21.3.2 和更新版本中,方法是在 Model Class of Context (Ctx) 物件中定義。若要呼叫這些方法,請使用 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 之後,請變更您使用舊版 Blockchain App Builder 建立的所有鏈碼專案。如果您使用 sync 指令來同步規格檔案與原始程式碼之間的變更,系統會自動將變更帶到控制器中,以提供立即可用的方法。您仍然需要手動解決任何衝突。

save
save 方法會將呼叫程式 asset 詳細資訊新增至分類帳。
此方法會在內部呼叫 Hyperledger Fabric putState。所有封送處理 / 解除封送處理都會在內部處理。save 方法是 Model 類別的一部分,您可以使用 Ctx 物件來存取此類別。
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
參數:
  • extraMetadata : any (選擇性) - 將資產以外的中繼資料儲存至分類帳。
傳回值:
  • Promise<any> - 傳回完成時的承諾
範例:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}
get
get 方法是 OchainModel 類別的方法,由 {chaincodeName}.model.ts 的具體模型類別繼承。get 方法是 Model 類別的一部分,您可以使用 Ctx 物件來存取此類別。
如果您要以指定的 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> - 傳回完成時的承諾
範例:
@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> - 傳回完成時的承諾。
範例:
@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 方法是 OchainModel 類別的 static 方法,由 {chaincodeName}.model.ts 的具體 Model 類別繼承。
這會傳回介於 startIdendId 範圍之間的資產清單。此方法會在內部呼叫 Hyperledger Fabric getStateByRange 方法。
如果未提供 modelName 參數,則方法會傳回 Promise<Object [ ] >。如果提供 modelName 參數,則方法會處理轉換至呼叫程式 Model 類型。在下列範例中,結果陣列的類型是 Supplier。如果從分類帳傳回的資產不是 Model 類型,則不會將其包含在清單中。此檢查是由 Model 類別中的唯讀 assetType 特性所完成。
若要傳回範圍 startIdendId 之間的所有資產,請使用一般控制器方法 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 方法是 OchainModel 類別的 static 方法,由 {chaincodeName}.model.ts 的具體 Model 類別繼承。
這會傳回介於 startIdendId 範圍之間的資產清單。此方法會在內部呼叫 Hyperledger Fabric getStateByRangeWithPagination 方法。
如果未提供 modelName 參數,則方法會傳回 Promise<Object [ ] >。如果提供 modelName 參數,則方法會處理轉換至呼叫程式 Model 類型。在下列範例中,結果陣列的類型是 Supplier。如果從分類帳傳回的資產不是 Model 類型,則不會將其包含在清單中。此檢查是由 Model 類別中的唯讀 assetType 特性所完成。
若要傳回 startIdendId 範圍之間的所有資產 (依頁面大小和書籤篩選),請使用一般控制器方法 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 方法,請參閱使用區塊鏈 App 產生器進行記號化支援下的主題。

控制器

主控制器類別延伸 OchainController。只有一個主控制器。

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 方法外,Blockchain App Builder 還提供立即可用的控制器 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 [ ]> - 傳回完成時的承諾。您必須將 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 方法將對分類帳執行 Rich SQL/Couch DB 查詢。只有 Oracle Blockchain Platform 上的遠端部署才支援此方法。這是在分類帳上執行 SQL 查詢的一般方法。
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
參數:
  • queryStr : string - 豐富的 SQL/Couch 資料庫查詢。
傳回值:
  • Promise<shim.Iterators.StateQueryIterator> - 傳回狀態查詢迭代器。您必須重複一下。
queryWithPagination
此方法會對分類帳執行 Rich SQL/Couch 資料庫查詢,並依頁面大小與書籤篩選。只有 Oracle Blockchain Platform 上的遠端部署才支援此方法。這是在分類帳上執行 SQL 查詢的一般方法。
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
參數:
  • query : string - 豐富的 SQL/Couch 資料庫查詢。
  • pageSize : number - 查詢的頁面大小。
  • bookmark : string - 查詢的書籤。輸出會從此書籤開始。
傳回值:
  • Promise<shim.Iterators.StateQueryIterator> - 傳回狀態查詢迭代器。您必須重複一下。
generateCompositeKey
此方法會根據 indexName 和引數中指定的屬性來產生和傳回複合索引鍵。
this.generateCompositeKey(indexName: string, attributes:
string[]): string
參數:
  • indexName : string - 用來將資料儲存至分類帳之索引鍵的「物件類型」。
  • attributes: string[ ] - 根據要形成複合索引鍵的屬性。
傳回值:
  • string - 傳回複合索引鍵。
getByCompositeKey
此方法會傳回在建立複合索引鍵時,符合索引鍵與屬性參數中指定之資料欄的資產。indexOfId 參數代表 stub 方法 SplitCompositeKey 陣列中傳回之索引鍵的索引。此方法會在內部呼叫 Hyperledger Fabric 的 getStateByPartialCompositeKeysplitCompositeKeygetState
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 stub。這將協助使用者撰寫自己直接使用資產的實行。
this.getNetworkStub(): shim.ChaincodeStub
參數:
傳回值:
  • shim.ChaincodeStub - 傳回鏈碼網路 stub。
invokeCrossChaincode
您可以在鏈碼中使用此方法來呼叫另一個鏈碼中的函數。兩個鏈碼都必須安裝在同一個對等體上。
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
參數:
  • chaincodeName - 要呼叫的鏈碼名稱。
  • methodName - 要在鏈碼中呼叫之方法的名稱。
  • arg - 呼叫方法的引數。
  • channelName - 要呼叫之鏈碼所在的通道。
傳回值:
  • Promise<any> - 傳回包含三個欄位的 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> - 傳回包含三個欄位的 JSON 物件:
    • isValid - true (如果呼叫有效)。
    • payload - 跨鏈碼呼叫傳回的輸出,作為 JSON 物件。
    • message - 跨鏈碼呼叫傳回的訊息,格式為 UTF-8。

自訂方法

下列自訂方法是從範例規格檔案產生。

executeQuery 顯示如何呼叫 SQL Rich Query。Blockchain App Builder 會根據規格檔案中指定的引數類型,自動新增對引數的驗證程式。


/**
*
*	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 方法。如果您使用 Blockchain App Builder 進行部署或升級,系統會自動呼叫 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;
}

如果您在此時想要初始化任何應用程式狀態,您可以使用此方法來執行此操作。