【问题标题】:java.lang.IllegalArgumentException: Flow sessions were not provided for the following transaction participants:java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:
【发布时间】:2019-10-03 18:27:34
【问题描述】:

我有一个用例,我必须从 Sender 运营商 (TTL) 向两个运营商(比如 JIO 和 Airtel)发送投诉详细信息(投诉是一个分类帐,即 IOUState.class)

State 类构造函数有投诉详情和三个 Operator(Party 对象),一个发送者和两个接收者。

用户案例的第一部分执行良好,交易/投诉详细信息正在以保险柜状态/线性状态记录。

交易的第二部分涉及接收方运营商之一向发送方运营商发送投诉解决响应,不应向第三运营商发送合规响应。即说投诉与 Airtel 有关,然后 Airtel 将响应 TTL,JIO 需要脱离循环。

我写了一个状态类和两个流类。

但是当我执行第二个流程(Airtel 到 TTL)时,它抛出 java.lang.IllegalArgumentException:未为以下事务参与者提供流程会话:[O=PartyJIO, L=MUMBAI, C=IN]

我已经使用 Command 创建了交易,只需要两个 Signers TTL 和 Airtel 但不知道为什么仍然收到错误

//Airtel Node中的Flow类,TAP为TTL Node

列出 requiredSigners = Arrays.asList(getOurIdentity().getOwningKey(), TAP.getOwningKey());

Command command = new Command(new IOUContract.Create(), requiredSigners);

  txBuilder = new TransactionBuilder(notary)
            .addInputState(IOUState1.get(0))
            .addOutputState(outputState, IOUContract.ID)
            .addCommand(command);

FlowSession otherPartySession1 = 启动Flow(TAP); //TAP是TTL Party Object //Otherpartysession1 正在 Airtel 节点执行

    SignedTransaction fullySignedTx = subFlow(new CollectSignaturesFlow(
            signedTx, Arrays.asList(otherPartySession1), CollectSignaturesFlow.tracker()));

java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:

SignedTransaction fullySignedTx = subFlow(new CollectSignaturesFlow(
            signedTx, Arrays.asList(otherPartySession1), CollectSignaturesFlow.tracker()));

java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:

【问题讨论】:

  • 从参与者列表中删除 jio。
  • 我有一个州级课程。在重写的 getparticipants 函数中,我检查存储 jio 的变量是否不为空,然后我包括三个参与者 ttl、airtel、jio,这是第一次交易所必需的。如果存储 jio 方的变量为空,则我将包括 ttl、airtel 作为返回参与者。因此,对于第二笔交易,它应该只返回两个参与者
  • 你添加了subFlow(FinalityFlow(signedTx, listOfSession))
  • 是的。我已经添加了它。会话列表只有一个。即airtel到ttl
  • 然后仔细检查参与者列表在控制台上打印名称。

标签: corda


【解决方案1】:

(此处为开发者关系@R3)

在 Corda 4 中,您需要向 FinalityFlow 传递一个包含所有事务参与者的会话列表,以便可以相应地分发事务。

仅仅因为某人在此参与者列表中,并不会使他们成为必需的签名者。所需的签名者由交易命令中列出的公钥确定。

【讨论】:

  • 亲爱的克里斯,同意你的观点。因此,在我的代码中,我必须从一个节点向另一个节点发送响应详细信息,我需要两个签名者或公钥。一个用于发送者,另一个用于接收者。因此,启动流程只有一个会话。但是返回的错误是指将流会话包含到我不想与之通信的节点。只是重复用例,在第一个事务中,节点 ttl 正在与节点 airtel n 节点 jio 通信。佛
  • 哪个工作正常。在第二次交易中,节点 airtel 需要与节点 ttl n 通信而不是节点 jio。但是我得到了例外,包括从节点 airtel 到节点 jio 的流会话,用于我不想要的第二个事务
  • 对,好的——我想我明白了..也许:) 如果你想要做的是将信息发送到第三个节点,而它不是必需的签名者,你可以启动一个流会话,然后使用 otherPartySession1.send() 将信息发送给它。但是,如果您希望它在前两方签署后成为签署人,那么使用corda 是不可能的,因为它要求所有签署人都包含在收集签名阶段。通过两次调用collect签名并在第二次调用中包含otherPartySession1,它认为它应该被包含在第一个中
  • 感谢克里斯的回答。但要求是在处理第二个事务时不要将详细信息发送到第三个节点。
  • 用例是节点 ttl 在第一个事务中向节点 jio 和节点 airtel 发送详细信息。这工作正常。作为对收到的详细信息的响应,节点 airtel 只想响应节点 ttl。交易不应该被节点 JIO 知道,但需要登录节点 ttl 和节点 airtel 账本
【解决方案2】:

Anthony Keenan 也看过这个,并在 this page 上发现了

The PartyB that is resolved from the transaction has an owning key that is different to the owning key in serviceHub.myInfo.legalIdentities so it thinks it's an 'external participant' and expects a flow session passing in.

所以.. 可能是您以某种方式重新创建了您的密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2016-06-29
    • 2016-01-26
    • 2017-07-06
    • 2020-06-11
    相关资源
    最近更新 更多