鷹架式 TypeScript 鏈碼專案

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

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

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

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

模型

每個模型類別都會擴充 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)
此特性裝飾器會將基礎特性標示為可內嵌資產。這個方法會將 embeddable 類別視為參數。這個類別必須擴充 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

「通透保存功能」或簡化的 ORM 是擷取在相關資訊環境 (Ctx) 物件的 Model 類別中。如果您的模型呼叫下列任何 SDK 方法,請使用 this.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 Methods

SDK 方法

附註:

從版本 21.3.2 開始,存取 ORM 方法的方式已變更。執行 ochain --version 命令以判斷區塊鏈 App 產生器的版本。

在舊版中,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 之後,請在使用舊版區塊鏈 App 產生器建立的所有鏈碼專案中進行這項變更。如果您使用 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 詳細資訊。此方法會傳回承諾。
此方法會在內部呼叫 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 類別的靜態方法,由 {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 類別的靜態方法,由 {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 方法,請參閱 Tokenization Support Using Blockchain App Builder 下的主題。

控制器

main 控制器類別會擴充 OchainController 類別。只有一個主要控制器。

export class TSProjectController extends OchainController{

您可以建立不限數目的類別、函數或檔案,但只有在 main Controller 類別中定義的方法,可以從外部呼叫;其餘部份會隱藏。

自動產生的方法

輸入規格檔案中所述,您可以指定要在規格檔案中產生的 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 方法會在分類帳上執行 RTF/Couch DB 查詢。此方法僅支援 Oracle Blockchain Platform 上的遠端部署。這是在分類帳上執行 SQL 查詢的一般方法。
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
參數:
  • queryStr : string - 豐富的 SQL/Couch 資料庫查詢。
傳回值:
  • Promise<shim.Iterators.StateQueryIterator> - 傳回狀態查詢重複程式。您必須重複它。
queryWithPagination
此方法會對依頁面大小與書籤篩選的分類帳執行 RTF/Couch DB 查詢。此方法僅支援 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 的 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
您可以呼叫此方法來存取 shim stub。這可協助您撰寫自己的實作,直接使用資產。
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> - 傳回包含三個欄位的 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。區塊鏈 App 產生器會根據規格檔案中指定的引數類型,自動新增引數的驗證程式。


/**
*
*	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 方法。如果您使用區塊鏈 App 產生器來部署或升級,系統會自動呼叫 init 方法。如果您從 Oracle Blockchain Platform 主控台部署或升級,則必須手動呼叫 init 方法。您可以使用第三方工具 (例如 Postman) 來手動呼叫 init 方法。

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

然後您可以使用此方法來初始化任何應用程式狀態。