2017-06-05 12:37:23 +00:00
|
|
|
Writing a CorDapp
|
|
|
|
=================
|
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
When writing a CorDapp, you are writing a set of files in a JVM language that defines one or more of the following
|
|
|
|
Corda components:
|
2017-06-05 12:37:23 +00:00
|
|
|
|
|
|
|
* States (i.e. classes implementing ``ContractState``)
|
|
|
|
* Contracts (i.e. classes implementing ``Contract``)
|
|
|
|
* Flows (i.e. classes extending ``FlowLogic``)
|
|
|
|
* Web APIs
|
|
|
|
* Services
|
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
CorDapp structure
|
|
|
|
-----------------
|
|
|
|
Your CorDapp project's structure should be based on the structure of the
|
|
|
|
`Java Template CorDapp <https://github.com/corda/cordapp-template-java>`_ or the
|
|
|
|
`Kotlin Template CorDapp <https://github.com/corda/cordapp-template-kotlin>`_, depending on which language you intend
|
|
|
|
to use.
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
The ``src`` directory of the Template CorDapp, where we define our CorDapp's source-code, has the following structure:
|
2017-06-05 12:37:23 +00:00
|
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
|
|
|
|
src
|
|
|
|
├── main
|
|
|
|
│ ├── java
|
|
|
|
│ │ └── com
|
|
|
|
│ │ └── template
|
|
|
|
│ │ ├── Main.java
|
|
|
|
│ │ ├── api
|
|
|
|
│ │ │ └── TemplateApi.java
|
|
|
|
│ │ ├── client
|
|
|
|
│ │ │ └── TemplateClientRPC.java
|
|
|
|
│ │ ├── contract
|
|
|
|
│ │ │ └── TemplateContract.java
|
|
|
|
│ │ ├── flow
|
|
|
|
│ │ │ └── TemplateFlow.java
|
|
|
|
│ │ ├── plugin
|
|
|
|
│ │ │ └── TemplatePlugin.java
|
|
|
|
│ │ ├── service
|
|
|
|
│ │ │ └── TemplateService.java
|
|
|
|
│ │ └── state
|
|
|
|
│ │ └── TemplateState.java
|
|
|
|
│ └── resources
|
|
|
|
│ ├── META-INF
|
|
|
|
│ │ └── services
|
2017-06-20 14:29:35 +00:00
|
|
|
│ │ ├── net.corda.core.node.CordaPluginRegistry
|
|
|
|
│ │ └── net.corda.webserver.services.WebServerPluginRegistry
|
2017-06-05 12:37:23 +00:00
|
|
|
│ ├── certificates
|
|
|
|
│ │ ├── sslkeystore.jks
|
|
|
|
│ │ └── truststore.jks
|
|
|
|
│ └──templateWeb
|
|
|
|
│ ├── index.html
|
|
|
|
│ └── js
|
|
|
|
│ └── template-js.js
|
|
|
|
└── test
|
|
|
|
└── java
|
|
|
|
└── com
|
|
|
|
└── template
|
|
|
|
└── contract
|
|
|
|
└── TemplateTests.java
|
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
Defining plugins
|
|
|
|
----------------
|
|
|
|
Your CorDapp may need to define two types of plugins:
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
* ``CordaPluginRegistry`` subclasses, which define additional serializable classes and vault schemas
|
|
|
|
* ``WebServerPluginRegistry`` subclasses, which define the APIs and static web content served by your CorDapp
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
The fully-qualified class path of each ``CordaPluginRegistry`` subclass must then be added to the
|
|
|
|
``net.corda.core.node.CordaPluginRegistry`` file in the CorDapp's ``resources/META-INF/services`` folder. Meanwhile,
|
|
|
|
the fully-qualified class path of each ``WebServerPluginRegistry`` subclass must be added to the
|
|
|
|
``net.corda.webserver.services.WebServerPluginRegistry`` file, again in the CorDapp's ``resources/META-INF/services``
|
|
|
|
folder.
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
The ``CordaPluginRegistry`` class defines the following:
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
* ``customizeSerialization``, which can be overridden to provide a list of the classes to be whitelisted for object
|
|
|
|
serialisation, over and above those tagged with the ``@CordaSerializable`` annotation. See :doc:`serialization`
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
* ``requiredSchemas``, which can be overridden to return a set of the MappedSchemas to use for persistence and vault
|
|
|
|
queries
|
2017-06-05 12:37:23 +00:00
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
The ``WebServerPluginRegistry`` class defines the following:
|
|
|
|
|
|
|
|
* ``webApis``, which can be overridden to return a list of JAX-RS annotated REST access classes. These classes will be
|
|
|
|
constructed by the bundled web server and must have a single argument constructor taking a ``CordaRPCOps`` object.
|
|
|
|
This will allow the API to communicate with the node process via the RPC interface. These web APIs will not be
|
|
|
|
available if the bundled web server is not started
|
|
|
|
|
|
|
|
* ``staticServeDirs``, which can be overridden to map static web content to virtual paths and allow simple web demos to
|
|
|
|
be distributed within the CorDapp jars. This static content will not be available if the bundled web server is not
|
|
|
|
started
|
|
|
|
|
2017-08-15 08:14:15 +00:00
|
|
|
* ``customizeJSONSerialization``, which can be overridden to register custom JSON serializers if required by the REST api.
|
|
|
|
|
2017-07-25 08:26:35 +00:00
|
|
|
* The static web content itself should be placed inside the ``src/main/resources`` directory
|
2017-07-25 16:54:36 +00:00
|
|
|
|
|
|
|
To learn about how to use gradle to build your cordapp against Corda and generate an artifact please read
|
|
|
|
:doc:`cordapp-build-systems`.
|