脚手架 TypeScript 链代码项目

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.tscontroller.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:接受 CONCATHASH 的值。如果选择了 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 方案对象。在以下示例中,supplierIdrawMaterialSupply 的类型分别为 stringnumber,因此将类似类型和正确顺序的 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 类继承。
这将返回介于 startIdendId 之间的资产列表。此方法在内部调用超级账本架构 getStateByRange 方法。
如果未提供 modelName 参数,则方法返回 Promise<Object [ ] >。如果提供了 modelName 参数,则该方法将处理强制转换为调用者 Model 类型。在以下示例中,结果数组的类型为 Supplier。如果从分类账返回的资产不是 Model 类型,则该资产将不包括在列表中。此检查由 Model 类中的只读 assetType 属性完成。
要返回范围 startIdendId 之间的所有资产,请使用通用控制器方法 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 类继承。
这将返回介于 startIdendId 之间的资产列表。此方法在内部调用超级账本架构 getStateByRangeWithPagination 方法。
如果未提供 modelName 参数,则方法返回 Promise<Object [ ] >。如果提供了 modelName 参数,则该方法将处理强制转换为调用者 Model 类型。在以下示例中,结果数组的类型为 Supplier。如果从分类账返回的资产不是 Model 类型,则该资产将不包括在列表中。此检查由 Model 类中的只读 assetType 属性完成。
要返回 startIdendId 范围之间的所有资产(按页大小和书签进行过滤),请使用通用控制器方法 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[ ] - 将基于其形成组合键的属性。
返回:
  • string - 返回组合键。
getByCompositeKey
此方法返回在创建组合键时与属性参数中给定的键和列匹配的资产。indexOfId 参数指示存根方法 SplitCompositeKey 数组中返回的键的索引。在内部,此方法调用超级账本架构 (Hyperledger Fabric) 的 getStateByPartialCompositeKeysplitCompositeKeygetState
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
参数:
返回:
  • string - 返回通道 ID。
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
参数:
返回:
  • string - 返回调用身份的 MSP ID。
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;
}

此时,可以使用此方法初始化任何应用程序状态。