当前位置: 首页 > 知识库问答 >
问题:

科达不知道聚会——公证人

司徒俊良
2023-03-14

我正在使用Corda 3.1和义务编码应用程序示例的自我编译版本。该环境具有一个部署了参与方节点的Spring启动网络映射服务,以及一个部署到多个 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:?]

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

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

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

共有2个答案

阎涵忍
2023-03-14

在修改了债务示例以匹配借据示例之后,我们能够让它工作了。原来,在交易上设置时间窗口是为了与导致错误的公证人进行某种交流。我不知道为什么。

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

虽然删除此行将允许将义务(iou)写入分类帐,但必须要求此行与公证人执行后续结算命令 - 就像我们总是看到资金不足错误一样,即使已经发行了现金。所以这仍然没有答案。

翟展
2023-03-14

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

根本原因:网络参数文件只是一个由dev_CA认可的签名文件,使用密钥< code>X签名的signedNodeInfo是有效的公证人。因为您的公证人在VM上的现有密钥可能是< code>X,但是分发到其他节点的网络参数文件认可< code>Y,所以引发了该错误。

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

引导程序的作用:

  1. 请求公证节点重新生成新的开发证书/密钥。
  2. 请求公证人节点使用他的密钥对他的节点进行签名,以生成节点信息-${哈希}
  3. 使用 devCA 对公证已签名的节点进行签名Info-${哈希} 生成网络参数文件

要解决此问题。

重新分发节点信息-${哈希} (可选)

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

通过强制引导程序重新生成网络参数文件。jar以使用公证现有密钥

  1. 从所有节点中删除网络参数文件
  2. 复制公证现有证书文件夹,并将其放置在此结构中的某个位置/本地
  3. 运行 java -jar 网络-引导程序.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)
 类似资料:
  • 我需要检查公证人如何防止义务Cordapp中的双重支出。我在本地主机端口启动了Web服务器UI并执行了一些多个事务,当我检查公证人的日志时,我发现了这个: [警告]2020-06-24T08:29:33484Z[公证请求队列处理器]事务。PersistentUniquenessProvider。-无法公证:一个或多个输入状态或引用状态已在其他事务中用作输入状态。冲突状态计数:1,消耗详细信息:7C

  • 我正在制作一个discord机器人,我希望它在加入新公会时发送消息。 但是,我只想让它在它加入的公会的通道中发送消息: 我注意到的问题是只返回服务器的第一个通道的名称。我想通过所有渠道迭代,最后只在渠道上发送消息。 它的变通方法是什么?

  • 问题内容: 我本来希望以下查询返回所有带有各自子代的人。 但是实际上,它的确是相反的。我想不出无需额外的CTE就能进行正确嵌套的方法。有办法吗? 示例数据 结果 预期结果 问题答案: 该rCTE从另一侧遍历树: SQL提琴。 使用到每个节点聚集多个分支外。 与您期望的结果之间的微小差异: 这包括在列中。 没有将单个节点包装到数组中。 都可以进行调整,但是我希望结果对您来说是可以的。

  • 30min,面试官很好。 #前端##前端暑期实习#

  • 我收到这个错误: 无法运行程序“/usr/lib/jvm/java-1.7.0-openjdk-i386/bin/java”(在目录“/home/sergiy/. ANDidStudioPreview/系统/编译-服务器”中):错误=2,没有这样的文件或目录 这发生在我删除所有JDK(开放和其他)之后。在我从官方网站安装甲骨文JDK之前的一段时间。所以,JDK的新文件夹命名为jdk1.7.0 An

  • 我想知道公会成员何时登录,而不是成员何时加入,所以在这种情况下不起作用。也许有另一种方法来实现我想做的事情,所以我将在这里解释。 当我的网站的用户升级到标准或专业会员时,他们可以加入我的discord服务器。我仍然需要弄清楚如何确定discord用户是我网站上的标准/专业订阅会员,但我认为我可以发送一个一次性邀请链接或一个会员必须输入的密码,在机器人发送欢迎消息询问密码或其他信息后发送discor