脚手架 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 方法。如果您从 Hyperledger Fabric v1.4.7 平台上的 Oracle Blockchain Platform 控制台部署或升级,则也会自动调用 init 方法。如果您从 Hyperledger Fabric v2.x 平台上的 Oracle Blockchain Platform 控制台部署或升级,则必须手动调用 init 方法。您可以使用第三方工具(如 Postman)手动调用 init 方法。

export class TestTsProjectController extends OchainController {
    public async init(params: any) { 
        return;
}

如果要在此时初始化任何应用程序状态,可以使用此方法来执行此操作。