Hyperledger Composer 基础,第 1 部分 建模和测试您的区块链网络-2
- UID
- 1066743
|
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 是业务模型中的一个重要概念,它无法准确地划分到其他类别中,因此将它建模为一个概念。 |
|
|
|
|
|