鷹架式 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 方法。如果您從 Oracle Blockchain Platform 主控台進行部署或升級,則必須手動呼叫 init 方法。您可以使用協力廠商工具 (例如 Postman) 手動呼叫 init 方法。

export class TestTsProjectController extends OchainController {
    public async init(params: any) { 
        return;
}

您可以使用此方法來初始化目前的所有應用程式狀態。