Corda 科尔达·唐';我不知道当事人-公证人

Corda 科尔达·唐';我不知道当事人-公证人,corda,Corda,我将Corda3.1与cordapp示例的自编译版本一起使用。该环境有一个spring boot网络映射服务,该服务与参与方节点一起部署,并有一个公证人节点部署到多个AWS EC2实例。每个节点的持久性都由postgres数据库中自己的模式支持 从内部web服务器启动IssueObligation.kt流(IOU)时,我遇到以下异常: [INFO ] 2018-06-07T14:27:01,751Z [Node thread-1] flow.[d04d24bf-5aa7-472a-b336-2e

我将Corda3.1与cordapp示例的自编译版本一起使用。该环境有一个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后,确实会发生这种情况。网络地图服务知道公证人的情况,因为它会在已注册的节点列表中报告公证人。 party节点知道公证人,因为当它执行这一行时,我们看不到流中的失败:

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

只是想知道我应该采取什么步骤来解决问题。

我有一个类似的设置,这对我使用dev模式很有效

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

因此,公证人无法向其他节点证明,他使用键
X
是有效的公证人

引导程序所做的工作:

  • 请求公证人节点重新生成新的开发者证书/密钥
  • 请求公证人节点使用其密钥对其node.conf进行签名,以生成
    nodeInfo-${hash}
  • 使用devCA对签名为
    nodeInfo-${hash}
    的公证人进行签名,以生成网络参数文件
  • 来解决这个问题

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

  • 假设您的所有公证人和节点已经有一个现有的证书文件夹
  • 从所有节点中删除所有
    nodeInfo-${hash}
  • 关闭所有节点并删除
    节点标识
  • 运行
    java-jarcorda.jar——只需生成节点信息
    即可生成
    nodeInfo-${hash}
    文件
  • 重新分发节点信息
  • 通过强制bootstrapper.jar使用现有密钥重新生成网络参数文件

  • 从所有节点删除网络参数文件
  • 复制“公证人现有证书”文件夹,并将其放置在此结构中的某个位置/本地位置
  • 运行java-jar network-bootstrapper.jar文件夹/
  • 重新分发生成的网络参数文件
  • 重新启动所有节点

  • 在更改义务示例以匹配IOU示例之后,我们能够使其正常工作。事实证明,在事务上设置一个时间窗口是在启用与公证人的某种通信,从而导致错误。我不知道为什么

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

    虽然删除该行将允许将债务(iou)写入分类账,但必须要求该行与公证人一起执行后续结算命令,因为即使已发放现金,我们也始终会看到资金不足错误。所以这个问题还没有得到回答。

    你能在corda节点外壳中发布运行networkMapFeed的输出吗?当然可以@Stefano-DataFeed(快照=[NodeInfo(地址=[10.224.10.124:10002],合法身份和证书=[O=Liberty Mutual,L=Dover,C=US],平台版本=3,序列号=1528402160117),NodeInfo(地址=[10.224.8.14:10002],合法身份和证书=[O=SwissRe,L=Zurich,C=CH],平台版本=3,序列号=1528402122164),节点信息(地址=[10.224.9.81:10002],合法身份和证书=[O=公证人,L=Dover,C=US],平台版本=3,序列号=1528401742928]),更新=rx。Observable@5c1bd44c)带有
    时间窗口的交易将发送给公证人。公证人充当加盖时间戳的机构。
    
    .setTimeWindow(serviceHub.clock.instant(), 30.seconds)