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

Corda java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:,corda,Corda,我有一个用例,我必须从发送方运营商(TTL)向两个运营商(比如JIO和Airtel)发送投诉详细信息(投诉是一个分类账ie IOUState.class) 国家级构造函数有投诉详细信息和三个操作员(当事人对象)、一个发送者和两个接收者 用户案例的第一部分是执行罚款,交易/投诉详细信息记录在Vault状态/线性状态 交易的第二部分涉及接收方运营商之一向发送方运营商发送投诉解决响应,而不应向第三方运营商发送合规响应。ie表示投诉与Airtel有关,然后Airtel将对TTL作出回应,JIO需要脱离循

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

国家级构造函数有投诉详细信息和三个操作员(当事人对象)、一个发送者和两个接收者

用户案例的第一部分是执行罚款,交易/投诉详细信息记录在Vault状态/线性状态

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

我写了一个state类和两个flow类

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

我已经用命令创建了事务,只需要两个签名者,TTL和Airtel,但不知道为什么仍然会出现错误

//Airtel节点中的流类,TAP为TTL节点

List requiredSigners=Arrays.asList(getOurIdentity().getOwningKey(),点击.getOwningKey())

Command Command=新命令(新IOUContract.Create(),requiredSigners)

FlowSession otherPartySession1=启动流量(TAP)//TAP是TTL参与方对象 //正在Airtel节点上执行Otherpartysession1

    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:未为以下事务参与者提供流会话:

(此处为Developer Relations@R3)

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


仅仅因为有人在参与者列表中,这并不意味着他们是必需的签名者。所需的签名人由事务命令上列出的公钥决定。

安东尼·基南也研究了这一点,并在发现后

从事务中解析的PartyB拥有一个与serviceHub.myInfo.Legaldentities中的拥有密钥不同的拥有密钥,因此它认为自己是“外部参与者”,并期望流会话传入。


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

亲爱的克里斯,我同意你的观点。因此,在我的代码中,我必须从一个节点向另一个节点发送响应细节,我需要两个签名者或公钥。一个用于发送方,另一个用于接收方。因此,启动流只有一个会话。但是返回的错误是指将流会话包含到我不想与之通信的节点。重复这个用例,在第一个事务中,节点ttl与节点airtel n node jio通信。这很好用。在第二个事务中,节点airtel需要与节点ttl n通信,而不是与节点jio通信。但我得到了一个例外,包括从node airtel到node jio的第二个事务的流会话,我不想这样,好吧--我想我明白了。。可能:)如果您试图将信息发送到第三个节点,而该节点不是必需的签名者,则可以启动流会话,然后使用otherPartySession1.send()将信息发送给它。但是,如果您希望在前两方签字后成为签字人,则corda不可能这样做,因为它要求所有签字人都包括在收集签名阶段。通过两次呼叫对方付费签名,并在第二次呼叫中包含otherPartySession1,它认为应该将其包含在Chris的Fisthanks应答中。但要求在处理第二个事务时不向第三个节点发送详细信息。用例是node ttl在第一个事务中将详细信息发送给node jio和node airtel。这很好用。作为对收到的详细信息的响应,node airtel只想响应node ttl。节点JIO不应该知道事务,但需要在节点ttl和节点airtel LIGERREMOVE JIO中从参与者列表中登录。我有一个状态类。在重写的getparticipants函数中,我检查存储jio的变量是否为null,然后我包括三个参与者ttl、airtel、jio这是第一个事务所必需的。若存储jio party的变量为null,那个么我将ttl、airtel作为返回参与者。因此,对于第二个事务,它应该只返回两个参与者添加了子流(FinalityFlow(signedTx,listOfSession))Yes。我已经加上了。会话列表只有一个。Ie airtel至TTL,然后仔细检查参与者列表,并在控制台上打印姓名。
SignedTransaction fullySignedTx = subFlow(new CollectSignaturesFlow(
            signedTx, Arrays.asList(otherPartySession1), CollectSignaturesFlow.tracker()));