diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 6582fe405d..0000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Contributing to Corda
-
-To start contributing you can fork our repo and begin making pull requests. Please use
-descriptive commit messages and follow our [coding style guidelines](https://docs.corda.net/codestyle.html).
-
-## Community Locations
-
-* [GitHub](https://github.com/corda/corda)
-* [Forums](https://discourse.corda.net)
-* [Chat](https://slack.corda.net)
-
-## Developer Certificate of Origin
-
-All contributions to this project are subject to the terms of the Developer Certificate of Origin, below:
-
-Developer Certificate of Origin
-Version 1.1
-
-Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
-1 Letterman Drive
-Suite D4700
-San Francisco, CA, 94129
-
-Everyone is permitted to copy and distribute verbatim copies of this
-license document, but changing it is not allowed.
-
-
-Developer's Certificate of Origin 1.1
-
-By making a contribution to this project, I certify that:
-
-(a) The contribution was created in whole or in part by me and I
- have the right to submit it under the open source license
- indicated in the file; or
-
-(b) The contribution is based upon previous work that, to the best
- of my knowledge, is covered under an appropriate open source
- license and I have the right under that license to submit that
- work with modifications, whether created in whole or in part
- by me, under the same open source license (unless I am
- permitted to submit under a different license), as indicated
- in the file; or
-
-(c) The contribution was provided directly to me by some other
- person who certified (a), (b) or (c) and I have not modified
- it.
-
-(d) I understand and agree that this project and the contribution
- are public and that a record of the contribution (including all
- personal information I submit with it, including my sign-off) is
- maintained indefinitely and may be redistributed consistent with
- this project or the open source license(s) involved.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index c00e9f20ba..0000000000
--- a/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
- Copyright 2016 - 2017, R3 Limited.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/README.md b/README.md
index d490c71ae2..790b967bb5 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,14 @@
![Corda](https://www.corda.net/wp-content/uploads/2016/11/fg005_corda_b.png)
-
+# Corda Enterprise
-# Corda
+Corda Enterprise is R3's closed source patch set on top of Corda Open Source. It adds features and improvements that we
+plan to charge for.
-Corda is a decentralised database system in which nodes trust each other as little as possible.
+## Extra features
-## Features
-
-* A P2P network of nodes
-* Smart contracts
-* Flow framework
-* "Notary" infrastructure to validate uniqueness of transactions
-* Written as a platform for distributed apps called CorDapps
-* Written in [Kotlin](https://kotlinlang.org), targeting the JVM
-
-## Getting started
-
-Firstly, read the [Getting started](https://docs.corda.net/getting-set-up.html) documentation.
-
-Next, use the following guides to set up your dev environment:
-
-* If you are on **Windows** [use this getting started guide](https://www.corda.net/wp-content/uploads/2017/01/Corda-Windows-Quick-start-guide-1.pdf) which also explains through how to run the sample apps.
-
-* Alternatively if you are on **Mac/Linux**, [watch this brief Webinar](https://vimeo.com/200167665) which walks through getting Corda, installing it, building it, running nodes and opening projects in IntelliJ.
-
-After the above, watching the following webinars will give you a great introduction to Corda:
-
-### Webinar 1 – [Introduction to Corda](https://vimeo.com/192757743/c2ec39c1e1)
-
-Richard Brown, R3 Chief Technology Officer, explains Corda's unique architecture, the only distributed ledger platform designed by and for the financial industry's unique requirements. You may want to read the [Corda non-technical whitepaper](https://www.r3cev.com/s/corda-introductory-whitepaper-final.pdf) as pre-reading for this session.
-
-### Webinar 2 – [Corda Developers’ Tutorial](https://vimeo.com/192797322/aab499b152)
-
-Roger Willis, R3 Developer Relations Lead, provides an overview of Corda from a developer’s perspective and guidance on how to start building CorDapps. You may want to view [Webinar 1 - Introduction to Corda](https://vimeo.com/192757743/c2ec39c1e1) as preparation for this session. **NB. This was recorded for the M5 release.**
-
-## Building on Corda
-
-To build your own CorDapps:
-
-1. Clone the [CorDapp Template repository](https://github.com/corda/cordapp-template)
-2. Read the [README](https://github.com/corda/cordapp-template/blob/master/README.md) (**IMPORTANT!**)
-3. Read the [Writing a CorDapp](https://docs.corda.net/tutorial-cordapp.html) documentation
-
-To look at the Corda source and run some sample applications:
-
-1. Clone this repository
-2. To run some sample CorDapps, read the [running the demos documentation](https://docs.corda.r3cev.com/running-the-demos.html)
-3. Start hacking and [contribute](./CONTRIBUTING.md)!
-
-## Useful links
-
-* [Project website](https://corda.net)
-* [Documentation](https://docs.corda.net)
-* [Slack channel](https://slack.corda.net/)
-* [Forum](https://discourse.corda.net)
-* [Meetups](https://www.meetup.com/pro/corda/)
-* [Training Course](https://www.corda.net/corda-training/)
-
-
-## Development State
-
-Corda is under active development and is maturing rapidly. We are targeting
-production-readiness in 2017. The API will continue to evolve throughout 2017;
-backwards compatibility not assured until version 1.0.
-
-Pull requests, experiments, and contributions are encouraged and welcomed.
-
-## Background
-
-The project is supported by R3, a financial industry consortium, which is why it
-contains some code for financial use cases and why the documentation focuses on finance. The goal is to use it
-to construct a global ledger, simplifying finance and reducing the overheads of banking. But it is run as
-an open source project and the basic technology of a peer-to-peer decentralised database may be useful
-for many different projects.
-
-## Contributing
-
-Please read [here](./CONTRIBUTING.md).
-
-## License
-
-[Apache 2.0](./LICENSE)
-
-## Acknowledgements
-
-![YourKit](https://www.yourkit.com/images/yklogo.png)
-
-YourKit supports open source projects with its full-featured Java Profiler.
-
-YourKit, LLC is the creator of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/) and [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/), innovative and intelligent tools for profiling Java and .NET applications.
+* Doorman
+* SOCKS relaying
+* Flow triage screen in Explorer
+* No stupid jokes at startup
+* SGX
diff --git a/TRADEMARK b/TRADEMARK
deleted file mode 100644
index aa2799e5d3..0000000000
--- a/TRADEMARK
+++ /dev/null
@@ -1,4 +0,0 @@
-Corda and the Corda logo are trademarks of R3 HoldCo LLC and its affiliates.
-All rights reserved.
-
-For R3 HoldCo LLC's trademark and logo usage information, please consult our Trademark Usage Policy available at https://www.r3.com/trademark-policy
diff --git a/build.gradle b/build.gradle
index 4904203fc2..51ab3d5f0e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -122,7 +122,7 @@ allprojects {
attributes('Corda-Release-Version': corda_release_version)
attributes('Corda-Platform-Version': corda_platform_version)
attributes('Corda-Revision': corda_revision)
- attributes('Corda-Vendor': 'Corda Open Source')
+ attributes('Corda-Vendor': 'Corda Enterprise Edition')
}
}
@@ -131,7 +131,7 @@ allprojects {
systemProperties['java.io.tmpdir'] = buildDir
}
- group 'net.corda'
+ group 'com.r3.corda.enterprise'
version "$corda_release_version"
repositories {
@@ -239,9 +239,10 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
}
}
+// User and key are commented out to prevent accidental pushes of Enterprise to public repos. DO NOT UNCOMMENT.
bintrayConfig {
- user = System.getenv('CORDA_BINTRAY_USER')
- key = System.getenv('CORDA_BINTRAY_KEY')
+ // user = System.getenv('CORDA_BINTRAY_USER')
+ // key = System.getenv('CORDA_BINTRAY_KEY')
repo = 'corda'
org = 'r3'
licenses = ['Apache-2.0']
diff --git a/node/capsule/build.gradle b/node/capsule/build.gradle
index fac1f538f5..63ba6e529e 100644
--- a/node/capsule/build.gradle
+++ b/node/capsule/build.gradle
@@ -6,7 +6,7 @@ apply plugin: 'net.corda.plugins.publish-utils'
apply plugin: 'us.kirchmeier.capsule'
apply plugin: 'com.jfrog.artifactory'
-description 'Corda standalone node'
+description 'Corda Enterprise'
configurations {
runtimeArtifacts.extendsFrom runtime
@@ -22,7 +22,7 @@ targetCompatibility = 1.6
task buildCordaJAR(type: FatCapsule, dependsOn: project(':node').compileJava) {
applicationClass 'net.corda.node.Corda'
- archiveName "corda-${corda_release_version}.jar"
+ archiveName "corda-enterprise-${corda_release_version}.jar"
applicationSource = files(
project(':node').configurations.runtime,
project(':node').jar,
@@ -40,7 +40,7 @@ task buildCordaJAR(type: FatCapsule, dependsOn: project(':node').compileJava) {
// def quasarExcludeExpression = "x(rx**;io**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;javassist**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.h2**;org.crsh**;org.fusesource**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.xml**;org.jcp**;org.jetbrains**;org.yaml**;co.paralleluniverse**;net.i2p**)"
// javaAgents = ["quasar-core-${quasar_version}-jdk8.jar=${quasarExcludeExpression}"]
javaAgents = ["quasar-core-${quasar_version}-jdk8.jar"]
- systemProperties['visualvm.display.name'] = 'Corda'
+ systemProperties['visualvm.display.name'] = 'CordaEnterprise'
minJavaVersion = '1.8.0'
minUpdateVersion['1.8'] = java8_minUpdateVersion
caplets = ['CordaCaplet']
diff --git a/node/src/main/kotlin/net/corda/node/Corda.kt b/node/src/main/kotlin/net/corda/node/Corda.kt
index 8cbc20e00e..e1c743cadb 100644
--- a/node/src/main/kotlin/net/corda/node/Corda.kt
+++ b/node/src/main/kotlin/net/corda/node/Corda.kt
@@ -2,11 +2,11 @@
package net.corda.node
-import net.corda.node.internal.NodeStartup
+import net.corda.node.internal.EnterpriseNode
fun main(args: Array) {
// Pass the arguments to the Node factory. In the Enterprise edition, this line is modified to point to a subclass.
// It will exit the process in case of startup failure and is not intended to be used by embedders. If you want
// to embed Node in your own container, instantiate it directly and set up the configuration objects yourself.
- NodeStartup(args).run()
+ EnterpriseNode.Startup(args).run()
}
diff --git a/node/src/main/kotlin/net/corda/node/internal/EnterpriseNode.kt b/node/src/main/kotlin/net/corda/node/internal/EnterpriseNode.kt
new file mode 100644
index 0000000000..cfe0682a77
--- /dev/null
+++ b/node/src/main/kotlin/net/corda/node/internal/EnterpriseNode.kt
@@ -0,0 +1,106 @@
+package net.corda.node.internal
+
+import com.jcraft.jsch.JSch
+import com.jcraft.jsch.JSchException
+import net.corda.core.node.services.ServiceInfo
+import net.corda.core.utilities.Emoji
+import net.corda.core.utilities.loggerFor
+import net.corda.node.VersionInfo
+import net.corda.node.services.config.FullNodeConfiguration
+import net.corda.node.services.config.RelayConfiguration
+import org.fusesource.jansi.Ansi
+import org.fusesource.jansi.AnsiConsole
+import java.io.IOException
+
+class EnterpriseNode(configuration: FullNodeConfiguration, advertisedServices: Set,
+ versionInfo: VersionInfo) : Node(configuration, advertisedServices, versionInfo) {
+ companion object {
+ private val logger by lazy { loggerFor() }
+ }
+
+ class Startup(args: Array) : NodeStartup(args) {
+ override fun preNetworkRegistration(conf: FullNodeConfiguration) {
+ super.preNetworkRegistration(conf)
+ conf.relay?.let { connectToRelay(it, conf.p2pAddress.port) }
+ }
+
+ override fun drawBanner(versionInfo: VersionInfo) {
+ // This line makes sure ANSI escapes work on Windows, where they aren't supported out of the box.
+ AnsiConsole.systemInstall()
+
+ val logo = """
+R ______ __ B
+R / ____/ _________/ /___ _ B_______ __ _ _______ _______ ______ _____ ______ _____ _______ _______
+R / / __ / ___/ __ / __ `/ B|______ | \ | | |______ |_____/ |_____] |_____/ | |______ |______
+R/ /___ /_/ / / / /_/ / /_/ / B|______ | \_| | |______ | \_ | | \_ __|__ ______| |______
+R\____/ /_/ \__,_/\__,_/ W____________________________________________________________________________
+D""".trimStart()
+
+ // Now replace the R, B and W letters with their colour code escapes to make the banner prettier.
+ if (Ansi.isEnabled()) {
+ val red = Ansi.ansi().fgBrightRed().toString()
+ val blue = Ansi.ansi().fgBrightBlue().toString()
+ val white = Ansi.ansi().reset().fgBrightDefault().toString()
+ val default = Ansi.ansi().reset().toString()
+ val colourLogo = logo.replace("R", red).replace("B", blue).replace("W", white).replace("D", default)
+ val banner =
+ colourLogo +
+ System.lineSeparator() +
+ (
+ if (Emoji.hasEmojiTerminal)
+ "${Emoji.CODE_LIGHTBULB} "
+ else
+ "Tip: "
+ ) +
+ Ansi.ansi().bold().a(tip).reset() +
+ System.lineSeparator()
+
+ println(banner)
+ } else {
+ println(logo.replace("R", "").replace("B", "").replace("W", "").replace("D", ""))
+ }
+ }
+
+ private val tip: String get() {
+ val tips = javaClass.getResourceAsStream("tips.txt").bufferedReader().use { it.readLines() }
+ return tips[(Math.random() * tips.size).toInt()]
+ }
+
+ override fun createNode(conf: FullNodeConfiguration, versionInfo: VersionInfo, services: Set) = EnterpriseNode(conf, services, versionInfo)
+
+ private fun connectToRelay(config: RelayConfiguration, localBrokerPort: Int) {
+ with(config) {
+ val jsh = JSch().apply {
+ val noPassphrase = byteArrayOf()
+ addIdentity(privateKeyFile.toString(), publicKeyFile.toString(), noPassphrase)
+ }
+
+ val session = jsh.getSession(username, relayHost, sshPort).apply {
+ // We don't check the host fingerprints because they may change often, and we are only relaying
+ // data encrypted under TLS anyway: the relay box is NOT considered trusted. A compromised relay
+ // box could observe packet sizes and timings, but the sort of attackers who might be able to
+ // use such information have mostly compromised the network backbone already anyway. So this makes
+ // setup more robust without changing security much.
+ setConfig("StrictHostKeyChecking", "no")
+ }
+
+ try {
+ logger.info("Connecting to a relay at $relayHost")
+ session.connect()
+ } catch (e: JSchException) {
+ throw IOException("Unable to establish a SSH connection: $username@$relayHost", e)
+ }
+ try {
+ val localhost = "127.0.0.1"
+ logger.info("Forwarding ports: $relayHost:$remoteInboundPort -> $localhost:$localBrokerPort")
+ session.setPortForwardingR(remoteInboundPort, localhost, localBrokerPort)
+ } catch (e: JSchException) {
+ throw IOException("Unable to set up port forwarding - is SSH on the remote host configured correctly? " +
+ "(port forwarding is not enabled by default)", e)
+ }
+ }
+
+ logger.info("Relay setup successfully!")
+ }
+ }
+}
\ No newline at end of file
diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt
index 6e210f3c70..5fe737ea35 100644
--- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt
+++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt
@@ -73,8 +73,6 @@ open class NodeStartup(val args: Array) {
Node.printBasicNodeInfo(LOGS_CAN_BE_FOUND_IN_STRING, System.getProperty("log-path"))
val conf = loadConfigFile(cmdlineOptions)
banJavaSerialisation(conf)
- // TODO: Move this to EnterpriseNode.Startup
- conf.relay?.let { connectToRelay(it, conf.p2pAddress.port) }
preNetworkRegistration(conf)
maybeRegisterWithNetworkAndExit(cmdlineOptions, conf)
logStartupInfo(versionInfo, cmdlineOptions, conf)
@@ -327,35 +325,4 @@ open class NodeStartup(val args: Array) {
reset())
}
}
-
- private fun connectToRelay(config: RelayConfiguration, localBrokerPort: Int) {
- with(config) {
- val jsh = JSch().apply {
- val noPassphrase = byteArrayOf()
- addIdentity(privateKeyFile.toString(), publicKeyFile.toString(), noPassphrase)
- }
-
- val session = jsh.getSession(username, relayHost, sshPort).apply {
- // We don't check the host fingerprints because they may change often
- setConfig("StrictHostKeyChecking", "no")
- }
-
- try {
- logger.info("Connecting to a relay at $relayHost")
- session.connect()
- } catch (e: JSchException) {
- throw IOException("Unable to establish a SSH connection: $username@$relayHost", e)
- }
- try {
- val localhost = "127.0.0.1"
- logger.info("Forwarding ports: $relayHost:$remoteInboundPort -> $localhost:$localBrokerPort")
- session.setPortForwardingR(remoteInboundPort, localhost, localBrokerPort)
- } catch (e: JSchException) {
- throw IOException("Unable to set up port forwarding - is SSH on the remote host configured correctly? " +
- "(port forwarding is not enabled by default)", e)
- }
- }
-
- logger.info("Relay setup successfully!")
- }
}
\ No newline at end of file
diff --git a/node/src/main/resources/net/corda/node/internal/tips.txt b/node/src/main/resources/net/corda/node/internal/tips.txt
new file mode 100644
index 0000000000..de5e2d73f5
--- /dev/null
+++ b/node/src/main/resources/net/corda/node/internal/tips.txt
@@ -0,0 +1,6 @@
+You can issue SQL queries to the database from the Corda shell with the jdbc command
+The config file format supports many useful features: https://github.com/typesafehub/config#using-hocon-the-json-superset
+You can chat to the Corda team using Slack: https://slack.corda.net/
+Administrator users can be granted access to do everything by granting them the ALL permission
+If you don't wish to use the shell it can be disabled with the --no-local-shell flag
+Use the "flow watch" shell command to see what flows your node is running
\ No newline at end of file