首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Hyperledger Composer 基础,第 1 部分 建模和测试您的区块链网络-2

Hyperledger Composer 基础,第 1 部分 建模和测试您的区块链网络-2

Hyperledger Composer 建模语言在使用 Hyperledger Composer 测试并部署区块链业务网络之前,您需要为它构建一个模型。Hyperledger Composer                拥有完成此工作的自己的建模语言。
好了,又要学习另一种语言,对吧?幸运的是,CTO 建模语言很简单(而且很直观,如果您已经接触过面向对象的概念)。高度专注(用于建模业务网络的)少数几个关键字,所以没有太多东西要学。业务网络的模型位于一个文件中,该文件具有                .cto 文件扩展名,并包含以下元素的定义:
  • 命名空间
  • 资源
  • 从其他命名空间导入(根据需要)
如果您的模型非常大,可以在必要时拥有多个 .cto 模型文件。每个 .cto                模型文件都必须包含一个命名空间和至少一个资源定义。
命名空间一个命名空间创建一个边界,名称需要在这个边界范围内保持唯一。每个 .cto 模型文件都需要一个命名空间,这意味着                .cto 模型文件中的每个名称都必须是唯一的。
即使没有实现这些命名空间概念,但您已经熟悉了它们。文件系统使用目录作为命名空间,所以同一个目录中的两个文件不能同名。但是,不同目录中的两个文件允许同名,因为它们位于不同的命名空间中。
总结一下:一个 CTO 模型文件(命名空间边界)中的两个资源不能同名。
资源资源是以下类型之一:
  • 资产 - 一个业务网络资产
  • 参与者 - 一个业务网络参与者
  • 交易 - 业务逻辑
  • 事件 - 系统中发生的重要事情的通知
  • 枚举类型 - 一组指定的值
  • 概念 - 您想建模的不属于其他任何类型的任何对象
每种资源类型对应于与它同名的模型类型(例如 asset 用于建模资产,participant                用于建模参与者,等等)。
资源具有以下属性:
  • 命名空间,资源是其中定义的
  • 一个名称,必须在命名空间内保持唯一
    • 如果资源是一个 asset 或 participant,它必须有一个通过                            identified by 后跟字段名称来表示的标识符字段。
  • (可选)它的父类型(超类型),如果适用,由 extends 后跟父类型的名称来表示
  • (可选)abstract 关键字,如果您不想实例化某种资源,而是将它用作该类型的其他资源的超类型
在 Perishable Goods 网络中,将一个 Shipment 资产建模为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
  * A business network for shipping perishable goods
  * The cargo is temperature controlled and contracts
  * can be negociated based on the temperature
  * readings received for the cargo
  */
namespace org.acme.shipping.perishable
.
.
/**
* A shipment being tracked as an asset on the ledger
*/
asset Shipment identified by shipmentId {
  o String shipmentId
  o ProductType type
  o ShipmentStatus status
  o Long unitCount
  o TemperatureReading[] temperatureReadings optional
  --> Contract contract
}




让我们分析一下上面的示例,我会指出一些需要注意的地方。
命名空间是 org.acme.shipping.perishable。
asset 关键字指出 Shipment                是一种资产。属性(用小写字母“o”表示)shipmentId 是 String                类型,而且唯一地标识了一个 Shipment(用 identified by 表示)。
它的每个属性都有一个类型,这可以是基础类型(比如 String)、枚举类型(比如                ProductType)或交易(比如一个 TemperatureReading 数组)。
对 Contract 的引用(用 -->                表示)被称为一种关系,而且是单向的(不是双向的)。
枚举类型当某个特定属性可以拥有的一组值是已知值时,应该将该属性建模为枚举类型。这样约束值就会变得更容易,从而让验证变得更简单。
枚举类型的声明方式如下:
/**
  * The type of perishable product being shipped
  */
enum ProductType {
   o BANANAS
   o APPLES
   o PEARS
   o PEACHES
   o COFFEE
}




概念如果某个实体存在于您的业务模型中,但它不是资产、参与者、交易或事件,那么可以将它建模为概念
/**
* A concept for a simple street address
*/
concept Address {
  o String city optional
  o String country
  o String street optional
  o String zip optional
}




Address 是业务模型中的一个重要概念,它无法准确地划分到其他类别中,因此将它建模为一个概念。
返回列表