-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Core-15548 C5 negotiation sample app (#19)
* Corda 5 Negotiation app * Corda 5 Negotiation app * Added app diagrams, Refactored class names, added comments * Added app diagrams, Refactored class names, added comments * Added app diagrams, Refactored class names, added comments * - Refactored and reformatted classes - reformatted files for readability - Created a finalize sub flow class to be used by all the main flows - created local string variables for messages * Delete README.md Deleting because of duplication * Delete CreateAssetFlow.java Deleting because of duplication * Delete README.md deleted because it was not intended for commit.
- Loading branch information
Showing
36 changed files
with
1,923 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
@Library('[email protected]') _ | ||
|
||
cordaPipeline( | ||
nexusAppId: 'com.corda.CSDE-Java.5.0', | ||
publishRepoPrefix: '', | ||
slimBuild: true, | ||
runUnitTests: false, | ||
dedicatedJobForSnykDelta: false, | ||
slackChannel: '#corda-corda5-dev-ex-build-notifications' | ||
) |
6 changes: 6 additions & 0 deletions
6
java-samples/corda5-negotiation-cordapp/.ci/nightly/JenkinsfileSnykScan
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
@Library('[email protected]') _ | ||
|
||
cordaSnykScanPipeline ( | ||
snykTokenId: 'r3-snyk-corda5', | ||
snykAdditionalCommands: "--all-sub-projects -d" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
|
||
# Eclipse, ctags, Mac metadata, log files | ||
.classpath | ||
.project | ||
.settings | ||
tags | ||
.DS_Store | ||
*.log | ||
*.orig | ||
|
||
# Created by .ignore support plugin (hsz.mobi) | ||
|
||
.gradle | ||
local.properties | ||
.gradletasknamecache | ||
|
||
# General build files | ||
**/build/* | ||
|
||
lib/quasar.jar | ||
|
||
**/logs/* | ||
|
||
### JetBrains template | ||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio | ||
|
||
*.iml | ||
|
||
## Directory-based project format: | ||
.idea/*.xml | ||
.idea/.name | ||
.idea/copyright | ||
.idea/inspectionProfiles | ||
.idea/libraries | ||
.idea/shelf | ||
.idea/dataSources | ||
.idea/markdown-navigator | ||
.idea/runConfigurations | ||
.idea/dictionaries | ||
|
||
|
||
# Include the -parameters compiler option by default in IntelliJ required for serialization. | ||
!.idea/codeStyleSettings.xml | ||
|
||
|
||
## File-based project format: | ||
*.ipr | ||
*.iws | ||
|
||
## Plugin-specific files: | ||
|
||
# IntelliJ | ||
**/out/ | ||
/classes/ | ||
|
||
|
||
|
||
# vim | ||
*.swp | ||
*.swn | ||
*.swo | ||
|
||
|
||
|
||
# Directory generated during Resolve and TestOSGi gradle tasks | ||
bnd/ | ||
|
||
# Ignore Gradle build output directory | ||
build | ||
/.idea/codeStyles/codeStyleConfig.xml | ||
/.idea/codeStyles/Project.xml | ||
|
||
|
||
|
||
# Ignore Visual studio directory | ||
bin/ | ||
|
||
|
||
|
||
*.cpi | ||
*.cpb | ||
*.cpk | ||
workspace/** | ||
|
||
# ingore temporary data files | ||
*.dat |
15 changes: 15 additions & 0 deletions
15
java-samples/corda5-negotiation-cordapp/.run/runConfigurations/DebugCorDapp.run.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
<component name="ProjectRunConfigurationManager"> | ||
<configuration default="false" name="DebugCorDapp" type="Remote"> | ||
<option name="USE_SOCKET_TRANSPORT" value="true" /> | ||
<option name="SERVER_MODE" value="false" /> | ||
<option name="SHMEM_ADDRESS" /> | ||
<option name="HOST" value="localhost" /> | ||
<option name="PORT" value="5005" /> | ||
<option name="AUTO_RESTART" value="false" /> | ||
<RunnerSettings RunnerId="Debug"> | ||
<option name="DEBUG_PORT" value="5005" /> | ||
<option name="LOCAL" value="false" /> | ||
</RunnerSettings> | ||
<method v="2" /> | ||
</configuration> | ||
</component> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. | ||
version: v1.25.0 | ||
# ignores vulnerabilities until expiry date; change duration by modifying expiry date | ||
ignore: | ||
SNYK-JAVA-ORGJETBRAINSKOTLIN-2393744: | ||
- '*': | ||
reason: >- | ||
This vulnerability relates to information exposure via creation of | ||
temporary files (via Kotlin functions) with insecure permissions. | ||
Corda does not use any of the vulnerable functions so it is not | ||
susceptible to this vulnerability | ||
expires: 2023-10-19T17:15:26.836Z | ||
created: 2023-02-02T17:15:26.839Z | ||
patch: {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
# Negotiation Cordapp | ||
|
||
This CorDapp shows how multi-party negotiation is handled on the Corda ledger, in the absence of an API for user | ||
interaction. | ||
|
||
## Concepts | ||
|
||
A flow is provided that allows a node to propose a trade to a counterparty. The counterparty has two options: | ||
|
||
* Accepting the proposal, converting the `ProposalState` into a `TradeState` with identical attributes | ||
* Modifying the proposal, consuming the existing `ProposalState` and replacing it with a new `ProposalState` for a new | ||
amount | ||
|
||
Only the recipient of the proposal has the ability to accept it or modify it. If the sender of the proposal tries to | ||
accept or modify the proposal, this attempt will be rejected automatically at the flow level. | ||
|
||
### Flows | ||
|
||
We start with the proposal flow implemented in `ProposalFlow.java`. | ||
|
||
|
||
The modification of the proposal is implemented in `ModificationFlow.java`. | ||
|
||
|
||
In the `AcceptanceFlow.java`, we receive the modified ProposalState and it's converted into a TradeState. | ||
|
||
|
||
|
||
### Setting up | ||
|
||
1. We will begin our test deployment with clicking the `startCorda`. This task will load up the combined Corda workers in docker. | ||
A successful deployment will allow you to open the REST APIs at: https://localhost:8888/api/v1/swagger#. You can test out some | ||
functions to check connectivity. (GET /cpi function call should return an empty list as for now.) | ||
2. We will now deploy the cordapp with a click of `5-vNodeSetup` task. Upon successful deployment of the CPI, the GET /cpi function call should now return the meta data of the cpi you just upload. | ||
|
||
|
||
|
||
### Running the app | ||
|
||
In Corda 5, flows will be triggered via `POST /flow/{holdingidentityshorthash}` and flow result will need to be view at `GET /flow/{holdingidentityshorthash}/{clientrequestid}` | ||
* holdingidentityshorthash: the id of the network participants, ie Bob, Alice, Charlie. You can view all the short hashes of the network member with another gradle task called `ListVNodes` | ||
* clientrequestid: the id you specify in the flow requestBody when you trigger a flow. | ||
|
||
#### Step 1: Create ProposalState between two parties | ||
Pick a VNode identity to initiate the Proposal creation, and get its short hash. (Let's pick Alice.). | ||
|
||
Go to `POST /flow/{holdingidentityshorthash}`, enter the identity short hash(Alice's hash) and request body: | ||
``` | ||
{ | ||
"clientRequestId": "createProposal", | ||
"flowClassName": "com.r3.developers.samples.negotiation.workflows.propose.ProposalFlowRequest", | ||
"requestBody": { | ||
"amount": 20, | ||
"counterParty":"CN=Bob, OU=Test Dept, O=R3, L=London, C=GB" | ||
} | ||
} | ||
``` | ||
After trigger the create-ProposalFlow, hop to `GET /flow/{holdingidentityshorthash}/{clientrequestid}` and enter the short hash(Alice's hash) and client request id ("createProposal" in the case above) to view the flow result. | ||
|
||
|
||
#### Step 2: List created Proposal state | ||
In order to continue the app logics, we would need the Proposal ID. This step will bring out all the Proposal this entity (Alice) has. | ||
Go to `POST /flow/{holdingidentityshorthash}`, enter the identity short hash(Alice's hash) and request body: | ||
``` | ||
{ | ||
"clientRequestId": "list-1", | ||
"flowClassName": "com.r3.developers.samples.negotiation.workflows.util.ListProposal", | ||
"requestBody": {} | ||
} | ||
``` | ||
After trigger the List Proposal, hop to `GET /flow/{holdingidentityshorthash}/{clientrequestid}` and enter the short hash(Alice's hash) and client request id ("list-1" in the case above) to view the flow result. | ||
|
||
|
||
#### Step 3: Modify the proposal | ||
In order to continue the app logics, we would need the Proposal ID. This step will bring out the Proposal entries this entity (Alice) has. Bob can edit the proposal if required by entering the new amount. | ||
Go to `POST /flow/{holdingidentityshorthash}`, enter the identity short hash(Bob hash) and request body: | ||
``` | ||
{ | ||
"clientRequestId": "ModifyFlow", | ||
"flowClassName": "com.r3.developers.samples.negotiation.workflows.modify.ModifyFlowRequest", | ||
"requestBody": { | ||
"newAmount": 22, | ||
"proposalID": "<use the proposal id here>" | ||
} | ||
} | ||
``` | ||
After triggering the modify flow we need to hop to `GET /flow/{holdingidentityshorthash}/{clientrequestid}` and check the result. Enter bob's hash id and the modify flow id which is "ModifyFlow" in the case above. | ||
|
||
|
||
#### Step 4: Accept the new proposal from bob `AcceptFlow` | ||
In this step, alice will accept the new proposal of Bob. | ||
Goto `POST /flow/{holdingidentityshorthash}`, enter the identity short hash (of Alice) and request body, we also need to provide the proposalId, which is same as the proposal ID used in modifyFlow body. | ||
``` | ||
{ | ||
"clientRequestId": "AcceptFlow", | ||
"flowClassName": "com.r3.developers.samples.negotiation.workflows.accept.AcceptFlowRequest", | ||
"requestBody": { | ||
"proposalID": "<use the proposal id here>" | ||
} | ||
} | ||
``` | ||
And as for the result of this flow, go to `GET /flow/{holdingidentityshorthash}/{clientrequestid}` and enter the required fields. | ||
|
||
Thus, we have concluded a full run through of the Negotiation app. | ||
|
||
### App Diagrams | ||
Below are the app diagrams which are useful for the visual understanding. | ||
|
||
#### Dynamic Diagram | ||
|
||
|
||
![img_2.png](negotiation-sequence-diagram.png) | ||
|
||
|
||
|
||
|
||
|
||
#### Static Diagram | ||
|
||
![img.png](negotiation-design-diagram.png) | ||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
import static org.gradle.api.JavaVersion.VERSION_11 | ||
|
||
plugins { | ||
id 'org.jetbrains.kotlin.jvm' | ||
id 'net.corda.cordapp.cordapp-configuration' | ||
id 'org.jetbrains.kotlin.plugin.jpa' | ||
id 'java' | ||
id 'maven-publish' | ||
id 'net.corda.plugins.csde' | ||
} | ||
|
||
allprojects { | ||
group 'net.corda.samples' | ||
version '1.0-SNAPSHOT' | ||
|
||
def javaVersion = VERSION_11 | ||
|
||
// Configure the CSDE | ||
csde { | ||
cordaClusterURL = "https://localhost:8888" | ||
networkConfigFile = "config/static-network-config.json" | ||
r3RootCertFile = "config/r3-ca-key.pem" | ||
corDappCpiName = "MyCorDapp" | ||
notaryCpiName = "NotaryServer" | ||
cordaRpcUser = "admin" | ||
cordaRpcPasswd ="admin" | ||
workflowsModuleName = workflowsModule | ||
csdeWorkspaceDir = "workspace" | ||
notaryVersion = cordaNotaryPluginsVersion | ||
combinedWorkerVersion = combinedWorkerJarVersion | ||
postgresJdbcVersion = "42.4.3" | ||
cordaDbContainerName = "CSDEpostgresql" | ||
cordaBinDir = "${System.getProperty("user.home")}/.corda/corda5" | ||
cordaCliBinDir = "${System.getProperty("user.home")}/.corda/cli" | ||
} | ||
|
||
// Declare the set of Java compiler options we need to build a CorDapp. | ||
tasks.withType(JavaCompile) { | ||
// -parameters - Needed for reflection and serialization to work correctly. | ||
options.compilerArgs += [ | ||
"-parameters" | ||
] | ||
} | ||
|
||
repositories { | ||
// All dependencies are held in Maven Central | ||
mavenLocal() | ||
mavenCentral() | ||
} | ||
|
||
tasks.withType(Test).configureEach { | ||
useJUnitPlatform() | ||
} | ||
|
||
} | ||
|
||
publishing { | ||
publications { | ||
maven(MavenPublication) { | ||
artifactId "corda5-negotiation-cordapp" | ||
groupId project.group | ||
artifact jar | ||
} | ||
|
||
} | ||
} | ||
|
13 changes: 13 additions & 0 deletions
13
java-samples/corda5-negotiation-cordapp/config/gradle-plugin-default-key.pem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
-----BEGIN CERTIFICATE----- | ||
MIIB7zCCAZOgAwIBAgIEFyV7dzAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAkdC | ||
MQ8wDQYDVQQHDAZMb25kb24xDjAMBgNVBAoMBUNvcmRhMQswCQYDVQQLDAJSMzEe | ||
MBwGA1UEAwwVQ29yZGEgRGV2IENvZGUgU2lnbmVyMB4XDTIwMDYyNTE4NTI1NFoX | ||
DTMwMDYyMzE4NTI1NFowWzELMAkGA1UEBhMCR0IxDzANBgNVBAcTBkxvbmRvbjEO | ||
MAwGA1UEChMFQ29yZGExCzAJBgNVBAsTAlIzMR4wHAYDVQQDExVDb3JkYSBEZXYg | ||
Q29kZSBTaWduZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQDjSJtzQ+ldDFt | ||
pHiqdSJebOGPZcvZbmC/PIJRsZZUF1bl3PfMqyG3EmAe0CeFAfLzPQtf2qTAnmJj | ||
lGTkkQhxo0MwQTATBgNVHSUEDDAKBggrBgEFBQcDAzALBgNVHQ8EBAMCB4AwHQYD | ||
VR0OBBYEFLMkL2nlYRLvgZZq7GIIqbe4df4pMAwGCCqGSM49BAMCBQADSAAwRQIh | ||
ALB0ipx6EplT1fbUKqgc7rjH+pV1RQ4oKF+TkfjPdxnAAiArBdAI15uI70wf+xlL | ||
zU+Rc5yMtcOY4/moZUq36r0Ilg== | ||
-----END CERTIFICATE----- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<Configuration status="INFO"> | ||
<Appenders> | ||
<Console name="Console" target="SYSTEM_OUT"> | ||
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} %X - %msg%n"/> | ||
</Console> | ||
|
||
<RollingFile name="App" | ||
fileName="logs/corda.log" | ||
filePattern="logs/corda.%d{MM-dd-yyyy}.%i.log" | ||
ignoreExceptions="false"> | ||
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %X - %msg%n"/> | ||
<Policies> | ||
<OnStartupTriggeringPolicy /> | ||
<TimeBasedTriggeringPolicy /> | ||
<SizeBasedTriggeringPolicy size="10 MB" /> | ||
</Policies> | ||
<DefaultRolloverStrategy> | ||
<Delete basePath="logs/"> | ||
<IfFileName glob="logs/corda.*.log"> | ||
<IfAny> | ||
<IfAccumulatedFileSize exceeds="500 MB" /> | ||
<IfAccumulatedFileCount exceeds="10" /> | ||
</IfAny> | ||
</IfFileName> | ||
<IfLastModified age="7d" /> | ||
</Delete> | ||
</DefaultRolloverStrategy> | ||
</RollingFile> | ||
</Appenders> | ||
<Loggers> | ||
<logger name="Console"> | ||
<AppenderRef ref="Console" level="info"/> | ||
</logger> | ||
|
||
<!-- log warn only for these 3rd party libs --> | ||
<Logger name="com.zaxxer.hikari" level="warn" /> | ||
<Logger name="io.javalin.Javalin" level="warn" /> | ||
<Logger name="org.apache.aries.spifly" level="warn" /> | ||
<Logger name="org.apache.kafka" level="warn" /> | ||
<Logger name="org.eclipse.jetty" level="warn" /> | ||
<Logger name="org.hibernate" level="warn" /> | ||
|
||
<!-- default to warn only for OSGi logging --> | ||
<Logger name="net.corda.osgi.framework.OSGiFrameworkWrap" level="warn" /> | ||
|
||
<root level="debug"> | ||
<AppenderRef ref="App" level="info"/> | ||
</root> | ||
</Loggers> | ||
</Configuration> |
Oops, something went wrong.