Writing a CorDapp¶
Contents
Overview¶
CorDapps can be written in either Java, Kotlin, or a combination of the two. Each CorDapp component takes the form of a JVM class that subclasses or implements a Corda library type:
- Flows subclass
FlowLogic - States implement
ContractState - Contracts implement
Contract - Services subclass
SingletonSerializationToken - Serialisation whitelists implement
SerializationWhitelist
Web content and RPC clients¶
For testing purposes, CorDapps may also include:
- APIs and static web content: These are served by Corda’s built-in webserver. This webserver is not production-ready, and should be used for testing purposes only
- RPC clients: These are programs that automate the process of interacting with a node via RPC
In production, a production-ready webserver should be used, and these files should be moved into a different module or project so that they do not bloat the CorDapp at build time.
Structure¶
You should base the structure of your project on the Java or Kotlin templates:
The project should be split into two modules:
- A
cordapp-contracts-statesmodule containing classes such as contracts and states that will be sent across the wire as part of a flow - A
cordappmodule containing the remaining classes
Each module will be compiled into its own CorDapp. This minimises the size of the JAR that has to be sent across the wire when nodes are agreeing ledger updates.
Module one - cordapp-contracts-states¶
Here is the structure of the src directory for the cordapp-contracts-states module:
.
└── main
└── java
└── com
└── template
├── TemplateContract.java
└── TemplateState.java
The directory only contains two class definitions:
TemplateContractTemplateState
These are definitions for classes that we expect to have to send over the wire. They will be compiled into their own CorDapp.
Module two - cordapp¶
Here is the structure of the src directory for the cordapp module:
.
├── 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
The src directory is structured as follows:
maincontains the source of the CorDapptestcontains example unit tests, as well as a node driver for running the CorDapp from IntelliJintegrationTestcontains an example integration test
Within main, we have the following directories:
resources/META-INF/servicescontains registries of the CorDapp’s serialisation whitelists and web pluginsresources/certificatescontains dummy certificates for test purposesresources/templateWebcontains a dummy front-endjava(orkotlinin the Kotlin template), which includes the source-code for our CorDapp
The source-code for our CorDapp breaks down as follows:
TemplateFlow.java, which contains a dummyFlowLogicsubclassTemplateState.java, which contains a dummyContractStateimplementationTemplateContract.java, which contains a dummyContractimplementationTemplateSerializationWhitelist.java, which contains a dummySerializationWhitelistimplementation
In developing your CorDapp, you should start by modifying these classes to define the components of your CorDapp. A single CorDapp can define multiple flows, states, and contracts.
The template also includes a web API and RPC client:
TemplateApi.javaTemplateClient.javaTemplateWebPlugin.java
These are for testing purposes and would be removed in a production CorDapp.
Resources¶
In writing a CorDapp, you should consult the following resources:
- Getting Set Up to set up your development environment
- The Hello, World! tutorial to write your first CorDapp
- Building a CorDapp to build and run your CorDapp
- The API docs to read about the API available in developing CorDapps
- There is also a cheatsheet recapping the key types
- The Flow cookbook to see code examples of how to perform common flow tasks
- Sample CorDapps showing various parts of Corda’s functionality