What is a CorDapp?
CorDapps (Corda Distributed Applications) are distributed applications that run on the Corda platform. The goal of a CorDapp is to allow nodes to reach agreement on updates to the ledger. They achieve this goal by defining flows that Corda node owners can invoke over RPC:
CorDapp components
CorDapps take the form of a set of JAR files containing class definitions written in Java and/or Kotlin.
These class definitions will commonly include the following elements:
- Flows: Define a routine for the node to run, usually to update the ledger
(see Key Concepts - Flows). They subclass
FlowLogic
- States: Define the facts over which agreement is reached (see Key Concepts - States).
They implement the
ContractState
interface - Contracts, defining what constitutes a valid ledger update (see
Key Concepts - Contracts). They implement the
Contract
interface - Services, providing long-lived utilities within the node. They subclass
SingletonSerializationToken
- Serialization whitelists, restricting what types your node will receive off the wire. They implement the
SerializationWhitelist
interface
But the CorDapp JAR can also include other class definitions. These may include:
- APIs
- Utility classes
An example
Suppose a node owner wants their node to be able to trade bonds. They may choose to install a Bond Trading CorDapp with the following components:
A
BondState
, used to represent bonds as shared facts on the ledgerA
BondContract
, used to govern which ledger updates involvingBondState
states are validThree flows:
- An
IssueBondFlow
, allowing newBondState
states to be issued onto the ledger - A
TradeBondFlow
, allowing existingBondState
states to be bought and sold on the ledger - An
ExitBondFlow
, allowing existingBondState
states to be exited from the ledger
- An
After installing this CorDapp, the node owner will be able to use the flows defined by the CorDapp to agree ledger updates related to issuance, sale, purchase and exit of bonds.
Writing and building apps that run on both Corda Community Edition and Corda Enterprise
Corda and Corda Enterprise are moving towards an Open Core approach, which means in practice that the APIs and dependencies for CorDapps should all be open source, and all CorDapps (whether targeting Corda Community Edition or Corda Enterprise) can now be compiled against the Open Source Corda core library, as Corda Enterprise itself is compiled against the Corda Community Edition core library. To make this work in practice you should follow these steps:
- Ensure your CorDapp is designed per Structuring a CorDapp and annotated according to CorDapp separation. In particular, it is critical to separate the consensus-critical parts of your application (contracts, states and their dependencies) from the rest of the business logic (flows, APIs, etc). The former - the CorDapp kernel - is the Jar that will be attached to transactions creating/consuming your states and is the Jar that any node on the network verifying the transaction must execute.
- Compile this CorDapp kernel Jar once, and then depend on it from your workflows Jar. In terms of Corda depdendencies,this should only
depend on the
corda-core
package from the Corda Community Edition distribution.
- Your workflow Jar(s) should depend on the CorDapp kernel (contract, states and dependencies). Importantly, you can create different workflow
Jars for Corda and Corda Enterprise, because the workflows Jar is not consensus critical. For example, you may wish to add additional features
to your CorDapp for when it is run on Corda Enterprise (perhaps it uses advanced features of one of the supported enterprise databases or includes
advanced database migration scripts, or some other Enterprise-only feature).When building a CorDapp against Corda Enterprise, please note that the
corda-core
library still needs to come from the Corda Community Edition distribution, so you will have dependencies on Corda Enterprise and a matching open core distribution. Specifically, any CorDapp targeted to run on Corda Enterprise should have unit and integration tests using Corda Enterprise.
In summary, structure your app as kernel (contracts, states, dependencies) and workflow (the rest) and be sure to compile the kernel against Corda Community Edition. You can compile your workflow (Jars) against the distribution of Corda that they target.
Was this page helpful?
Thanks for your feedback!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.
We're sorry this page wasn't helpful. Let us know how we can make it better!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Create an issue
Create a new GitHub issue in this repository - submit technical feedback, draw attention to a potential documentation bug, or share ideas for improvement and general feedback.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.