我们正在运行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:?]
这是否表示我们的网络地图服务如何注册节点或其他内容存在问题?
答案 0 :(得分:1)
因此,经过一番调查后,我认为归结为
节点X在devMode中启动,生成密钥对并将其nodeInfo发布到NetworkMap
Corda下载现有网络,并使用节点公钥作为重复数据删除密钥对nodeInfos进行内部重复数据删除
节点X已关闭
节点X具有本地存储重置
节点X启动并生成新密钥对,发布其nodeInfo
密钥对已更改,这意味着重复数据删除不起作用
Corda抛出异常,因为看起来有两个节点试图冒充CN = xxxx,O = xx ...
所以,我们将在这里进行讨论,这是一个节点更改密钥对的现实场景,如果是这样的话......我们是否应该在找到具有相同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上,然后启动节点。
如果可行 - 它指向节点启动时的竞争条件。