重新启动 Corda 节点结果发现多个具有合法名称的节点

Restarting Corda Node results with More than one node found with legal name

我们是 运行 一个 3.1 corda 网络,具有公证人、3 方节点和网络地图服务。每个节点都有一个持久的 postgresql 数据库。当我们重新启动一个节点时,我们得到以下堆栈跟踪:

[ERROR] 2018-05-31T13:53:37,386Z [main] internal.Node.run - Exception during node startup {}
java.lang.IllegalArgumentException: More than one node found with legal name O=*****, L=*****, C=**
        at net.corda.node.services.network.PersistentNetworkMapCache.getNodeByLegalName(PersistentNetworkMapCache.kt:161) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.services.network.NetworkMapCacheImpl.getNodeByLegalName(PersistentNetworkMapCache.kt) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode.updateNodeInfo(AbstractNode.kt:324) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode.access$updateNodeInfo(AbstractNode.kt:107) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$start.invoke(AbstractNode.kt:210) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$start.invoke(AbstractNode.kt:107) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence.invoke(AbstractNode.kt:673) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence.invoke(AbstractNode.kt:107) ~[corda-node-3.1-corda.jar:?]
        at net.corda.nodeapi.internal.persistence.CordaPersistence.inTopLevelTransaction(CordaPersistence.kt:148) ~[corda-node-api-3.1-corda.jar:?]
        at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:134) ~[corda-node-api-3.1-corda.jar:?]
        at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:120) ~[corda-node-api-3.1-corda.jar:?]
        at net.corda.nodeapi.internal.persistence.CordaPersistence.transaction(CordaPersistence.kt:127) ~[corda-node-api-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode.initialiseDatabasePersistence(AbstractNode.kt:672) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.Node.initialiseDatabasePersistence(Node.kt:337) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode.start(AbstractNode.kt:208) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.Node.start(Node.kt:351) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.NodeStartup.startNode(NodeStartup.kt:140) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.NodeStartup.run(NodeStartup.kt:114) [corda-node-3.1-corda.jar:?]
        at net.corda.node.Corda.main(Corda.kt:13) [corda-node-3.1-corda.jar:?]

这是否表明我们的网络地图服务如何注册节点或其他问题?

只是为了调查,你能不能停止节点,然后运行

DELETE
FROM NODE_LINK_NODEINFO_PARTY 
DELETE
FROM NODE_INFO_HOSTS
DELETE
FROM NODE_INFOS
DELETE
FROM NODE_INFO_PARTY_CERT

在节点连接到的数据库上,然后启动节点。

如果可行 - 它指向节点启动时的竞争条件。

所以,经过一些调查,我认为可以归结为

  1. 节点 X 在 devMode 中启动,生成密钥对并将其 nodeInfo 发布到 NetworkMap

  2. Corda 下载现有网络并在内部通过使用节点 public 键作为去重键

  3. 对 nodeInfos 进行去重
  4. 节点 X 已关闭

  5. 节点 X 已重置其本地存储

  6. 节点X启动并生成新的密钥对,发布其nodeInfo

  7. 密钥对已更改,这意味着重复数据删除不起作用

  8. Corda 抛出异常,因为看起来有两个节点试图冒充 CN=xxxx, O=xx ...

所以,我们将在这里讨论,节点更改密钥对是否是一个现实的场景,如果是这样......我们是否应该抛出异常以找到具有相同 X500 但不同的两个节点 public 键。

目前,我建议至少要有持久证书文件夹。这将阻止节点在 restart/rebuild 上重新生成密钥对。

我还将向网络地图添加一个端点,这将允许您清除给定 X500 的数据库。