Corda流程的任何一侧都可以存在于单独的Cordapps中吗?

Bri*_*ice 1 corda

如果节点希望在流的一侧执行自己的特定业务逻辑,那么如何实现呢?

例如,如果公司要调用内部公司api来验证传入的交易数据,可以在流程中执行此操作吗?如果是这样,是否需要通用编写流程,以便所有使用相同Cordapp(和流程)的公司都调用其自己的内部api。也许api网址存储在本地配置文件中。

或者是让每个公司拥有包含特定于它们的流的单独Cordapp的另一种选择,它们可以与特定于其他公司的其他Cordapp中的流进行通信。这似乎很快就会变得非常复杂。

Rog*_*lis 5

当然。我在上面写了很多东西,我可以贴在这里!

构建CorDapps

CorDapps可以分为共享元素和私有元素:

共享的CorDapp元素

通常,CorDapp的共享元素包括:

  • 组成状态对象或用作有效负载以在流之间发送数据的数据结构和自定义类型
  • 状态和合同定义必须对所有可能需要验证包含一个或多个CorDapp状态对象的事务的节点可用
  • 抽象流定义用于定义流的通用表示形式,同时隐藏其实际实现(可以是私有的)。这是因为InitiatedBy流注释需要类路径上对应的InitatingFlow的FlowLogic子类型,因此可以注册流启动器
  • 使用节点服务的共享实用程序功能通常从流中使用,并带有ServiceHub参数-这样做比重新编写另一个流或重复相同方法使现有流变得混乱更有意义。
  • 在需要简单的工作流程且不需要任何自定义且通常由运行CorDapp的所有各方执行的情况下,通常需要共享流

通常建议将共享的CorDapp JAR保持尽可能的小,这是因为包含状态和合同定义的JAR会通过网络进行传输,并且包含包含JAR中定义的类型的状态的事务。事务的下游验证者可能需要验证包含未与其进行交易的状态的事务,因此它们不需要类路径上的流。因此,将状态和合同定义(以及任何依赖项)分别打包到其他所有内容中是有意义的。

私人CorDapp元素

corDapp的私有元素通常包括:

  • 定制流程实施
  • Corda服务
  • 以上要求的任何类型定义

如上所述,CorDapp开发人员可以共享其流程的抽象表示,并将实现保持私有状态。流框架允许各方实现自己的流,前提是它们遵循公共接口,即InitiatingFlowInitiatedBy流都在流的预期点发送和接收相同的类型。

只要流程能够做到这一点,其余的实现都可以自定义。例如,自定义的私有实现可能会扩展到内部系统或使用专有类型,因此,不应将它们与CorDapp的共享元素打包在一起。

流版本控制

除了平台的发展之外,在平台之上运行的流程也可以发展。您要从其启动其他流的任何流都必须使用注释进行注释,该@InitiatingFlow注释定义为:

annotation class InitiatingFlow(val version: Int = 1)
Run Code Online (Sandbox Code Playgroud)

注意,可选的version属性(默认为1)用于指定流的版本。目前,此整数值仅用于指导开发人员,每当发布某个版本的更改与先前版本不向后兼容时,都应增加此整数值。非向后兼容更改是更改流接口的更改。

当前,处理流版本控制留给了CorDapp开发人员。但是,将来平台将执行规定的规则。

一组流的接口是什么?

流接口定义了InitiatingFlow和InitiatedBy流之间的发送和接收顺序以及发送和接收的类型。最好用序列图说明:

在此处输入图片说明

在上图中,InitiatingFlow:

  1. 发送一个整数
  2. 接收一个字符串
  3. 发送一个字符串
  4. 收到一个CustomType

InitiatedBy流执行相反的操作:

  1. 接收一个整数
  2. 发送一个字符串
  3. 接收一个字符串
  4. 发送一个CustomType

如果IntiatingFlowInitiatedBy流都符合接口定义的顺序,则其余流可以以任何方式实现,并且可以包括不与其他方共享的专有业务逻辑。确实,这是编写流程的预期方式。

有关实际如何执行此操作的示例,请在此处查看:https : //github.com/sollecitom/corda-foreign-exchange-example/blob/master/buyer-api/src/main/kotlin/net /corda/examples/fx/buyer/BuyCurrencyFlowDefinitions.kt

这是由Corda开发人员之一编写的,并且在上面的文件中,有一个抽象的流程定义,该定义具有仅买方知道的私有实现。