重新启动Corda Node结果,找到多个具有合法名称的节点

时间:2018-05-31 14:59:33

标签: corda

我们正在运行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$4.invoke(AbstractNode.kt:210) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$start$4.invoke(AbstractNode.kt:107) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence$2.invoke(AbstractNode.kt:673) ~[corda-node-3.1-corda.jar:?]
        at net.corda.node.internal.AbstractNode$initialiseDatabasePersistence$2.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:?]

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

2 个答案:

答案 0 :(得分:1)

因此,经过一番调查后,我认为归结为

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

  2. Corda下载现有网络,并使用节点公钥作为重复数据删除密钥对nodeInfos进行内部重复数据删除

  3. 节点X已关闭

  4. 节点X具有本地存储重置

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

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

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

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

    目前,我建议至少拥有持久性证书文件夹。这将阻止节点在重新启动/重建时重新生成密钥对。

    我还会在网络地图中添加一个端点,这样您就可以清除给定X500的数据库。

答案 1 :(得分:0)

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

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

在节点连接到的DB上,然后启动节点。

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