创建本地节点

节点结构

每个 Corda 节点会包含以下的结构:

.
├── certificates            // 节点的证书
├── corda-webserver.jar     // 内置的节点 webserver
├── corda.jar               // Corda 核心类库
├── logs                    // 节点 logs
├── node.conf               // 节点的配置文件
├── persistence.mv.db       // 节点的数据库
└── plugins                 // 节点上安装的 CorDapps jar 文件

可以通过编辑 node.conf 文件来配置节点。你可以通过将 CorDapp JARs 放到 cordapps 文件夹的方式来在节点上安装一个 CorDapp。

在开发模式中(当 devMode = true,查看 节点配置 获取更多信息),如果需要的 keystores 不存在的话,certificates 路径里会被放进一个预先配置好的 keystores。这个确保了开发者能够尽快地让节点工作起来。但是这个预先配置好的 keystores 并不是安全的。

节点的命名

一个节点的名字必须是一个有效的 X.500 可区分的名字。为了同其他的实现方法兼容(特别是 TLS 实现),我们约束了允许使用的 X.500 的属性类型为最小被支持的 X.509 证书集合的一个子集(在 RFC 3280 中指定的),外加下边的本地属性:

State 应该避免使用除非是为了跟国家级别其他的相同的或者类似名字的 localities 加以区分。比如,伦敦(GB)就不需要一个 state,但是 St Ives 需要(这里有两个,一个是在 Cornwall,一个是在 Cambridgeshire)。因为在 Corda 中 legal entities 可能都是在主要城市中,这个属性不被期望体现在主要的名字里,但是在需要的时候可以做为一个可选项。

命名还必须要遵守下边的约束:

Cordform 任务

Corda 提供了一个叫做 Cordform 的 gradle plugin,它允许你自动地生成和配置一套节点的信息。下边是一个叫做 deployNodesCordform 任务,它在 Kotlin CorDapp Template 项目中创建了 3 个节点:

task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
    directory "./build/nodes"
    node {
        name "O=Notary,L=London,C=GB"
        // The notary will offer a validating notary service.
        notary = [validating : true]
        p2pPort  10002
        rpcSettings {
            port 10003
            adminPort 10023
        }
        // No webport property, so no webserver will be created.
        h2Port   10004
        // Includes the corda-finance CorDapp on our node.
        cordapps = ["net.corda:corda-finance:$corda_release_version"]
    }
    node {
        name "O=PartyA,L=London,C=GB"
        p2pPort  10005
        rpcSettings {
            port 10006
            adminPort 10026
        }
        webPort  10007
        h2Port   10008
        cordapps = ["net.corda:corda-finance:$corda_release_version"]
        // Grants user1 all RPC permissions.
        rpcUsers = [[ user: "user1", "password": "test", "permissions": ["ALL"]]]
    }
    node {
        name "O=PartyB,L=New York,C=US"
        p2pPort  10009
        rpcSettings {
            port 10010
            adminPort 10030
        }
        webPort  10011
        h2Port   10012
        cordapps = ["net.corda:corda-finance:$corda_release_version"]
        // Grants user1 the ability to start the MyFlow flow.
        rpcUsers = [[ user: "user1", "password": "test", "permissions": ["StartFlow.net.corda.flows.MyFlow"]]]
    }
}

运行这个任务会在 build/nodes 文件夹下创建 3 个节点:

另外,所有的三个节点都会包含任何在项目的 source 文件夹中定义的任何 CorDapp,即使这些 CorDapps 没有被列在每个节点的 cordapps entry。这就意味着在 template CorDapp 中运行这个 deployNodes 任务会自动 build 并将这个 template CorDapp 添加到每个节点中。

你可以扩展这个 deployNodes 来生成更多的节点。

注意:当添加节点的时候,要确保没有端口冲突!

运行 deployNodes

为了创建在 deployNodes 任务中定义的节点,在项目的根目录下,在终端窗口中运行下边的命令:

这会在 build/nodes 文件夹下创建节点。这里会为 depployNodes 任务中定义的每一个节点创建一个文件夹,和一个 runnodes 的 shell 脚本(在 Windows 中是 batch 文件)来同时运行所有的节点达到测试和开发的目的。如果你对你的 CorDapp source 或者 deployNodes 任务做了任何修改,你需要重新运行这个任务来使修改生效。

接下来你就可以按照 运行一个本地节点 中的指导来运行你的节点了。