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;
}
您可以使用此方法來初始化目前的所有應用程式狀態。