配置节点

文件路径

Corda 的 corda.jar 文件是由 gradle buildCordaJAR 任务生成的,而且默认的它会从工作路径下的 node.conf 中读取配置信息。这个行为可以使用 –config-file 这个命令行参数来重写,把它变为一个不同的路径或者文件名(相对路径是针对当前工作路径)。并且 –base-directory 命令行参数修改了 Corda 的工作路径,如果指定了这个值的话,工作路径的根目下需要有一个 node.conf 配置文件。

gradle deployNodes 任务所使用的配置文件模板可以在 /confg/dev 文件夹下找到。同样需要注意的是,这里有一些来自于 :node gradle module 的内置 resource 文件 /node/src/main/resources/reference.conf 中的一系列基本的默认值。这里所有的属性都可以在配置文件中重写,而对于很少会改动的属性,这个默认项允许将这些属性从配置文件中移除。

格式

Corda 配置文件使用 HOCON 格式,它是 JSON 的 superset。它有一些特性对于配置文件的格式有很多好处。浏览他们的网站了解更多。

例子

IRSDemo services 的主要节点配置文件内容如下:

myLegalName : "O=Bank A,L=London,C=GB"
keyStorePassword : "cordacadevpass"
trustStorePassword : "trustpass"
dataSourceProperties : {
    dataSourceClassName : org.h2.jdbcx.JdbcDataSource
    "dataSource.url" : "jdbc:h2:file:"${baseDirectory}"/persistence"
    "dataSource.user" : sa
    "dataSource.password" : ""
}
p2pAddress : "my-corda-node:10002"
rpcAddress : "my-corda-node:10003"
webAddress : "localhost:10004"
extraAdvertisedServiceIds : [ "corda.interest_rates" ]
networkMapService : {
    address : "my-network-map:10000"
    legalName : "O=Network Map Service,OU=corda,L=London,C=GB"
}
useHTTPS : false
rpcUsers : [
    { username=user1, password=letmein, permissions=[ StartProtocol.net.corda.protocols.CashProtocol ] }
]
devMode : true
// Certificate signing service will be hosted by R3 in the near future.
//certificateSigningService : "https://testnet.certificate.corda.net"

NetworkMapService 和 Simple Notary 配置文件。

myLegalName : "O=Notary Service,OU=corda,L=London,C=GB"
keyStorePassword : "cordacadevpass"
trustStorePassword : "trustpass"
p2pAddress : "localhost:12345"
rpcAddress : "localhost:12346"
webAddress : "localhost:12347"
extraAdvertisedServiceIds : ["corda.notary.simple"]
useHTTPS : false
devMode : true
// Certificate signing service will be hosted by R3 in the near future.
//certificateSigningService : "https://testnet.certificate.corda.net"

字段

可用的配置字段如下。baseDirectory 可作为一个可替换的值,包含了对于节点的根目录的绝对路径。

  • myLegalName:节点的法律标识(legal identity),作为针对节点公钥(public key)的可被人们阅读的别名,很多 demos 使用它来查找 NodeInfo。
  • keyStorePassword:解锁 KeyStore 文件(<workspace>/certificates/sslkeystore.jks)的密码,KeyStore 文件中包含了节点的证书(certificate)和私钥(private key)。
    注意:这个非安全的值是用于开发目的的,在节点第一次运行的时候自动生成。长期来说,这些秘钥应该在安全硬件设备(secure hardware devices)中进行管理。
  • trustStorePassword:解锁 Trust store 文件(<workspace>/certificates/truststore.jks)的密码,Trust store 文件包含了 Corda 网络的根证书(root certificate)。
    注意:这个非安全的值是用于开发目的的,在节点第一次运行的时候自动生成。长期来说,这些秘钥应该在安全硬件设备(secure hardware devices)中进行管理。
  • dataSourceProperties:这部分是用来配置 JDBC 连接和数据库驱动的,用来对节点数据进行持久化处理。第一段例子代码中使用的就是在 /node/src/main/resources/reference.conf 中的默认值。这是当前唯一的被测试过的配置,尽管在将来会完全支持其他的存储层。
  • messagingServerAddress:ArtemisMA broker 实例的地址。如果没有指定的话,节点会在本地运行一个。
  • p2pAddress:通过 ArtemisMQ 对节点进行协议操作时的可用的主机(host)和端口号
    注意:常规来说,ArtemisMQ 消息服务会绑定到所有的本地地址的指定的端口号。但是,要注意的是主机(host)会在 NetworkMapService 中作为 advertised entry 被包含进来。所以当在机器集群上运行节点的时候,这里所列出的值都应该是可以被外边访问的。如果这个提供的 host 无法访问,节点会尝试自动发现它的共有 host。
  • rpcAddress:RPC 系统的地址,RPC 请求可以通过它来发送给节点。如果没有指定的话,节点就会不使用 RPC 并运行。
  • webAddress:如果 webserver 启动起来的话,它会监听的主机(host)和端口号(port)。这个不是节点自己用的。
    注意:如果 HTTPS 被启用了的话,浏览器的安全检查会要求访问的 url 主机名必须或者是机器名字,fully qualified 机器名字或者跟在开发证书(development certificates)中包含的 Subject Alternative Names 一直的 server IP 地址。这个也是额外地要求 /config/dev/corda_dev_ca.cer 这个根证书需要作为一个 Trusted CA 被安装。
    注意:驱动不会自动创建一个 webserver 实例,但是 Cordformation 会。如果这个字段被指定了的话,web server 就会被启动。
  • extraAdvertisedServiceIds:一个要发送给 NetworkMapService 的 ServiceType id 字符串列表,当其他节点向 NetworkMapCache 查询支持节点的时候就可以被找到。这个也包括从 plugins 文件夹下的 .jar 文件所加载的 plugin services。你可以选择通过在 service type id:“corda.notary.validating|Notary A” 后边附加一个自定义的 service name。
  • notaryNodeAddress:绑定到的内置的 Raft server 的主机名(host)和端口号(port)。这个仅仅在使用分布式的 notary service(即多个 notary service) 的时候是必须的。一组 Corda 节点可以组成一个分布式的 notary service,每个节点会运行一个内置的 Raft server,并将他们整合到同一个集群来复制提交上来的 state log。注意:Raft 集群使用一个单独的传输层来进行沟通,这个并没有和 ArtemisMQ 消息服务集成。
  • notaryClusterAddress:是一个用来加入一个 Raft 集群的成员地址列表。至少要有一个指定的成员必须是 active 的并且能够跟集群的 leader 进行沟通。如果这个列表是空的话,一个新的集群就会被启动。仅仅当运行一个分布式的 notary service 的时候才需要这个。
  • networkMapService:如果是 null 或者没有设置,那么节点就会将自己设置为 NetworkMapService 主机。否则的话这个会是一个包含 network map service 详细信息的配置项:
    • address:运行 network map 节点的 ArtemisMQ broker 主机名(host)和端口号(port)
    • legalName:节点的 legal name。这个对于 TLS host 认证流程的一部分是必须要有的。如果一个节点提供了一个跟这个值不匹配的 TLS 常用名(common name)的话,那么这个节点是会被拒绝连接到 network map service 的。
  • minimumPlatformVersion:当一个运行着 network map service 的节点对于新的注册请求有最小版本要求的时候,可以用这个值来设置一个最小版本号。任何一个平台版本(Platform Version)小于该版本号的节点的请求都会被拒绝。如果没有指定的话,会使用 1 作为最小版本号。
  • useHTTPS:如果设置为 false,节点的 web server 会使用 plain HTTP。如果设置为 true,节点会跟 ArtemisMQ 的 HTTPS 端口号一样,是用跟 <workspace>/certificates/sslkeystore.jks 文件中定义的相同的证书和私钥。如果 HTTPS 被使用的话,那么没有被加密的访问节点的 webAddress 端口的 HTTP 请求是不会被支持的。
  • rpcUsers:一个有权限访问 RPC 系统的用户列表。列表中的每个用户都是一个包含下列字段的配置对象:
    • username:用户名只能包含英文字母(a-z,A-Z,0-9 和 _)
    • password: 密码
    • permissions:一个通过 RPC 可以启动的 flows 的权限列表。为了给一个用户能够启动 foo.bar.FlowClass 这个 flow 的权限,需要将字符串 StartFlow.foo.bar.FlowClass 加到列表中。如果列表包含了字符串 ALL,用户就可以通过 RPC 启动任何的 flow。这个值主要是针对于 administrator 用户以及部署时候使用。
  • devMode:这个标志设定了节点是否是在开发模式下运行。在节点启动的时候,如果 <workspace>/certificates/sslkeystore.jks 的 keystore 文件不存在的话,如果 devMode 是 true 的话,那么一个开发者 keystore 会被使用。如果 devMode 设置为 false 并且 keystore 不存在的话,那么节点就会退出。 devMode 同样也会打开后台对 flow checkpoints 的检查,来找到在 checkpointing 流程中存在的 bugs。
  • detectPublicIp:这个标志值开启/关闭了是否自动发现 IP 的功能,默认是开启的。当节点启动的时候,它会尝试通过在它的网络接口上查找公用地址的方式去发现自己的外部可见的 IP 地址,然后会向 network map service 发送一个 IP 发现请求。将它设置为 false 会关闭这个功能。
  • certificateSigningService:Certificate Signing Server 地址。这个会被 certificate signing request utility 使用,来获得 SSL 证书。