Corda 重新启动节点会导致找到多个具有合法名称的节点

Corda 重新启动节点会导致找到多个具有合法名称的节点,corda,Corda,我们正在运行一个3.1 corda网络,包括一个公证人、三个参与方节点和一个网络地图服务。每个节点都有一个持久的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

我们正在运行一个3.1 corda网络,包括一个公证人、三个参与方节点和一个网络地图服务。每个节点都有一个持久的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:?]

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

仅用于调查,您是否可以停止节点,然后运行

DELETE
FROM NODE_LINK_NODEINFO_PARTY 
DELETE
FROM NODE_INFO_HOSTS
DELETE
FROM NODE_INFOS
DELETE
FROM NODE_INFO_PARTY_CERT
在节点连接到的DB上,然后启动节点


如果这样做有效的话,它将指向节点启动时的竞争条件

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

  • 节点X在devMode中启动,生成一个密钥对,并将其节点信息发布到NetworkMap

  • Corda下载现有网络并使用节点公钥作为重复数据消除密钥在内部消除重复节点信息

  • 节点X已关闭

  • 节点X的本地存储已重置

  • 节点X启动并生成新的密钥对,发布其节点信息

  • 密钥对已更改,这意味着重复数据消除无法工作

  • Corda引发异常,因为看起来有两个节点试图模拟CN=xxxx,O=xx

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

    现在,我建议至少在文件夹中设置持久证书。这将阻止节点在重新启动/重建时重新生成密钥对


    我还将向网络映射添加一个端点,这将允许您清除给定X500的DB

    在Corda 3中,已删除网络地图节点。你还在你的网络中包括它吗?谢谢你的回复@Joel!我们正在运行基于Stefano示例的网络映射服务(spring boot)。我们没有使用网络引导工具,但仍然在通过AWS上的CFT部署的“开发模式”下运行节点。我们正试图一步一步地更好地理解生产网络。也许我们需要更进一步,删除“开发模式”并构建我们自己的证书?嘿,我刚度假回来-我会看看这个!谢谢您的回复@Stefano,希望您假期愉快!我们已经尝试过了-结果是节点成功启动,并且在网络地图服务中确实看到该节点的重复条目。一旦我们尝试与该节点进行交易,就会发现与该节点相关的错误。(我们可以再次复制以获得准确的错误消息)您是否可以在slack上进行讨论?