【问题标题】:Corda Don't Know About Party - NotaryCorda Don't Know About Party - 公证人
【发布时间】:2018-11-17 16:13:06
【问题描述】:

我正在使用带有自编译版本的义务 cordapp 示例的 Corda 3.1。该环境有一个部署了方节点的 Spring Boot 网络地图服务和一个部署到多个 AWS EC2 实例的公证节点。每个节点的持久性都由 postgres 数据库中自己的模式支持。

从内部 Web 服务器启动 IssueObligation.kt 流 (IOU) 时遇到以下异常:

[INFO ] 2018-06-07T14:27:01,751Z [Node thread-1] flow.[d04d24bf-5aa7-472a-b336-2e72feff6abf].initiateSession - Initiating flow session with party O=Notary, L=Dover, C=US. Session id for tracing purposes is SessionId(toLong=7742727399076294852). {}
[WARN ] 2018-06-07T14:27:01,776Z [Node thread-1] flow.[d04d24bf-5aa7-472a-b336-2e72feff6abf].run - Terminated by unexpected exception {}
java.lang.IllegalArgumentException: Don't know about party O=Notary, L=Dover, C=US
    at net.corda.node.services.statemachine.StateMachineManagerImpl.sendSessionMessage(StateMachineManagerImpl.kt:616) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.StateMachineManagerImpl.processSendRequest(StateMachineManagerImpl.kt:582) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.StateMachineManagerImpl.processIORequest(StateMachineManagerImpl.kt:569) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.StateMachineManagerImpl.access$processIORequest(StateMachineManagerImpl.kt:63) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.StateMachineManagerImpl$initFiber$2.invoke(StateMachineManagerImpl.kt:444) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.StateMachineManagerImpl$initFiber$2.invoke(StateMachineManagerImpl.kt:63) ~[corda-node-3.1-corda.jar:?]
    at net.corda.node.services.statemachine.FlowStateMachineImpl$suspend$2.write(FlowStateMachineImpl.kt:507) ~[corda-node-3.1-corda.jar:?]
    at co.paralleluniverse.fibers.Fiber$3.run(Fiber.java:1994) ~[quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:824) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_171]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_171]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_171]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_171]
    at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62) [corda-node-3.1-corda.jar:?]

流程中没有任何其他异常可以准确指出发生这种情况的位置,但它确实发生在一方节点与另一方节点成功交互以发出 IOU 之后。网络地图服务知道公证人,因为它确实在其已注册的节点列表中报告了它。 方节点知道公证人,因为在执行此行时我们没有看到流程中的失败:

val firstNotary get() = serviceHub.networkMapCache.notaryIdentities.firstOrNull() ?: throw FlowException("No available notary.")

只是想找出我应该采取哪些步骤来解决问题。

【问题讨论】:

  • 你能在corda节点shell中发布run networkMapFeed From的输出吗?
  • 当然@Stefano - DataFeed(snapshot=[NodeInfo(addresses=[10.224.10.124:10002], legalIdentitiesAndCerts=[O=Liberty Mutual, L=Dover, C=US], platformVersion=3 , serial=1528402160117), NodeInfo(addresses=[10.224.8.14:10002], legalIdentitiesAndCerts=[O=SwissRe, L=Zurich, C=CH], platformVersion=3, serial=1528402122164), NodeInfo(addresses=[10.224. 9.81:10002], legalIdentitiesAndCerts=[O=Notary, L=Dover, C=US], platformVersion=3, serial=1528401742928)], updates=rx.Observable@5c1bd44c)

标签: corda


【解决方案1】:

我有一个类似的设置,这对我使用开发模式很有用。

根本原因:网络参数文件只是一个由 dev_CA 签署的文件,签署了一个签名的 NodeInfo 密钥 X 是有效的公证人。抛出该错误是因为您的公证人在 VM 上的现有密钥可能是 X,但分发到其他节点的网络参数文件正在认可 Y

因此,公证人无法向其他节点证明,具有密钥X 的他是有效的公证人。

引导程序的作用:

  1. 请求公证节点重新生成新的开发证书/密钥。
  2. 请求公证节点使用他的密钥签署他的node.conf以产生nodeInfo-${hash}
  3. 使用devCA签署公证人签名nodeInfo-${hash}生成网络参数文件

解决问题。

重新分发nodeInfo-${hash}(可选)

  1. 假设您的所有公证人和节点都已经有一个现有的证书文件夹。
  2. 从所有节点中删除所有nodeInfo-${hash}
  3. 关闭所有节点并删除node_identities
  4. 运行java -jar corda.jar --just-generate-node-info生成nodeInfo-${hash}文件
  5. 重新分发节点信息

通过强制 bootstrapper.jar 使用公证现有密钥来重新生成网络参数文件

  1. 从所有节点中删除网络参数文件
  2. 复制您的公证人现有证书文件夹并将其放置在此结构中的某处/本地
  3. 运行java -jar network-bootstrapper.jar folder/
  4. 重新分发生成的网络参数文件
  5. 重启所有节点

.

.folder/                        // root folder containing the notary           
     ├── notary_node            // The notary's folder name (must be renamed this way)
         ├── certificates       // The notary's certificates folder with the keys
     └── notary_node.conf       // The notary config (must be renamed this way)

【讨论】:

    【解决方案2】:

    在更改义务示例以匹配 IOU 示例后,我们能够使其工作。事实证明,在交易上设置时间窗口可以与导致错误的公证人进行某种通信。我不知道为什么。

    .setTimeWindow(serviceHub.clock.instant(), 30.seconds)
    

    虽然删除此行将允许将债务 (iou) 写入分类帐,但必须要求此行才能与公证人一起执行后续结算命令 - 因为即使现金有,我们也总是会看到资金不足错误已发出。所以这还没有回答。

    【讨论】:

    • TimeWindows 的交易被发送给公证人。公证人充当时间戳权威。
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2020-10-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多