第6章HyperledgerComposer业务
网络实战——基础篇;
6.1易腐货物网络案例分析;
1)资产
资产是指在业务网络中具有一定价值、可被交易或修改状态的物品,通常为某个参与者所拥有。
在易腐货物网络中,资产包括如下内容:
·易腐货物(苹果、香蕉和咖啡);
·三方共同签订的交易合同。
;
2)参与者
加入业务网络的成员叫做参与者。在易腐货物网络中,将模拟易腐货物从生产到运输到最终成功出售所经过的流程,因此需要如下参与者:
·种植易腐货物的种植者;
·运输易腐货物的运输者;
·购置易腐货物的进口商。;
3)访问控制
在业务网络中,访问控制通常是不可或缺的。它能够控制哪些人能够对哪些资源进行哪种权限的访问,即隐私保护和权限控制。
在易腐货物网络中,暂时不需要进行访问控制,使用默认的开放规则即可。;
4)交易
区块链是一个分布式账本,账本上记录的便是交易。交易通常涉及资产的改变或转移,会影响到区块链账本的状态,类似于区块链中的“智能合约”。
在业务网络中,通过发起交易来执行对应的业务逻辑。
易腐货物网络将会产生如下交易:
(1)种植出易腐货物;
(2)种植者、进口商、运输者三方签订交易合同;
(3)货物送达;
(4)货物中途腐烂。
;
5)事件
若开发者希望区块链中产生交易或某资产发生改变时能够收到相应的通知提醒或执行相关后续操作,则可以使用事件机制。
事件采用的是发布/订阅方式,区别于发送/接收方式。所有订阅了事件的用户(应用程序)在该事件发生时都会收到相应的通知,以进行相应的处理。
易腐货物网络的事件是当货物腐烂时发出警报。
确认上述模型后,开始编写代码实现模型和交易。;
6.1.2代码实现
在第5章中,读者应已熟悉工程模板的生成、基本的CTO建模语法以及简单业务逻辑代码的编写。
代码编写包括CTO建模、业务逻辑、访问控制列表三个部分。??先,使用Yeoman生成工程目录结构,并新建lib文件夹和logic.js,工程目录结构如图6-1所示。;;
1.CTO建模
CTO建模就是编写.cto文件,将业务网络涉及的资源用面向对象语法来表示。
模板自动在cto文件开头生成了命名空间,代码如下:;
1)枚举
由于易腐货物具有相同的属性(如名称),因此无需把每种货物都定义一个资产,只需定义一个枚举来表示货物类别即可。
假设货物类别有苹果、香蕉和咖啡,则该货物类别的枚举代码如下:;
本例中的货物状态包括已创建、运输中、已送达和已腐烂,该货物状态的枚举代码如下:;
2)资产
对于拥有相同属性(如id)的资产或参与者,可以使用抽象类来节约代码量。抽象类无法被实例化,但它可被用作该类型的其他资产的超类型(super-type)。资产将拥有所指定的超类型所拥有的属性,并且能够根据定义追加新的属性。
资产抽象类定义代码如下:;
易腐货物定义代码如下:
注意:资产类“Goods”的超类型“BaseAsset”的抽象属性不会被其继承。;
由于易腐货物刚产生时还无法确定运输者和进口商,因此要为这两个属性添加optional(可选的)关键字,使得该属性接受空值,否则在创建实例时会报错。
交易合同定义代码如下:;
3)参与者
参与者抽象类定义代码如下:
该抽象类定义了业务网络参与者的通用属性,其他参与者只需继承该抽象类即可。;;
4)交易
交易中的属性和依赖对应于业务逻辑交易函数的参数。调用交易函数时,会传入一个交易实例,从交易实例中可获取到输入参数,因此,在定义交易模型时也要考虑交易函数的参数,类似编写面向对象编程语言中的接口。
定义交易模型的属性和依赖的三个原则如下:
·全面:保证参数满足业务需求;
·精准:避免无用的参数;
·易读:属性名称和类型对应,并适当添加注释。
接下来讲述易腐货物网络中的交易定义。
;
生产易腐货物交易结构体代码如下:;
签订合同交易结构体代码如下:;
货物送达交易结构体代码如下:
此处通过一个合同依赖即可获取到所有参与合同签订的参与者,因此无需显式定义它们,以便代码更加精简,避免属性冗余。在该阶段中,若交易双方确认货物运输行为已完成,则可对所引用合约进行相应的履约操作。;
货物腐烂结构体代码如下:;
5)事件
如何在货物腐烂时,向客户端发送一个通知呢?可以通过定义事件来实现。
货物腐烂事件代码如下:;
2.业务逻辑
HyperledgerComposer的业务逻辑代码写在li