Sure. 我写了很多关于这个的东西,我可以在这里粘贴!
结构化CorDapps
CorDapps可以分为共享和私有元素:
共享CorDapp元素
通常,CorDapp的共享元素将包括:
- 数据结构和自定义类型,这些类型被组合成状态对象或用作有效载荷在流之间发送数据
- 状态和合同定义必须对所有可能需要验证包含一个或多个CorDapp状态对象的交易的节点可用
- 抽象流定义用于定义流的公共表示,同时隐藏它的实际实现(这可以是私有的)。这是因为InitiatedBy流注释需要相应InitatingFlow的FlowLogic子类型在类路径上,因此可以注册流启动器
- 通常从流中使用节点服务的共享实用程序函数需要ServiceHub参数 - 这通常比编写另一个流或在现有流中重复相同方法更有意义
- 共享流通常在需要简单工作流且不需要任何定制并将由运行CorDapp的所有方执行的情况下使用
通常建议将共享的CorDapp JAR尽可能保持小型化,原因是包含状态和合约定义的JAR会随着包含该类型状态的交易在网络中传播。下游交易验证者可能需要验证包含他们不进行交易的状态的交易,因此他们不需要在其类路径上拥有流程。因此,将状态和合约定义(以及任何依赖项)与其他内容分开打包是有意义的。
私有CorDapp元素
corDapp的私有元素通常包括:
- 定制流程实现
- Corda服务
- 为上述内容所需的任何类型定义
如上所述,CorDapp开发人员可以共享其流程的抽象表示,并保持实现私有化。流程框架允许各方实现自己的流程,只要它们符合共同接口,即InitiatingFlow和InitiatedBy流程在流程中的预期点发送和接收相同类型的内容。
只要流程这样做,其余的实现就可以定制。例如,自定义的私有实现可能会访问内部系统或使用专有类型,因此不应与CorDapp的共享元素打包在一起。
流版本控制
除了平台的演进,运行在平台上的流程也可以发展。任何想要启动其他流程的流必须用
@InitiatingFlow
注释进行标注,该注释定义如下:
annotation class InitiatingFlow(val version: Int = 1)
注意,可选的版本属性默认为1,用于指定流程的版本。这个整数值目前仅存在于指导开发人员,应在具有与先前版本不兼容的更改的流程发布时递增。非向后兼容的更改是指更改流程的接口的更改。
目前,处理流程版本控制由CorDapp开发人员完成。然而,将来平台将实施规定的规则。
流程集的接口是什么?
流程接口定义了InitiatingFlow和InitiatedBy flow之间发送和接收的顺序以及发送和接收的类型。最好用一个序列图来说明。
在上图中,InitiatingFlow:
- 发送Int
- 接收String
- 发送String
- 接收CustomType
InitiatedBy流程则相反:
- 接收Int
- 发送String
- 接收String
- 发送CustomType
只要IntiatingFlow和InitiatedBy流程符合接口定义的顺序,其余流程可以以任何方式实现,并且可以包括不与其他方共享的专有业务逻辑。实际上,这是编写流程的预期方式。
举个例子,实际上如何去做,请看这里:https://github.com/sollecitom/corda-foreign-exchange-example/blob/master/buyer-api/src/main/kotlin/net/corda/examples/fx/buyer/BuyCurrencyFlowDefinitions.kt
这篇文章是由Corda开发人员撰写的,在上面的文件中,有一个抽象流程定义,它有一个仅买方知道的私有实现。