编写一个 CorDapp

概要

CorDapp 可以使用 Java 或者 Kotlin 语言来编写,或者你可以两个一起用。每一个 CorDapp 组件使用一个 JVM 类的形式来作为 Corda library 类型的子类或者是实现了一个 Corda library 类型:

  • Flows 作为 FlowLogic 的子类
  • States 实现了 ContractState
  • Contracts 实现了 Contract
  • Services 作为 SingletonSerializationToken 的子类
  • 序列化白名单 Serialisation whitelist 实现了 SerializationWhitelist

Web 内容 和 RPC 客户端

为了测试的目的,CorDapp 也可能包含:

  • APIs 和静态的 web 内容:这个作为 Corda 内置的 webserver 被提供。这个 webserver 还不适合生产环境,仅仅适用于测试的目的
  • RPC 客户端:这些是能够自动执行通过 RPC 来跟节点进行互动的程序

对于生产环境,应该使用一个适用于生产环境的 webserver,并且这些文件应该被移动到一个不同的模块或者项目,这样他们才不会在创建 CorDapp 的时候不会让 CorDapp 变得很大很臃肿。

结构

你应该基于 Java 或者 Kotlin 的模板结构来创建你的项目:

项目应该被划分为两个模块:

  • 一个 cordapp-contracts-states 模块包含了将会网络中传播的作为 flow 中的一部分的 contracts 和 states
  • 一个 cordapp 模块包含了剩余的类文件

每一个模块会被编译成他们自己的 CorDapp。这会使 JAR 文件具有最小的size,为了更好地在节点都同意账本更新的时候在网络中进行传播。

第一部分 – cordapp-contract-states

下边是 cordapp-contracts-states 模块的 src 路径结构:

.
└── main
    └── java
        └── com
            └── template
                ├── TemplateContract.java
                └── TemplateState.java

这个路径仅仅包含两个类定义:

  • TemplateContract
  • TemplateState

这些是我们希望在网络中进行传输的内容的类定义。他们会被编译成为自己的 CorDapp。

第二部分 – cordapp

下边是 cordapp 模块的 src 路径结构:

.
├── main
│   ├── java
│   │   └── com
│   │       └── template
│   │           ├── TemplateApi.java
│   │           ├── TemplateClient.java
│   │           ├── TemplateFlow.java
│   │           ├── TemplateSerializationWhitelist.java
│   │           └── TemplateWebPlugin.java
│   └── resources
│       ├── META-INF
│       │   └── services
│       │       ├── net.corda.core.serialization.SerializationWhitelist
│       │       └── net.corda.webserver.services.WebServerPluginRegistry
│       ├── certificates
│       └── templateWeb
├── test
│   └── java
│       └── com
│           └── template
│               ├── ContractTests.java
│               ├── FlowTests.java
│               └── NodeDriver.java
└── integrationTest
    └── java
        └── com
            └── template
                └── DriverBasedTest.java

src 路径结构包括:

  • main 包含了 CorDapp 源代码
  • test 包含了单元测试代码,还包括一个能够在 IntelliJ 中运行 CorDapp 的节点 driver
  • integrationTest 包含了 integration test 的例子

main 中,我们还有一下的路径结构:

  • resources/META-INF/services 包含了CorDapp 的序列化白名单 serialisation whitelist 和 web plugins 的注册信息
  • resources/certificates 包含了用于测试目的的虚拟证书
  • resources/templateWeb 包含了一个虚拟的 front-end 前端页面
  • java (或者 kotlin) 包含了我们的 CorDapp 的源代码

CorDapp 的源代码还可以被拆解成下边的几部分:

  • TemplateFlow.java 包含了模拟的 FlowLogic 子类
  • TemplateState.java 包含了模拟的 ContractState 实现
  • TemplateContract.java 包含了模拟的 Contract 实现
  • TemplateSerializationWhitelist.java 包含了模拟的 SerializationWhitelist 实现

在开发 CorDapp 的时候,你应该从修改这些类开始来定义你的 CorDapp 的组件。一个单独的 CorDapp 可以定义多个 flows,states 和 contracts。

这个模板还包含了一个 web API 和 RPC 客户端:

  • TemplateApi.java
  • TemplateClient.java
  • TemplateWebPlugin.java

这些都是为了测试为目的的,不应该被用在生产环境。

发表评论

电子邮件地址不会被公开。 必填项已用*标注