Corda 中的网络地图是被签名的 NodeInfo 对象的集合。每个 NodeInfo 会被它所表示的节点进行加密签名,因此是不可篡改的。它形成了在一个兼容区域(compatibility zone)中的一系列的可交互的节点。一个节点可以通过以下两种来源来获得这些对象:
- 网络地图服务器通过基于 HTTP 协议进行传输
- 在节点路径下的
additional-node-infos
目录中
网络地图服务器也会分发一个包含网络参数的文件,这个网络参数文件定义了很多配置的参数值,并且所有的节点需要同意这些配置参数才能够在该网络中同步数据。
在 Corda 3 并没有提供一个 HTTP 网络地图服务器的实现。这是因为一个兼容区域要如何去管理它的成员在不同的操作者之间存在着很大的差异(数据库,问题处理流程,HSM 硬件等),所以我们提供了一个简单的基于 REST 的协议来上传/下载 NodeInfos 和管理网络参数。Corda 未来的版本可能会提供一个简单的 “stub” 的实现来运行测试区域(test zones)。在 Corda 3 的版本中,正确的运行一个测试网络的方式是使用你自己的机制来将相关的文件在不同节点间分发。我们提供了一个工具来自动进行这些任务(下边有详细的描述)。
HTTP 网络地图协议
如果节点的配置中配置了 compatibilityZoneURL
的话,那么当它首先会将自己签名过的 NodeInfo
文件上传到服务器上(之后每次启动的时候如果 NodeInfo 有变化的话,也会重新上传),然后会下载整个网络地图。网络地图包含了一个 NodeInfo
哈希的列表。节点会定期地重新获取网络地图(基于 HTTP 缓存的过期 header 设置),新的节点信息会被下载并且加入到缓存中。已经不存在的节点信息会从节点的缓存中被删除。
网络地图服务的 REST end-points 包括:
请求方法 | 路径 | 描述 |
---|---|---|
POST | /network-map/publish | 节点用来向网络地图中上传它签名加密过的 NodeInfo 对象 |
POST | /network-map/ack-parameters | 节点操作者(node operator)接受新的网络参数来确保能够收到未来的更新 |
GET | /network-map | 获取当前被签名过的网络地图对象。整体的对象会被网络地图证书(network map certificate)签名加密,也会一起被发送过来 |
GET | /network-map/node-info/{hash} | 获取一个网络地图对象中指定的被签名加密过的 NodeInfo
|
GET | /network-map/network-parameters/{hash} | 获取当前被签名过的网络参数对象。整体的对象会被网络地图证书(network map certificate)签名加密,也会一起被发送过来 |
additional-node-infos
目录
跟 HTTP 网络地图服务一起,或者说是它的一种替代方案,当节点并没有连接到一个网络地图服务的话,节点会从自己根目录下的 additional-node-infos
路径下读取网络地图内容。该路径下的每个文件应该同网络地图服务签名加密的 NodeInfo
文件相同。这些会被自动地加到节点的网络地图缓存中并可以被用来补充或者替换 HTTP 网络地图。如果同一个节点同时在这两种机制中存在,那么 additional-node-infos
中的网络地图会最终被使用。
当节点启动的时候,会生成自己签名过的 node info 文件,文件名的格式为 nodeInfo-${hash}
。也可以使用 --just-generate-node-info
命令行标识不启动节点也可以生成 node info 文件。如果不想使用 HTTP 网络地图服务来创建一个简单的网络的话,简单地将这些文件放在网络中每个节点的 additional-node-infos
路径下即可。比如一个简单的方式来做这个工作就是使用 rsync。
通常,测试网络事先都会知道应该具有怎样的一个架构。对于创建这种网络,我们提供了一个 network-bootstrapper
工具。如果给定了网络中每个节点的 IP 地址/域名的话,这个工具能够生成节点的配置文件路径。生成的节点配置路径中包含了网络中其他节点的 NodeInfos 文件,同时也会包含网络参数文件和身份证书(identity certificates)。生成的节点不需要同时一直保持在线 - 一个不需要进行互动的离线节点不会影响该网络的运行。所以一个这样生成的测试集群可以按照你的需要扩展到最大的 size,然后可以按照需要进行扩大或缩小。
网络参数 Network parameters
网络参数是一系列的值,在该网络中的所有节点必须要同意这些参数值才能够彼此正确地进行互通。这个可以被理解为是一个 Corda 部署的所有方面的一个封装,有些节点可能会不同意某些方面。然而其他的区块链/DLT 系统通常会要求一个源代码的分叉(fork)来变更不同的约束(比如在一个加密货币中货币的总量,应该使用的端口号等),在 Corda 中,我们对这些选择进行了改进并将它们放进了一个额外的文件中并且允许 “区域操作者”(zone operators)来对他们进行选择。区域操作者会对包含这些参数的一个数据结构进行签名,然后这个数据结构会同网络地图一起被分发出去。工具被提供用来获得用户对一个新版本的参数的同意,并且确保每个人都会在同一时间切换到新的网络参数。
如果节点使用的是 HTTP 网络地图服务的话,那么在第一次启动的时候它会下载被签名过的网络参数文件,把它缓存在一个 network-parameters
文件中并且将它应用到了该节点上。
如果
network-parameters
文件被改动了并且同网络地图服务发布的版本不一样了的话,节点就会自动关闭。解决这个问题的方法就是删除这个不正确的文件然后重启节点,所以网络参数就可以被再次地下载。
如果节点并没有使用 HTTP 网络地图服务的话,那么这些被签名的文件应该通过另外一种方式被获取。针对于这种情况,这里有一个网络启动器(network bootstrapper)的工具可以用来生成网络参数文件并且连同 node info 文件一同被分发到节点的相关路径下。
当前的网络参数配置项包括:
minimumPlatformVersion: 节点运行所需的最小平台版本号。任何运行小于该版本号的节点将不会被启动。
notaries: 在兼容区域中允许的 notaries 的身份和验证类别(validating 或者是 non-validating)的列表。
maxMessageSize: 这个目前是被忽略的。然而在将来的版本中会恢复。
maxTransactionSize: 对于一个 transaction 所允许的最大 size。这个尺寸是指 transaction 对象和它的附件共同的大小。
modifiedTime: 网络参数被兼容区域操作者最后一个更新的时间。
epoch 网络参数的版本号。从1开始,当有任何的参数变化的时候,这个版本号会自动增加。
whitelistedContractImplementations: 被添加到白名单中的合约代码(contract code)的列表。对于每一个合约的类,这里会有一个经过批准的包含该合约类的 CorDapp jar 版本。
eventHorizon: 代表经过多久之后节点会被认为是没有反应的并会被移除出网络地图。节点可以在固定的一个周期中再次发布他们的 NodeInfo。网络地图会把这种定期的操作看作是来自于节点的心跳。
网友评论