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.ts
和 controller.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
:採用 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
「通透保存功能」或簡化的 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
(選擇性) - 用於儲存分類帳中資產以外的中繼資料。
- 傳回值:
- 範例:
@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
(選擇性) - 用於儲存分類帳中資產以外的中繼資料。
- 傳回值:
- 範例:
@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
類別繼承。
- 此方法會傳回介於
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
類別的靜態方法,由 {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 方法,請參閱 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[ ]
- 將根據其形成複合索引鍵的屬性。
- 傳回值:
-
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
- 您可以呼叫此方法來存取 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;
}
然後您可以使用此方法來初始化任何應用程式狀態。