CORDA-2361: Split samples into contracts and workflows (#4575)

This commit is contained in:
Katarzyna Streich 2019-01-23 13:26:33 +00:00 committed by GitHub
parent 82f5a756fe
commit 35acbc8107
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
73 changed files with 562 additions and 383 deletions

View File

@ -314,6 +314,9 @@ Version 4.0
* Finance CorDapp was split into two separate apps: ``corda-finance-contracts`` and ``corda-finance-workflows``,
``corda-finance`` is kept for backward compatibility, it is recommended to use separated jars.
* All sample CorDapps were split into separate apps: workflows and contracts to reflect new convention. It is recommended to structure your CorDapps
this way, see :doc:`app-upgrade-notes` on upgrading your CorDapp.
* The format of the shell commands' output can now be customized via the node shell, using the ``output-format`` command.
* The ``node_transaction_mapping`` database table has been folded into the ``node_transactions`` database table as an additional column.

View File

@ -1,50 +1,41 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'
sourceSets {
integrationTest {
kotlin {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integration-test/kotlin')
}
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
description 'Corda attachment demo'
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
testCompile "junit:junit:$junit_version"
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts')
cordaCompile project(':core')
cordaCompile project(':webserver')
cordaCompile project(':node-driver')
cordapp project(':samples:attachment-demo:contracts')
cordapp project(':samples:attachment-demo:workflows')
}
def nodeTask = tasks.getByPath(':node:capsule:assemble')
def webTask = tasks.getByPath(':webserver:webcapsule:assemble')
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) {
ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["StartFlow.net.corda.attachmentdemo.AttachmentDemoFlow",
"InvokeRpc.wellKnownPartyFromX500Name",
"InvokeRpc.partiesFromName",
"InvokeRpc.attachmentExists",
"InvokeRpc.openAttachment",
"InvokeRpc.uploadAttachment",
"InvokeRpc.internalVerifiedTransactionsFeed"]]]
"InvokeRpc.internalVerifiedTransactionsFeed",
"InvokeRpc.startTrackedFlowDynamic"]]]
directory "./build/nodes"
nodeDefaults {
projectCordapp {
deploy = false
}
cordapp project(':samples:attachment-demo:contracts')
cordapp project(':samples:attachment-demo:workflows')
}
node {
name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true]
notary = [validating: true]
p2pPort 10002
cordapps = []
rpcUsers = ext.rpcUsers
@ -52,7 +43,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
address "localhost:10003"
adminAddress "localhost:10004"
}
extraConfig = ['h2Settings.address' : 'localhost:10012']
extraConfig = ['h2Settings.address': 'localhost:10012']
}
node {
name "O=Bank A,L=London,C=GB"
@ -63,7 +54,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
address "localhost:10006"
adminAddress "localhost:10007"
}
extraConfig = ['h2Settings.address' : 'localhost:10013']
extraConfig = ['h2Settings.address': 'localhost:10013']
}
node {
name "O=Bank B,L=New York,C=US"
@ -75,51 +66,20 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
webPort 10010
cordapps = []
rpcUsers = ext.rpcUsers
extraConfig = ['h2Settings.address' : 'localhost:10014']
}
}
task integrationTest(type: Test, dependsOn: []) {
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
idea {
module {
downloadJavadoc = true // defaults to false
downloadSources = true
extraConfig = ['h2Settings.address': 'localhost:10014']
}
}
task runSender(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'net.corda.attachmentdemo.AttachmentDemoKt'
main = 'net.corda.attachmentdemo.workflows.AttachmentDemoKt'
args '--role'
args 'SENDER'
}
task runRecipient(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'net.corda.attachmentdemo.AttachmentDemoKt'
main = 'net.corda.attachmentdemo.workflows.AttachmentDemoKt'
args '--role'
args 'RECIPIENT'
}
jar {
manifest {
attributes(
'Automatic-Module-Name': 'net.corda.samples.demos.attachment'
)
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/attachment-demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,24 @@
apply plugin: 'kotlin'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda attachment demo - contracts'
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
cordaCompile project(':core')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
contract {
name "Corda Attachment Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-attachment-demo-contracts'
}

View File

@ -0,0 +1,24 @@
package net.corda.attachmentdemo.contracts
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.contracts.TypeOnlyCommandData
import net.corda.core.crypto.SecureHash
import net.corda.core.identity.AbstractParty
import net.corda.core.transactions.LedgerTransaction
class AttachmentContract : Contract {
override fun verify(tx: LedgerTransaction) {
val state = tx.outputsOfType<State>().single()
// we check that at least one has the matching hash, the other will be the contract
require(tx.attachments.any { it.id == state.hash }) {"At least one attachment in transaction must match hash ${state.hash}"}
}
object Command : TypeOnlyCommandData()
data class State(val hash: SecureHash.SHA256) : ContractState {
override val participants: List<AbstractParty> = emptyList()
}
}
const val ATTACHMENT_PROGRAM_ID = "net.corda.attachmentdemo.contracts.AttachmentContract"

View File

@ -1,8 +0,0 @@
The Quasar.jar in this directory is for runtime instrumentation of classes by Quasar.
When running corda outside of the given gradle building you must add the following flag with the
correct path to your call to Java:
java -javaagent:path-to-quasar-jar.jar ...
See the Quasar docs for more information: http://docs.paralleluniverse.co/quasar/

View File

@ -1,20 +0,0 @@
package net.corda.attachmentdemo
import net.corda.core.internal.div
import net.corda.testing.core.DUMMY_BANK_A_NAME
import net.corda.testing.core.DUMMY_BANK_B_NAME
import net.corda.testing.driver.DriverParameters
import net.corda.testing.driver.driver
import net.corda.testing.node.User
/**
* This file is exclusively for being able to run your nodes through an IDE (as opposed to running deployNodes)
* Do not use in a production environment.
*/
fun main(args: Array<String>) {
val demoUser = listOf(User("demo", "demo", setOf("StartFlow.net.corda.flows.FinalityFlow")))
driver(DriverParameters(driverDirectory = "build" / "attachment-demo-nodes", waitForAllNodesToFinish = true)) {
startNode(providedName = DUMMY_BANK_A_NAME, rpcUsers = demoUser)
startNode(providedName = DUMMY_BANK_B_NAME, rpcUsers = demoUser)
}
}

View File

@ -0,0 +1,58 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda attachment demo - workflows'
sourceSets {
integrationTest {
kotlin {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integration-test/kotlin')
}
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
// Corda integration dependencies
cordaCompile project(':core')
cordaCompile project(':webserver')
cordapp project(':samples:attachment-demo:contracts')
testCompile project(':node-driver')
testCompile "junit:junit:$junit_version"
}
task integrationTest(type: Test, dependsOn: []) {
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
idea {
module {
downloadJavadoc = true // defaults to false
downloadSources = true
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Corda Attachment Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-attachment-demo-workflows'
}

View File

@ -1,5 +1,7 @@
package net.corda.attachmentdemo
import net.corda.attachmentdemo.workflows.recipient
import net.corda.attachmentdemo.workflows.sender
import net.corda.client.rpc.CordaRPCClient
import net.corda.core.utilities.getOrThrow
import net.corda.node.services.Permissions.Companion.all
@ -9,6 +11,7 @@ import net.corda.testing.driver.DriverParameters
import net.corda.testing.driver.driver
import net.corda.testing.driver.internal.incrementalPortAllocation
import net.corda.testing.node.User
import net.corda.testing.node.internal.findCordapp
import org.junit.Test
import java.util.concurrent.CompletableFuture.supplyAsync
@ -17,7 +20,11 @@ class AttachmentDemoTest {
@Test
fun `attachment demo using a 10MB zip file`() {
val numOfExpectedBytes = 10_000_000
driver(DriverParameters(portAllocation = incrementalPortAllocation(20000), startNodesInProcess = true)) {
driver(DriverParameters(
portAllocation = incrementalPortAllocation(20000),
startNodesInProcess = true,
cordappsForAllNodes = listOf(findCordapp("net.corda.attachmentdemo.contracts"), findCordapp("net.corda.attachmentdemo.workflows")))
) {
val demoUser = listOf(User("demo", "demo", setOf(all())))
val (nodeA, nodeB) = listOf(
startNode(providedName = DUMMY_BANK_A_NAME, rpcUsers = demoUser, maximumHeapSize = "1g"),

View File

@ -1,30 +1,23 @@
package net.corda.attachmentdemo
package net.corda.attachmentdemo.workflows
import co.paralleluniverse.fibers.Suspendable
import joptsimple.OptionParser
import net.corda.attachmentdemo.contracts.ATTACHMENT_PROGRAM_ID
import net.corda.attachmentdemo.contracts.AttachmentContract
import net.corda.client.rpc.CordaRPCClient
import net.corda.core.concurrent.CordaFuture
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.contracts.TypeOnlyCommandData
import net.corda.core.crypto.SecureHash
import net.corda.core.flows.*
import net.corda.core.identity.AbstractParty
import net.corda.core.identity.Party
import net.corda.core.internal.Emoji
import net.corda.core.internal.InputStreamAndHash
import net.corda.core.messaging.CordaRPCOps
import net.corda.core.messaging.startTrackedFlow
import net.corda.core.node.StatesToRecord
import net.corda.core.transactions.LedgerTransaction
import net.corda.core.transactions.SignedTransaction
import net.corda.core.transactions.TransactionBuilder
import net.corda.core.utilities.NetworkHostAndPort
import net.corda.core.utilities.ProgressTracker
import net.corda.core.utilities.getOrThrow
import net.corda.testing.core.DUMMY_BANK_B_NAME
import net.corda.testing.core.DUMMY_NOTARY_NAME
import net.corda.testing.node.internal.poll
import java.io.InputStream
import java.net.HttpURLConnection
import java.net.URL
@ -76,28 +69,23 @@ fun main(args: Array<String>) {
// DOCSTART 2
fun sender(rpc: CordaRPCOps, numOfClearBytes: Int = 1024) { // default size 1K.
val (inputStream, hash) = InputStreamAndHash.createInMemoryTestZip(numOfClearBytes, 0)
val executor = Executors.newScheduledThreadPool(2)
try {
sender(rpc, inputStream, hash, executor)
} finally {
executor.shutdown()
}
sender(rpc, inputStream, hash)
}
private fun sender(rpc: CordaRPCOps, inputStream: InputStream, hash: SecureHash.SHA256, executor: ScheduledExecutorService) {
private fun sender(rpc: CordaRPCOps, inputStream: InputStream, hash: SecureHash.SHA256) {
// Get the identity key of the other side (the recipient).
val notaryFuture: CordaFuture<Party> = poll(executor, DUMMY_NOTARY_NAME.toString()) { rpc.wellKnownPartyFromX500Name(DUMMY_NOTARY_NAME) }
val otherSideFuture: CordaFuture<Party> = poll(executor, DUMMY_BANK_B_NAME.toString()) { rpc.wellKnownPartyFromX500Name(DUMMY_BANK_B_NAME) }
val notaryParty = rpc.partiesFromName("Notary", false).firstOrNull() ?: throw IllegalArgumentException("Couldn't find notary party")
val bankBParty = rpc.partiesFromName("Bank B", false).firstOrNull() ?: throw IllegalArgumentException("Couldn't find Bank B party")
// Make sure we have the file in storage
if (!rpc.attachmentExists(hash)) {
inputStream.use {
val id = rpc.uploadAttachment(it)
require(hash == id) { "Id was '$id' instead of '$hash'" }
}
require(rpc.attachmentExists(hash)){"Attachment matching hash: $hash does not exist"}
require(rpc.attachmentExists(hash)) { "Attachment matching hash: $hash does not exist" }
}
val flowHandle = rpc.startTrackedFlow(::AttachmentDemoFlow, otherSideFuture.get(), notaryFuture.get(), hash)
val flowHandle = rpc.startTrackedFlow(::AttachmentDemoFlow, bankBParty, notaryParty, hash)
flowHandle.progress.subscribe(::println)
val stx = flowHandle.returnValue.getOrThrow()
println("Sent ${stx.id}")
@ -149,7 +137,6 @@ class NoProgressTrackerShellDemo : FlowLogic<String>() {
}
}
@Suppress("DEPRECATION")
// DOCSTART 1
fun recipient(rpc: CordaRPCOps, webPort: Int) {
@ -159,7 +146,7 @@ fun recipient(rpc: CordaRPCOps, webPort: Int) {
if (wtx.attachments.isNotEmpty()) {
if (wtx.outputs.isNotEmpty()) {
val state = wtx.outputsOfType<AttachmentContract.State>().single()
require(rpc.attachmentExists(state.hash)) {"attachment matching hash: ${state.hash} does not exist"}
require(rpc.attachmentExists(state.hash)) { "attachment matching hash: ${state.hash} does not exist" }
// Download the attachment via the Web endpoint.
val connection = URL("http://localhost:$webPort/attachments/${state.hash}").openConnection() as HttpURLConnection
@ -200,19 +187,3 @@ private fun printHelp(parser: OptionParser) {
""".trimIndent())
parser.printHelpOn(System.out)
}
const val ATTACHMENT_PROGRAM_ID = "net.corda.attachmentdemo.AttachmentContract"
class AttachmentContract : Contract {
override fun verify(tx: LedgerTransaction) {
val state = tx.outputsOfType<AttachmentContract.State>().single()
// we check that at least one has the matching hash, the other will be the contract
require(tx.attachments.any { it.id == state.hash }) {"At least one attachment in transaction must match hash ${state.hash}"}
}
object Command : TypeOnlyCommandData()
data class State(val hash: SecureHash.SHA256) : ContractState {
override val participants: List<AbstractParty> = emptyList()
}
}

View File

@ -25,9 +25,6 @@ dependencies {
// Javax is required for webapis
compile "org.glassfish.jersey.core:jersey-server:${jersey_version}"
// Cordapp dependencies
// Specify your cordapp's dependencies below, including dependent cordapps
// Test dependencies
testCompile "junit:junit:$junit_version"
}
@ -121,10 +118,9 @@ jar {
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/bank-of-corda-demo"
versionId 1
info {
name "Bank of Corda Demo"
version "1"
vendor "R3"
licence "Open Source (Apache 2)"
}
}
}

View File

@ -1,15 +1,15 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'
dependencies {
cordaCompile project(':core')
cordaCompile project(':node-api')
compile project(':node-api')
runtimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version"
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
runtime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordapp project(':samples:cordapp-configuration:workflows')
}
def nodeTask = tasks.getByPath(':node:capsule:assemble')
@ -17,8 +17,11 @@ def webTask = tasks.getByPath(':webserver:webcapsule:assemble')
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) {
directory file("$buildDir/nodes")
nodeDefaults {
cordapps = []
projectCordapp {
deploy = false // TODO This is a bug, project cordapp should be disabled if no cordapp plugin is applied.
}
rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]]
cordapp project(':samples:cordapp-configuration:workflows')
}
node {
name "O=Notary Service,L=Zurich,C=CH"
@ -34,7 +37,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
name "O=Bank A,L=London,C=GB"
p2pPort 10006
// This configures the default cordapp for this node
projectCordapp {
cordapp (project(':samples:cordapp-configuration:workflows')) {
config "someStringValue=test"
}
rpcSettings {
@ -47,7 +50,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
name "O=Bank B,L=New York,C=US"
p2pPort 10010
// This configures the default cordapp for this node
projectCordapp {
cordapp (project(':samples:cordapp-configuration:workflows')){
config project.file("src/config.conf")
}
rpcSettings {
@ -57,14 +60,3 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
extraConfig = ['h2Settings.address' : 'localhost:10013']
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/cordapp-configuration"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,19 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'
dependencies {
cordaCompile project(':core')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Cordapp Configuration Sample"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -22,23 +22,4 @@ class GetStringConfigFlow(private val configKey: String) : FlowLogic<String>() {
val config = serviceHub.getAppContext().config
return config.getString(configKey)
}
}
@CordaSerializable
data class GetStringTestState(val responses: List<String>, val issuer: AbstractParty) : ContractState {
override val participants: List<AbstractParty>
get() = listOf(issuer)
}
@CordaSerializable
object GetStringTestCommand : CommandData
class GetStringTestContract : Contract {
override fun verify(tx: LedgerTransaction) {
}
}

View File

@ -62,7 +62,6 @@ repositories {
dependencies {
compile group: 'commons-io', name: 'commons-io', version: '2.5'
compile project(path: ":samples:irs-demo:cordapp", configuration: "demoArtifacts")
compile project(":samples:irs-demo:web")
compile('org.springframework.boot:spring-boot-starter-web') {
exclude module: "spring-boot-starter-logging"

View File

@ -17,29 +17,17 @@ sourceSets {
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
demoArtifacts.extendsFrom integrationTestRuntime
}
dependencies {
// The irs demo CorDapp depends upon Cash CorDapp features
cordapp project(':finance:contracts')
cordapp project(':finance:workflows')
cordapp project(':confidential-identities')
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordaCompile project(':core')
cordaRuntime project(':node-api')
// Cordapp dependencies
// Specify your cordapp's dependencies below, including dependent cordapps
compile group: 'commons-io', name: 'commons-io', version: '2.5'
testCompile project(':node-driver')
testCompile "junit:junit:$junit_version"
testCompile "org.assertj:assertj-core:${assertj_version}"
cordapp project(':samples:irs-demo:cordapp:contracts-irs')
cordapp project(':samples:irs-demo:cordapp:workflows-irs')
}
def rpcUsersList = [
@ -58,7 +46,14 @@ def rpcUsersList = [
def nodeTask = tasks.getByPath(':node:capsule:assemble')
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask]) {
nodeDefaults{
projectCordapp {
deploy = false
}
cordapp project(':samples:irs-demo:cordapp:contracts-irs')
cordapp project(':samples:irs-demo:cordapp:workflows-irs')
cordapp project(':confidential-identities')
}
node {
name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true]
@ -113,7 +108,11 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask])
}
task prepareDockerNodes(type: net.corda.plugins.Dockerform, dependsOn: ['jar', nodeTask]) {
nodeDefaults{
cordapp project(':samples:irs-demo:cordapp:contracts-irs')
cordapp project(':samples:irs-demo:cordapp:workflows-irs')
cordapp project(':confidential-identities')
}
node {
name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true]
@ -163,35 +162,3 @@ idea {
downloadSources = true
}
}
jar {
from sourceSets.main.output
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
task testJar(type: Jar) {
classifier "test"
from sourceSets.main.output
from sourceSets.test.output
}
artifacts {
demoArtifacts testJar
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
contract {
name "net/corda/irs-demo/contract"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
workflow {
name "net/corda/irs-demo/flows"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,28 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.cordapp'
dependencies {
// The irs demo CorDapp depends upon Cash CorDapp features
cordaCompile project(':core')
cordaRuntime project(':node-api')
testCompile project(':node-driver')
testCompile "junit:junit:$junit_version"
cordapp project(':finance:contracts')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
contract {
name "Corda IRS Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-irs-demo-contracts'
}

View File

@ -0,0 +1,52 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
configurations {
demoArtifacts.extendsFrom testRuntime
}
dependencies {
// The irs demo CorDapp depends upon Cash CorDapp features
cordapp project(':finance:contracts')
cordapp project(':finance:workflows')
// Corda integration dependencies
cordaCompile project(':core')
// Cordapp dependencies
// Specify your cordapp's dependencies below, including dependent cordapps
compile group: 'commons-io', name: 'commons-io', version: '2.5'
testCompile project(':node-driver')
testCompile "junit:junit:$junit_version"
testCompile "org.assertj:assertj-core:${assertj_version}"
cordapp project(':samples:irs-demo:cordapp:contracts-irs')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Corda IRS Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-irs-demo-workflows'
}
task testJar(type: Jar) {
classifier "test"
from sourceSets.main.output
from sourceSets.test.output
}
artifacts {
demoArtifacts testJar
}

View File

@ -33,7 +33,6 @@ import net.corda.testing.node.NotarySpec
import net.corda.testing.node.User
import org.apache.commons.io.IOUtils
import org.assertj.core.api.Assertions.assertThat
import org.junit.Ignore
import org.junit.Test
import rx.Observable
import java.time.Duration

View File

@ -70,10 +70,12 @@ dependencies {
compile("com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_version")
compile project(":client:rpc")
compile project(":client:jackson")
compile project(":samples:irs-demo:cordapp")
compile project(":finance:workflows")
// TODO In the future remove -irs bit from the directory name. Currently it clashes with :finance:workflows (same for contracts).
compile project(":samples:irs-demo:cordapp:workflows-irs")
testCompile project(":test-utils")
testCompile project(path: ":samples:irs-demo:cordapp", configuration: "demoArtifacts")
testCompile project(path: ":samples:irs-demo:cordapp:workflows-irs", configuration: "demoArtifacts")
// JOpt: for command line flags.
compile "net.sf.jopt-simple:jopt-simple:$jopt_simple_version"

View File

@ -6,17 +6,23 @@ dependencies {
cordaCompile project(':core')
cordaCompile project(':node-api')
testCompile project(":test-utils")
testCompile "junit:junit:$junit_version"
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordapp project(':samples:network-verifier:contracts')
cordapp project(':samples:network-verifier:workflows')
}
def nodeTask = tasks.getByPath(':node:capsule:assemble')
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask]) {
ext.rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]]
nodeDefaults{
projectCordapp {
deploy = false
}
cordapp project(':samples:network-verifier:contracts')
cordapp project(':samples:network-verifier:workflows')
}
directory "./build/nodes"
node {
name "O=Notary Service,L=Zurich,C=CH"
@ -51,14 +57,3 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask])
extraConfig = ['h2Settings.address' : 'localhost:0']
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/network-verifier"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,23 @@
apply plugin: 'kotlin'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda Network Verifier - Contracts'
dependencies {
cordaCompile project(':core')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
contract {
name "Corda Network Verifier"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-network-verifier-contracts'
}

View File

@ -0,0 +1,24 @@
package net.corda.verification
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.identity.AbstractParty
import net.corda.core.serialization.CordaSerializable
import net.corda.core.transactions.LedgerTransaction
@CordaSerializable
@BelongsToContract(CommsTestContract::class)
data class CommsTestState(val responses: List<String>, val issuer: AbstractParty) : ContractState {
override val participants: List<AbstractParty>
get() = listOf(issuer)
}
@CordaSerializable
object CommsTestCommand : CommandData
class CommsTestContract : Contract {
override fun verify(tx: LedgerTransaction) {
}
}

View File

@ -0,0 +1,22 @@
package net.corda.verification
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.identity.AbstractParty
import net.corda.core.serialization.CordaSerializable
import net.corda.core.transactions.LedgerTransaction
@CordaSerializable
data class NotaryTestState(val id: String, val issuer: AbstractParty) : ContractState {
override val participants: List<AbstractParty>
get() = listOf(issuer)
}
@CordaSerializable
object NotaryTestCommand : CommandData
class NotaryTestContract : Contract {
override fun verify(tx: LedgerTransaction) {
}
}

View File

@ -0,0 +1,27 @@
apply plugin: 'kotlin'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda Network Verifier - Workflows'
dependencies {
cordaCompile project(':core')
cordapp project(':samples:network-verifier:contracts')
testCompile project(":test-utils")
testCompile "junit:junit:$junit_version"
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Corda Network Verifier"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-network-verifier-workflows'
}

View File

@ -1,16 +1,9 @@
package net.corda.verification
import co.paralleluniverse.fibers.Suspendable
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.flows.*
import net.corda.core.identity.AbstractParty
import net.corda.core.identity.CordaX500Name
import net.corda.core.identity.Party
import net.corda.core.serialization.CordaSerializable
import net.corda.core.transactions.LedgerTransaction
import net.corda.core.transactions.TransactionBuilder
import net.corda.core.utilities.ProgressTracker
import net.corda.core.utilities.unwrap
@ -61,18 +54,3 @@ class TestCommsFlowResponder(private val otherSideSession: FlowSession) : FlowLo
otherSideSession.send("Hello from: " + serviceHub.myInfo.legalIdentities.first().name.toString())
}
}
@CordaSerializable
@BelongsToContract(CommsTestContract::class)
data class CommsTestState(val responses: List<String>, val issuer: AbstractParty) : ContractState {
override val participants: List<AbstractParty>
get() = listOf(issuer)
}
@CordaSerializable
object CommsTestCommand : CommandData
class CommsTestContract : Contract {
override fun verify(tx: LedgerTransaction) {
}
}

View File

@ -1,14 +1,8 @@
package net.corda.verification
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.flows.FinalityFlow
import net.corda.core.flows.FlowLogic
import net.corda.core.flows.StartableByRPC
import net.corda.core.identity.AbstractParty
import net.corda.core.serialization.CordaSerializable
import net.corda.core.transactions.LedgerTransaction
import net.corda.core.transactions.TransactionBuilder
import net.corda.core.utilities.ProgressTracker
import co.paralleluniverse.fibers.Suspendable
@ -45,17 +39,3 @@ class TestNotaryFlow : FlowLogic<String>() {
return "notarised: ${result.notary}::${result.tx.id}"
}
}
@CordaSerializable
data class NotaryTestState(val id: String, val issuer: AbstractParty) : ContractState {
override val participants: List<AbstractParty>
get() = listOf(issuer)
}
@CordaSerializable
object NotaryTestCommand : CommandData
class NotaryTestContract : Contract {
override fun verify(tx: LedgerTransaction) {
}
}

View File

@ -7,21 +7,15 @@ apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts')
cordaCompile project(':core')
cordaCompile project(':client:jfx')
cordaCompile project(':client:rpc')
cordaCompile project(':test-utils')
// Notary implementations
cordapp project(':samples:notary-demo:contracts')
cordapp project(':samples:notary-demo:workflows')
}
def nodeTask = tasks.getByPath(':node:capsule:assemble')
@ -32,7 +26,12 @@ task deployNodes(dependsOn: ['deployNodesSingle', 'deployNodesRaft', 'deployNode
task deployNodesSingle(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
directory file("$buildDir/nodes/nodesSingle")
nodeDefaults {
projectCordapp {
deploy = false
}
extraConfig = [h2Settings: [address: "localhost:0"]]
cordapp project(':samples:notary-demo:contracts')
cordapp project(':samples:notary-demo:workflows')
}
node {
name "O=Alice Corp,L=Madrid,C=ES"
@ -57,7 +56,12 @@ task deployNodesSingle(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
task deployNodesCustom(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
directory file("$buildDir/nodes/nodesCustom")
nodeDefaults {
projectCordapp {
deploy = false
}
extraConfig = [h2Settings: [address: "localhost:0"]]
cordapp project(':samples:notary-demo:contracts')
cordapp project(':samples:notary-demo:workflows')
}
node {
name "O=Alice Corp,L=Madrid,C=ES"
@ -83,10 +87,14 @@ task deployNodesCustom(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
}
task deployNodesRaft(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
def className = ""
directory file("$buildDir/nodes/nodesRaft")
nodeDefaults {
projectCordapp {
deploy = false
}
extraConfig = [h2Settings: [address: "localhost:0"]]
cordapp project(':samples:notary-demo:contracts')
cordapp project(':samples:notary-demo:workflows')
}
node {
name "O=Alice Corp,L=Madrid,C=ES"
@ -150,7 +158,12 @@ task deployNodesBFT(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
def clusterAddresses = ["localhost:11000", "localhost:11010", "localhost:11020", "localhost:11030"]
directory file("$buildDir/nodes/nodesBFT")
nodeDefaults {
projectCordapp {
deploy = false
}
extraConfig = [h2Settings: [address: "localhost:0"]]
cordapp project(':samples:notary-demo:contracts')
cordapp project(':samples:notary-demo:workflows')
}
node {
name "O=Alice Corp,L=Madrid,C=ES"
@ -231,22 +244,3 @@ task notarise(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'net.corda.notarydemo.NotariseKt'
}
jar {
manifest {
attributes(
'Automatic-Module-Name': 'net.corda.samples.demos.notary'
)
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/notary-demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,23 @@
apply plugin: 'kotlin'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda Notary Demo - Contracts'
dependencies {
cordaCompile project(':core')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
contract {
name "Corda Notary Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-notary-demo-contracts'
}

View File

@ -0,0 +1,19 @@
package net.corda.notarydemo.contracts
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.identity.AbstractParty
import net.corda.core.transactions.LedgerTransaction
const val DO_NOTHING_PROGRAM_ID = "net.corda.notarydemo.contracts.DoNothingContract"
class DoNothingContract : Contract {
override fun verify(tx: LedgerTransaction) {}
}
data class DummyCommand(val dummy: Int = 0) : CommandData
@BelongsToContract(DoNothingContract::class)
data class DummyState(override val participants: List<AbstractParty>, val discriminator: Int) : ContractState

View File

@ -0,0 +1,27 @@
apply plugin: 'kotlin'
apply plugin: 'net.corda.plugins.cordapp'
description 'Corda Notary Demo - Workflows'
dependencies {
cordaCompile project(':core')
cordaCompile project(':client:rpc')
cordaCompile project(':node')
cordapp project(':samples:notary-demo:contracts')
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Corda Notary Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}
jar {
baseName 'corda-notary-demo-workflows'
}

View File

@ -2,7 +2,10 @@ package net.corda.notarydemo
import net.corda.client.rpc.CordaRPCClient
import net.corda.core.crypto.CompositeKey
import net.corda.core.crypto.Crypto
import net.corda.core.crypto.toStringShort
import net.corda.core.identity.CordaX500Name
import net.corda.core.identity.Party
import net.corda.core.messaging.CordaRPCOps
import net.corda.core.messaging.startFlow
import net.corda.core.transactions.SignedTransaction
@ -10,8 +13,6 @@ import net.corda.core.utilities.NetworkHostAndPort
import net.corda.core.utilities.getOrThrow
import net.corda.notarydemo.flows.DummyIssueAndMove
import net.corda.notarydemo.flows.RPCStartableNotaryFlowClient
import net.corda.testing.core.BOB_NAME
import net.corda.testing.core.TestIdentity
import java.util.concurrent.Future
fun main(args: Array<String>) {
@ -30,7 +31,8 @@ private class NotaryDemoClientApi(val rpc: CordaRPCOps) {
}
/** A dummy identity. */
private val counterparty = TestIdentity(BOB_NAME).party
private val BOB_NAME = CordaX500Name("Bob Plc", "Rome", "IT")
private val counterparty = Party(BOB_NAME, Crypto.generateKeyPair(Crypto.DEFAULT_SIGNATURE_SCHEME).public)
/** Makes calls to the node rpc to start transaction notarisation. */
fun notarise(count: Int) {

View File

@ -1,37 +1,22 @@
package net.corda.notarydemo.flows
import co.paralleluniverse.fibers.Suspendable
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.ContractState
import net.corda.core.flows.FlowLogic
import net.corda.core.flows.StartableByRPC
import net.corda.core.identity.AbstractParty
import net.corda.core.identity.Party
import net.corda.core.transactions.LedgerTransaction
import net.corda.core.transactions.SignedTransaction
import net.corda.core.transactions.TransactionBuilder
import net.corda.notarydemo.contracts.DO_NOTHING_PROGRAM_ID
import net.corda.notarydemo.contracts.DummyCommand
import net.corda.notarydemo.contracts.DummyState
@StartableByRPC
class DummyIssueAndMove(private val notary: Party, private val counterpartyNode: Party, private val discriminator: Int) : FlowLogic<SignedTransaction>() {
companion object {
private const val DO_NOTHING_PROGRAM_ID = "net.corda.notarydemo.flows.DummyIssueAndMove\$DoNothingContract"
}
class DoNothingContract : Contract {
override fun verify(tx: LedgerTransaction) {}
}
data class DummyCommand(val dummy: Int = 0) : CommandData
@BelongsToContract(DoNothingContract::class)
data class State(override val participants: List<AbstractParty>, val discriminator: Int) : ContractState
@Suspendable
override fun call(): SignedTransaction {
// Self issue an asset
val state = State(listOf(ourIdentity), discriminator)
val state = DummyState(listOf(ourIdentity), discriminator)
val issueTx = serviceHub.signInitialTransaction(TransactionBuilder(notary).apply {
addOutputState(state, DO_NOTHING_PROGRAM_ID)
addCommand(DummyCommand(), listOf(ourIdentity.owningKey))

View File

@ -1,24 +1,8 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'
sourceSets {
integrationTest {
kotlin {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integration-test/kotlin')
}
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
@ -27,11 +11,11 @@ dependencies {
cordapp project(':finance:workflows')
cordapp project(':confidential-identities')
cordapp project(':samples:bank-of-corda-demo')
cordapp project(':samples:trader-demo:workflows-trader')
// Corda integration dependencies
cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts')
cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts')
cordaCompile project(':core')
testCompile project(':test-utils')
testCompile "junit:junit:$junit_version"
@ -43,9 +27,13 @@ def webTask = tasks.getByPath(':webserver:webcapsule:assemble')
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) {
ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["ALL"]]]
nodeDefaults {
projectCordapp {
deploy = false // TODO This is a bug, project cordapp should be disabled if no cordapp plugin is applied.
}
cordapp project(':finance:workflows')
cordapp project(':finance:contracts')
cordapp project(':confidential-identities')
cordapp project(':samples:trader-demo:workflows-trader')
}
directory "./build/nodes"
node {
@ -103,11 +91,6 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask,
}
}
task integrationTest(type: Test, dependsOn: []) {
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
idea {
module {
downloadJavadoc = true // defaults to false
@ -128,22 +111,3 @@ task runSeller(type: JavaExec) {
args '--role'
args 'SELLER'
}
jar {
manifest {
attributes(
'Automatic-Module-Name': 'net.corda.samples.demos.trader'
)
}
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "net/corda/samples/trader-demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -0,0 +1,59 @@
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'net.corda.plugins.cordapp'
sourceSets {
integrationTest {
kotlin {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integration-test/kotlin')
}
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
// The trader demo CorDapp depends upon Cash CorDapp features
cordapp project(':finance:contracts')
cordapp project(':finance:workflows')
cordapp project(':confidential-identities')
cordapp project(':samples:bank-of-corda-demo')
// Corda integration dependencies
cordaCompile project(':core')
testCompile project(':test-utils')
testCompile "junit:junit:$junit_version"
testCompile "org.assertj:assertj-core:${assertj_version}"
integrationTestCompile project(':finance:workflows')
integrationTestCompile project(':finance:contracts')
}
task integrationTest(type: Test, dependsOn: []) {
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
jar {
baseName 'corda-trader-demo-workflows'
}
cordapp {
targetPlatformVersion corda_platform_version.toInteger()
minimumPlatformVersion 1
workflow {
name "Trader Demo"
versionId 1
vendor "R3"
licence "Open Source (Apache 2)"
}
}

View File

@ -14,7 +14,6 @@ import net.corda.testing.driver.DriverParameters
import net.corda.testing.driver.InProcess
import net.corda.testing.driver.OutOfProcess
import net.corda.testing.driver.driver
import net.corda.testing.node.NotarySpec
import net.corda.testing.node.TestCordapp
import net.corda.testing.node.User
import net.corda.testing.node.internal.FINANCE_CORDAPPS

View File

@ -48,18 +48,22 @@ include 'tools:network-bootstrapper'
include 'tools:cliutils'
include 'example-code'
project(':example-code').projectDir = file("$settingsDir/docs/source/example-code")
include 'samples:attachment-demo'
include 'samples:trader-demo'
include 'samples:attachment-demo:contracts'
include 'samples:attachment-demo:workflows'
include 'samples:trader-demo:workflows-trader'
include 'samples:irs-demo'
include 'samples:irs-demo:cordapp'
include 'samples:irs-demo:cordapp:contracts-irs'
include 'samples:irs-demo:cordapp:workflows-irs'
include 'samples:irs-demo:web'
include 'samples:simm-valuation-demo'
include 'samples:simm-valuation-demo:flows'
include 'samples:simm-valuation-demo:contracts-states'
include 'samples:notary-demo'
include 'samples:notary-demo:contracts'
include 'samples:notary-demo:workflows'
include 'samples:bank-of-corda-demo'
include 'samples:cordapp-configuration'
include 'samples:network-verifier'
include 'samples:cordapp-configuration:workflows'
include 'samples:network-verifier:contracts'
include 'samples:network-verifier:workflows'
include 'serialization'
// Common libraries - start