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 來存取它們。
實行 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 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 下的主題。
控制器
主控制器類別會擴充 OchainController。只有一個主要控制器。
export class TSProjectController extends OchainController{
您可以建立不限數目的類別、函數或檔案,但只有在 main 控制器類別中定義的方法,可以從外部呼叫,其餘部份會隱藏起來。
自動產生的方法
如輸入規格檔案中所述,您可以指定要在規格檔案中產生的 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 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
- 使用者可以透過呼叫
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;
}
您目前可以使用此方法來初始化任何應用程式狀態。