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.ts 和 controller.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:採用 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 綱要作為參數。
- 參數的順序必須與方法中引數的順序完全相同。
- 在下列範例中,
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 綱要物件。在下列範例中,
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
在 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 (選擇性) - 將資產以外的中繼資料儲存至分類帳。
- 傳回值:
- 範例:
@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 (選擇性) - 將資產以外的中繼資料儲存至分類帳。
- 傳回值:
- 範例:
@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 類別繼承。
- 這會傳回介於
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 方法是 OchainModel 類別的 static 方法,由 {chaincodeName}.model.ts 的具體 Model 類別繼承。
- 這會傳回介於
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 方法,請參閱使用區塊鏈 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[ ] - 根據要形成複合索引鍵的屬性。
- 傳回值:
-
getByCompositeKey
- 此方法會傳回在建立複合索引鍵時,符合索引鍵與屬性參數中指定之資料欄的資產。
indexOfId 參數代表 stub 方法 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 - 用來將資料儲存至分類帳的索引鍵。
- 傳回值:
-
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
- 參數:
- 傳回值:
-
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;
}
您可以使用此方法來初始化目前的所有應用程式狀態。