这篇文章给大家分享的是有关Hyperledger composer建模语言怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
Hyperledger Composer包含一种面向对象的建模语言,用于定义业务网络定义的领域模型
Hyperledger Composer CTO文件由以下元素组成:
1.单个命名空间。文件中的所有资源声明都隐含在这个名称空间中。
2.一组资源定义,包含资产,交易,参与者和事件,枚举类型和Concepts。
3.从其他名称空间导入资源的可选导入声明。
2.1 组织名称空间是在您的model(.cto
)文件的名称空间行中定义的,并且创建的所有资源隐含地都是该名称空间的一部分。
2.2 除了定义资产,参与者,事件和事务的新类别外,还有一个系统命名空间,其中包含资产,事件,参与者和事务的基本定义。这些基本定义是由所有资产,事件,参与者和事务隐式扩展的抽象类型,在系统名称空间定义中,资产和参与者没有必需的值。事件和事务由eventId或transactionId和时间戳定义。系统名称空间还包括注册表的定义,历史记录记录,身份和一些系统事务。
2.3 如果定义了包括eventId,transactionId或时间戳的事件或事务,则必须删除eventId,transactionId或timestamp属性。
Hyperledger Composer中的资源包括:资产,参与者,交易和事件,枚举类型,资产,参与者和交易是类定义。资产,参与者和交易的概念可以被认为是类别类型的不同刻板印象。Hyperledger Composer中的类称为资源定义,因此资产实例具有资产定义。
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 }
枚举类型用于指定可能具有1或N个可能值的类型。下面的示例定义了ProductType枚举,它可能具有值DAIRY
或BEEF
或VEGETABLES
。
/** * An enumerated type */ enum ProductType { o DAIRY o BEEF o VEGETABLES }
当创建另一个资源时,例如参与者,可以根据枚举类型定义该资源的属性
participant Farmer identified by farmerId { o String farmerId o ProductType primaryProduct }
例如,下面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.1 字符串:一个UTF8编码的字符串。
4.2 Double:双精度64位数值
4.3 整数:一个32位有符号整数
4.4 长:64位有符号整数
4.5 DateTime:兼容ISO-8601的时间实例,具有可选的时区和UTZ偏移量
4.6 布尔值:一个布尔值,无论是true还是false。
Composer中的所有类型都可以使用[]符号声明为数组
Integer[] integerArray
整数数组存储在名为'integerArray'的字段中。而是与动物类型的关系数组,存储在名为“传入”的字段中。是与动物类型的关系数组,存储在名为“传入”的字段中。
--> Animal[] incoming
Composer语言中的关系是由以下组成的元组:
被引用类型的名称空间
被引用类型的类型名称
被引用实例的标识符
因此,关系可以是:org.example.Vehicle#123456
这与org.example命名空间中标识为123456的Vehicle类型有关系。
关系是单向的,删除不会级联,即。消除这种关系对所指向的事物没有影响。删除被指向的东西不会使关系失效。
必须解决关系才能检索被引用对象的实例。如果对象不再存在或关系中的信息无效,则解析行为可能会导致为空。
字符串字段可能包含一个可选的正则表达式,用于验证字段的内容。仔细使用字段验证器可以使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 }
将该import
关键字与完全限定的类型名称一起使用,从另一个名称空间导入一个类型。或者,使用.*
符号从其他名称空间导入所有类型。
import org.example.MyAsset import org.example2.
资源的资源和属性可能会附加装饰器。装饰器用于使用元数据注释模型。下面的示例将foo
装饰器添加到买方参与者,“arg1”和2作为参数传递给装饰器。
同样,装饰器可以附加到属性,关系和枚举值。
@foo("arg1", 2) participant Buyer extends Person { }
资源定义和属性可以用0或更多装饰来装饰。请注意,每个元素类型只允许一个装饰器的单个实例。也就是说,@bar
装饰者在同一个元素上列出两次是无效的。
装饰者可以有任意的参数列表(0或更多项)。参数值必须是字符串,数字或布尔值。
装饰器可以通过ModelManager introspect API在运行时访问。这允许外部工具和实用程序使用Composer建模语言(Composer Modeling Language,CTO)文件格式来描述核心模型,并使用足够的元数据为自己的目的进行装饰。
下面的例子检索附加到类声明的myField属性的foo装饰器的第三个参数:
const val = myField.getDecorator('foo').getArguments()[2];
感谢各位的阅读!关于“Hyperledger composer建模语言怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。