温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hyperledger composer建模语言怎么用

发布时间:2021-12-06 14:56:20 来源:亿速云 阅读:172 作者:小新 栏目:互联网科技

这篇文章给大家分享的是有关Hyperledger composer建模语言怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、概念介绍

    Hyperledger Composer包含一种面向对象的建模语言,用于定义业务网络定义的领域模型

    Hyperledger Composer CTO文件由以下元素组成:

    1.单个命名空间。文件中的所有资源声明都隐含在这个名称空间中。

    2.一组资源定义,包含资产,交易,参与者和事件,枚举类型和Concepts。

    3.从其他名称空间导入资源的可选导入声明。

2、组织和Hyperledger Composer系统命名空间

    2.1 组织名称空间是在您的model(.cto)文件的名称空间行中定义的,并且创建的所有资源隐含地都是该名称空间的一部分。

    2.2 除了定义资产,参与者,事件和事务的新类别外,还有一个系统命名空间,其中包含资产,事件,参与者和事务的基本定义。这些基本定义是由所有资产,事件,参与者和事务隐式扩展的抽象类型,在系统名称空间定义中,资产和参与者没有必需的值。事件和事务由eventId或transactionId和时间戳定义。系统名称空间还包括注册表的定义,历史记录记录,身份和一些系统事务。

    2.3 如果定义了包括eventId,transactionId或时间戳的事件或事务,则必须删除eventId,transactionId或timestamp属性。

3、资源声明

    3.1 介绍

    Hyperledger Composer中的资源包括:资产,参与者,交易和事件,枚举类型,资产,参与者和交易是类定义。资产,参与者和交易的概念可以被认为是类别类型的不同刻板印象。Hyperledger Composer中的类称为资源定义,因此资产实例具有资产定义。

    3.2 资源定义具有以下属性:

        3.2.1 由其父文件的名称空间定义的名称空间。.cto文件的名称空间隐式应用于其中创建的所有资源。

        3.2.2 例如Vehicle,名称和标识字段,例如vin。如果资源是资产或参与者,则名称后跟识别字段,如果资源是事件或交易,则自动设置标识字段。在这个例子中,资产被命名Vehicle并且识别字段是vin

/**
 * A vehicle asset.
 */
asset Vehicle identified by vin {
  o String vin
}

        3.2.3 资源定义扩展的可选超类型。该资源将采用超类型所需的所有属性和字段,并从其自己的定义中添加任何其他属性或字段。

/**
 * A car asset. A car is related to a list of parts
 */
asset Car extends Vehicle {
  o String model
  --> Part[] Parts
}

        3.2.4 一个可选的“抽象”声明,用于指示无法创建此类型。抽象资源可以用作其他类的扩展基础。抽象类的扩展不会继承抽象状态。例如,Vehicle上面定义的资产不应该创建,因为应定义更多特定的资产类来扩展它。

/**
 * An abstract Vehicle asset.
 */
abstract asset Vehicle identified by vin {
  o String vin
}

        3.2.5 一组命名的属性。这些属性必须命名,并且定义了原始数据类型。属性及其数据由每个资源拥有,例如,Car资产具有vin一个model属性和一个属性,它们都是字符串。

        3.2.6 与其他Composer类型的一组关系,这些类型不属于资源,但可以从资源引用。关系是单向的。

/**
 * A Field asset. A Field is related to a list of animals
 */
asset Field identified by fieldId {
  o String fieldId
  o String name
  --> Animal[] animals
}
    3.3 枚举类型的声明 

    枚举类型用于指定可能具有1或N个可能值的类型。下面的示例定义了ProductType枚举,它可能具有值DAIRYBEEFVEGETABLES。    

/**
 * An enumerated type
 */
enum ProductType {
  o DAIRY
  o BEEF
  o VEGETABLES
}

    当创建另一个资源时,例如参与者,可以根据枚举类型定义该资源的属性

participant Farmer identified by farmerId {
    o String farmerId
    o ProductType primaryProduct
}
    3.4 概念是不属于资产,参与者或交易的抽象类。它们通常由资产,参与者或交易包含。

    例如,下面Address定义一个抽象概念,然后专门化成一个UnitedStatesAddress。请注意,概念没有identified by字段,因为它们不能直接存储在注册表中或在关系中引用。

abstract concept Address {
  o String street
  o String city default ="Winchester"
  o String country default = "UK"
  o Integer[] counts optional
}

concept UnitedStatesAddress extends Address {
  o String zipcode
}

例如,可以使用这个概念

participant Farmer identified by farmerId {
    o String farmerId
    o UnitedStatesAddress address
    o ProductType primaryProduct
}

4、原始类型

    4.1 字符串:一个UTF8编码的字符串。

    4.2 Double:双精度64位数值

    4.3 整数:一个32位有符号整数

    4.4 长:64位有符号整数

    4.5 DateTime:兼容ISO-8601的时间实例,具有可选的时区和UTZ偏移量

    4.6 布尔值:一个布尔值,无论是true还是false。

5、数组

    Composer中的所有类型都可以使用[]符号声明为数组

Integer[] integerArray

    整数数组存储在名为'integerArray'的字段中。而是与动物类型的关系数组,存储在名为“传入”的字段中。是与动物类型的关系数组,存储在名为“传入”的字段中。

--> Animal[] incoming

6、关系

Composer语言中的关系是由以下组成的元组:

  1. 被引用类型的名称空间

  2. 被引用类型的类型名称

  3. 被引用实例的标识符

因此,关系可以是:org.example.Vehicle#123456

这与org.example命名空间中标识为123456的Vehicle类型有关系。

关系是单向的,删除不会级联,即。消除这种关系对所指向的事物没有影响。删除被指向的东西不会使关系失效。

必须解决关系才能检索被引用对象的实例。如果对象不再存在或关系中的信息无效,则解析行为可能会导致为空。

7、字段验证程序

    字符串字段可能包含一个可选的正则表达式,用于验证字段的内容。仔细使用字段验证器可以使Composer执行丰富的数据验证,从而减少错误并降低样板代码。

下面的例子声明Farmer参与者包含一个postcode必须符合英国邮政有效邮政编码正则表达式的字段。

participant Farmer extends Participant {
    o String firstName default="Old"
    o String lastName default="McDonald"
    o String address1
    o String address2
    o String county
    o String postcode regex=/(GIR 0AA)|((([A-Z-[QVf]][0-9][0-9]?)|(([A-Z-[QVf]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVf]][0-9][A-HJKPSTUW])|([A-Z-[QVf]][A-Z-[IJZ]][0-9][ABEHMNPRVWfY])))) [0-9][A-Z-[CIKMOV]]{2})/
}

Double,Long或Integer字段可以包含一个可选的范围表达式,用于验证字段的内容。

下面的示例声明该Vehicle资产具有一个Integer字段year,该字段默认为2016并且必须是1990或更高。如果不需要检查,则范围表达式可以省略下限或上限。

asset Vehicle extends Base {
  // An asset contains Fields, each of which can have an optional default value
  o String model default="F150"
  o String make default="FORD"
  o String reg default="ABC123"
  // A numeric field can have a range validation expression
  o Integer year default=2016 range=[1990,] optional // model year must be 1990 or higher
  o Integer[] integerArray
  o State state
  o Double value
  o String colour
  o String V5cID regex=/^[A-z][A-z][0-9]{7}/
  o String LeaseContractID
  o Boolean scrapped default=false
  o DateTime lastUpdate optional
  --> Participant owner //relationship to a Participant, with the field named 'owner'.
  --> Participant[] previousOwners optional // Nary relationship
  o Customer customer
}

8、导入

    将该import关键字与完全限定的类型名称一起使用,从另一个名称空间导入一个类型。或者,使用.*符号从其他名称空间导入所有类型。

import org.example.MyAsset
import org.example2.

9、装饰

    9.1 装饰

    资源的资源和属性可能会附加装饰器。装饰器用于使用元数据注释模型。下面的示例将foo装饰器添加到买方参与者,“arg1”和2作为参数传递给装饰器。

同样,装饰器可以附加到属性,关系和枚举值。

@foo("arg1", 2)
participant Buyer extends Person {
}

资源定义和属性可以用0或更多装饰来装饰。请注意,每个元素类型只允许一个装饰器的单个实例。也就是说,@bar装饰者在同一个元素上列出两次是无效的。

    9.2 装饰者参数

    装饰者可以有任意的参数列表(0或更多项)。参数值必须是字符串,数字或布尔值。

    9.3 装饰者API

    装饰器可以通过ModelManager introspect API在运行时访问。这允许外部工具和实用程序使用Composer建模语言(Composer Modeling Language,CTO)文件格式来描述核心模型,并使用足够的元数据为自己的目的进行装饰。

下面的例子检索附加到类声明的myField属性的foo装饰器的第三个参数:

const val = myField.getDecorator('foo').getArguments()[2];

感谢各位的阅读!关于“Hyperledger composer建模语言怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI