网络启动器

原文链接 https://docs.corda.net/network-bootstrapper.html

测试部署 Test deployments

一个 Corda 网络中的所有节点能够看到彼此,都是因为使用了网络地图(network map)。这是一个由静态的被签过名的 node-info 文件所组成的一个集合,集合中的每个文件都是针对于一个节点的(即每个节点都使用自己的密钥对自己的 node-info 文件进行了加密)。大多数的生产环境的部署都会通过 HTTP 使用一个高可用的,安全的分布式的网络地图。

对于非生产环境的部署,通常所有的节点都会被放在同一个文件系统中(至少最开始的时候),这些 node-info 文件可以直接被放置在节点的 additional-node-infos 路径下,节点会从那里提取出所有节点的信息然后将他们存储在它本地的网络地图缓存(network map cache)中。节点本身会在它第一次启动的时候生成它自己的 node-info 文件。

除了网络地图外,所有的节点还必须使用相同的一套网络参数(network parameters)。这些是一套约束,用来保证节点间的互通性(interoperability)。HTTP 网络地图将网络参数分发出去,这样每个节点都可以自动下载。当没有这些的时候,这个网络参数必须要在本地生成。

由于这些原因,非生产环境的部署可以使用网络启动器(network bootstrapper)来让它们自己变为可用。这是一个工具,它可以从一个常规的路径下扫描所有的节点配置信息,然后生成网络参数文件,然后会将这些文件拷贝给所有节点的路径下边。它同样也会拷贝每个节点的 node-info 文件到每一个其他节点中,所以这些节点才能够彼此看到对方。

启动一个测试网络

Corda 网络启动器可以从这里下载

创建一个目录,为每一个你想要创建的节点添加一个节点配置文件,文件名以 “_node.conf” 结尾。然后运行下边的命令: java -jar network-bootstrapper-VERSION.jar --dir <nodes-root-dir>

比如在一个包含这些文件的路径下运行这个命令:

.
├── notary_node.conf             // The notary's node.conf file
├── partya_node.conf             // Party A's node.conf file
└── partyb_node.conf             // Party B's node.conf file

将会生成包含三个节点的路径:notarypartyapartyb。他们每个都会使用启动器所带的 corda.jar 文件。如果需要一个不同版本的 Corad 的话,只需要将指定版本的 corda.jar 文件同配置文件一起放置在相同的路径下。

你也可以让节点事先在他们各自的路径下包含他们的 “node.conf”,就像下边这样:

.
├── notary
│   └── node.conf
├── partya
│   └── node.conf
└── partyb
    └── node.conf

类似的,每个节点路径下可能也会包含它们自己的 corda.jar,启动器(bootstrapper)将会使用该 corda.jar 而非自带的。

将 CorDapps 提供给网络启动器

如果你希望网络启动器能够在每个生成的节点中包含你的 CorDapps 的话,只需要把你的 CorDapps 放在跟配置文件相同的地方。比如,如果你的路径含有下边的结构:

.
├── notary_node.conf            // The notary's node.conf file
├── partya_node.conf            // Party A's node.conf file
├── partyb_node.conf            // Party B's node.conf file
├── cordapp-a.jar               // A cordapp to be installed on all nodes
└── cordapp-b.jar               // Another cordapp to be installed on all nodes

cordapp-a.jarcordapp-b.jar 将会被安装在每个节点的路径下,他们其中包含的所有的合约(contracts)也会被添加到合约白名单(Contract Whitelist)中。

合约白名单

在启动一个网络的时候所提供的任何 CorDapps 将会因为合约而被扫描,这将被用来创建该网络的区域白名单(Zone Whitelist)。

如果只是想将 CorDapps 加入白名单中而不需要将它们拷贝到每个节点的话,那么需要在运行的命令中加上 --no-copy 标识

CorDapp JARs 将会为了 Contract 类而被 Hash 和扫描。这些合约类的实现将会变为网络参数中的被加入白名单的合约的一部分。

启动器默认地会将所有在 CorDapp JARs 中找到的合约加入到白名单中。如果不想将一些特定的合约加入进去的话,将他们完整的满足条件的类名加入到 exclude_whitelist.txt 中。这些将会使用更加严格的 HashAttachmentConstraint。比如:

net.corda.finance.contracts.asset.Cash
net.corda.finance.contracts.asset.CommercialPaper

修改一个已启动的网络

为了开发及测试的目的,网络启动器作为一个开发工具被提供用来设置 Corda 网络。对于修改一个网络来说,会有一些功能上的限制,如果你需要更复杂的操作的话,请考虑使用网络地图服务器(Network Map server)。

当运行网络启动器的时候,每个 node-info 文件需要被搜集到一个统一的路径下。如果节点是在不同的机器上运行的话,你需要进行一下的操作:

如果一个已经存在的节点更新它的 node-info 中的信息后(比如他们的 P2P 地址),网络启动器不能动态地将该变化更新到该网络中。这样的话,这个新的 node-info 文件需要被放到其他节点的 additional-node-infos 路径下。如果节点是放置在不同的机器上的话,那么可以使用一个 utility 工具(比如 rsync),这样节点间就可以共享 node-infos 了。

向网络中添加一个新的节点

在同一个网络中再次运行启动器的话,将会允许一个新的节点被添加进来,并且它的 node-info 将会被分布更新到已经存在的节点中。

比如,如果我们有一个已经启动好的网络,这个网络中包含 Notary 和 PartyA,然后我们想将 PartyB 加进来的话,我们可以在下边的网络结构中使用网络启动器:

.
├── notary                      // existing node directories
│   ├── node.conf
│   ├── network-parameters
│   ├── node-info-notary
│   └── additional-node-infos
│       ├── node-info-notary
│       └── node-info-partya
├── partya
│   ├── node.conf
│   ├── network-parameters
│   ├── node-info-partya
│   └── additional-node-infos
│       ├── node-info-notary
│       └── node-info-partya
└── partyb_node.conf            // the node.conf for the node to be added

然后在根目录下再次运行网络启动器: java -jar network-bootstrapper-VERSION.jar --dir <nodes-root-dir>

这会生成下边的新结构:

.
├── notary                      // the contents of the existing nodes (keys, db's etc...) are unchanged
│   ├── node.conf
│   ├── network-parameters
│   ├── node-info-notary
│   └── additional-node-infos
│       ├── node-info-notary
│       ├── node-info-partya
│       └── node-info-partyb
├── partya
│   ├── node.conf
│   ├── network-parameters
│   ├── node-info-partya
│   └── additional-node-infos
│       ├── node-info-notary
│       ├── node-info-partya
│       └── node-info-partyb
└── partyb                      // a new node directory is created for PartyB
    ├── node.conf
    ├── network-parameters
    ├── node-info-partyb
    └── additional-node-infos
        ├── node-info-notary
        ├── node-info-partya
        └── node-info-partyb

启动器会生成一个新的路径并包含 PartyB 的 node-info 文件,同时也会确保每个节点的 node-info 文件会被放在各个节点的 additional-node-info 路径下。已经存在的节点下的其他任何文件不会受影响。

启动器是针对非生产环境部署而提供的,它仅仅能够对同一台机器上搜集到的节点生成配置信息。如果一个已经部署好的网络想要使用启动器来更新新节点信息的话,所有节点都需要被拿回到同一台机器上来进行更新。

在一个已启动的网络中更新合约白名单

如果一个网络已经定义好了一套网络参数的话(比如在所有节点的某个节点路径下包含相同的网络参数文件),那么启动器可以用来向当前的白名单中添加来自于新的 CorDapps 的合约。比如,在下边的预先生成的网络中:

.
├── notary
│   ├── node.conf
│   ├── network-parameters
│   └── cordapps
│       └── cordapp-a.jar
├── partya
│   ├── node.conf
│   ├── network-parameters
│   └── cordapps
│       └── cordapp-a.jar
├── partyb
│   ├── node.conf
│   ├── network-parameters
│   └── cordapps
│       └── cordapp-a.jar
└── cordapp-b.jar               // The new cordapp to add to the existing nodes

在根目录下再次运行网络启动器: java -jar network-bootstrapper-VERSION.jar --dir <nodes-root-dir> 会生成下边的新的结构:

.
├── notary
│   ├── node.conf
│   ├── network-parameters      // The contracts from cordapp-b are appended to the whitelist in network-parameters
│   └── cordapps
│       ├── cordapp-a.jar
│       └── cordapp-b.jar       // The updated cordapp is placed in the nodes cordapp directory
├── partya
│   ├── node.conf
│   ├── network-parameters      // The contracts from cordapp-b are appended to the whitelist in network-parameters
│   └── cordapps
│       ├── cordapp-a.jar
│       └── cordapp-b.jar       // The updated cordapp is placed in the nodes cordapp directory
└── partyb
    ├── node.conf
    ├── network-parameters      // The contracts from cordapp-b are appended to the whitelist in network-parameters
    └── cordapps
        ├── cordapp-a.jar
        └── cordapp-b.jar       // The updated cordapp is placed in the nodes cordapp directory

注意:仅仅能够向白名单中添加新的合约。一旦添加了一个合约实现的话,是不能够从白名单中删除掉的。