Blockchain App Builder 从您的规范文件中获取输入,并生成一个功能齐全的脚手架链代码项目。该项目包含自动生成的类和函数、CRUD 方法、SDK 方法、参数自动验证、编集/非编集和透明持久性功能 (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
中的各种修饰符支持自动验证参数、编集/解编集参数、透明持久性功能 (ORM) 和调用富查询等功能。
模型
每个模型类都扩展 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
类的新实例时,Address
类的所有属性将由 @Validate()
装饰器自动验证。请注意,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
—这将调用超级账本架构 putState
方法
get
—这将调用超级账本架构 getState
方法
update
—这将调用超级账本架构 putState
方法
delete
—这将调用超级账本架构 deleteState
方法
history
—这将调用超级账本架构 getHistoryForKey
方法
getByRange
—这将调用超级账本架构 getStateByRange
方法
getByRangeWithPagination
—这将调用超级账本架构 getStateByRangeWithPagination
方法
有关更多信息,请参见:
SDK Methods 。
SDK 方法
注意:
从版本 21.3.2 开始,访问 ORM 方法的方式已更改。运行
ochain --version
命令以确定区块链应用程序构建器的版本。
在以前的发行版中,ORM 方法是从 OchainModel
类继承的。在版本 21.3.2 及更高版本中,方法在上下文 (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 后,请在使用早期版本的 Blockchain App Builder 创建的所有链代码项目中进行此更改。如果使用 sync
命令同步规范文件与源代码之间的更改,这些更改将自动带到控制器中,以便于使用。您仍需要手动解决任何冲突。
-
save
save
方法将调用方 asset
详细信息添加到分类账。
- 此方法在内部调用超级账本架构
putState
。所有编集/解编集都在内部处理。save
方法是 Model
类的一部分,您可以使用 Ctx
对象访问该类。
-
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- 参数:
extraMetadata : any
(可选)- 将资产之外的元数据保存到分类账中。
- 返回:
Promise<any>
- 在完成时返回 promise
- 示例:
@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。
- 此方法在内部调用超级账本架构
putState
。所有编集/编集都在内部处理。update
方法是 Model
类的一部分,您可以使用 Ctx
对象访问该类。
-
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- 参数:
extraMetadata : any
(可选)- 将资产之外的元数据保存到分类账中。
- 返回:
Promise<any>
- 在完成时返回 promise
- 示例:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
-
delete
- 这将从
id
提供的分类账中删除资产(如果存在)。此方法在内部调用超级账本架构 deleteState
方法。delete
方法是 Model
类的一部分,您可以使用 Ctx
对象访问该类。
-
Ctx.Model.delete(id: string): Promise <any>
- 参数:
id : string
—用于将数据保存到分类账中的键。
- 返回:
Promise <any>
- 在完成时返回 promise。
- 示例:
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
-
history
history
方法是 Model
类的一部分,您可以使用 Ctx
对象访问该类。此方法从分类账返回 id
提供的资产历史记录(如果存在)。
- 此方法在内部调用超级账本架构
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
之间的资产列表。此方法在内部调用超级账本架构 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
之间的资产列表。此方法在内部调用超级账本架构 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
(timestamp),则此方法将返回错误。
- 参数:
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 方法,请参阅使用区块链应用构建器支持令牌下的主题。
主管
主控制器类扩展了 OchainController
。只有一个主控制器。
export class TSProjectController extends OchainController{
您可以创建任意数量的类、函数或文件,但只有主控制器类中定义的方法可以从外部调用,其余的方法是隐藏的。
自动生成的方法
如 Input Specification File 中所述,您可以指定要在规范文件中生成的 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 [ ]>
- 在完成时返回 promise。必须将 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
方法将对分类帐运行富 SQL/Couch DB 查询。此方法仅适用于 Oracle Blockchain Platform 上的远程部署。这是对分类账执行 SQL 查询的一般方法。
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
- 参数:
queryStr : string
- 丰富的 SQL/Couch DB 查询。
- 返回:
Promise<shim.Iterators.StateQueryIterator>
- 返回状态查询迭代器。你必须对它进行迭代。
-
queryWithPagination
- 此方法对分类帐运行丰富的 SQL/Couch DB 查询,按页面大小和书签进行筛选。此方法仅适用于 Oracle Blockchain Platform 上的远程部署。这是对分类账执行 SQL 查询的一般方法。
-
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
- 参数:
query : string
- 丰富的 SQL/Couch DB 查询。
pageSize : number
- 查询的页大小。
bookmark : string
- 查询的书签。输出从此书签开始。
- 返回:
Promise<shim.Iterators.StateQueryIterator>
- 返回状态查询迭代器。你必须对它进行迭代。
-
generateCompositeKey
- 此方法基于
indexName
和参数中给定的属性生成并返回组合键。
this.generateCompositeKey(indexName: string, attributes:
string[]): string
- 参数:
indexName : string
- 用于将数据保存到分类账的关键字的对象类型。
attributes: string[ ]
- 将基于其形成组合键的属性。
- 返回:
-
getByCompositeKey
- 此方法返回在创建组合键时与属性参数中给定的键和列匹配的资产。
indexOfId
参数指示存根方法 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
—用于将数据保存到分类账中的键。
- 返回:
Timestamp
- 返回创建事务处理的时间戳。
-
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 [ ]
- 从 chaincode 调用返回字符串数组中的参数。
-
getStringArgs
- 从链代码调用请求中以字符串数组形式返回参数。
this.getStringArgs(): string[]
- 参数:
- 返回:
string [ ]
- 从 chaincode 调用返回字符串数组中的参数。
-
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 多信息查询。基于参数的验证器由 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
方法。如果您使用区块链应用程序构建器进行部署或升级,则会自动调用 init
方法。如果从 Oracle Blockchain Platform 控制台部署或升级,则必须手动调用 init
方法。您可以使用第三方工具(如 Postman)手动调用 init
方法。
export class TestTsProjectController extends OchainController {
public async init(params: any) {
return;
}
此时,可以使用此方法初始化任何应用程序状态。