首页 > 解决方案 > 无法从同一资产的进一步交易中删除参与者

问题描述

业务中的各方。. 甲、乙、丙方

资产:订单

甲方为乙方和丙方发送第一笔交易

B 方将下一笔交易发送给 A 和 C(在同一订单上,我们使用 vault 查询来获取输入状态)

现在我们希望 C 方不应该收到任何关于此订单的未来交易。当我们从参与者列表中删除 C 时,我们会收到以下错误。看起来 Corda 正在从输入状态中获取参与者列表。请提出问题的解决方案。

java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:[O=C,L=NV,C=US]

标签: corda

解决方案


此错误消息来自FinalityFlowhttps ://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt#L159-L161

为了解释为什么会出现该错误,让我们回到以下定义participantshttps://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/contracts/ContractState。 kt#L19

参与者是在创建或使用状态时应通知的任何一方 。

在该声明之后,当您的交易有一个(或多个)输入和一个(或多个)输出时,则该交易应记录(即finalized)在所有所有输入和输出状态的联合participants中,因为再次;按照participants定义,当他们的状态被创建或消费时,他们应该被通知。

这就是为什么,最终流程期望FlowSession事务中的每个参与者都有一个,并在发现丢失的参与者时抛出您看到的错误。

现在,关于隐私问题(您问题的另一部分);即使FinalityFlow在所有参与者的联合中记录了最终的交易;它不会记录所有保险库中的所有输出状态,它有一个名为的参数StatesToRecord,默认为ONLY_RELEVANT
https ://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core /flows/FinalityFlow.kt#L47

这意味着,一个节点只会注册它参与的状态。

总而言之,交易将记录在所有参与者(所有输入/输出状态)的联合中,但每个参与者只会在他们的保管库中注册相关的输出状态。

重要提示:调用的对等节点ReceiveFinalityFlow可能会覆盖默认值statesToRecord并选择ALL_VISIBLE记录交易的所有输出状态,无论它是否是参与者: https ://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src /main/kotlin/net/corda/core/flows/FinalityFlow.kt#L272-L274

我建议你在这里阅读我关于使用 CDL 进行隐私分析的文章;有关此主题的更详细信息:https ://blog.b9lab.com/how-to-design-a-cordapp-and-analyze-privacy-leaks-using-cdl-views-da825953ff54


推荐阅读