corda - 无法从同一资产的进一步交易中删除参与者
问题描述
业务中的各方。. 甲、乙、丙方
资产:订单
甲方为乙方和丙方发送第一笔交易
B 方将下一笔交易发送给 A 和 C(在同一订单上,我们使用 vault 查询来获取输入状态)
现在我们希望 C 方不应该收到任何关于此订单的未来交易。当我们从参与者列表中删除 C 时,我们会收到以下错误。看起来 Corda 正在从输入状态中获取参与者列表。请提出问题的解决方案。
java.lang.IllegalArgumentException:未为以下事务参与者提供流会话:[O=C,L=NV,C=US]
解决方案
此错误消息来自FinalityFlow
:
https ://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt#L159-L161
为了解释为什么会出现该错误,让我们回到以下定义participants
:
https://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
推荐阅读
- java - 在具有 2 个外键的模型中找不到 ParentKey
- sql-server - 在 spark 中从 sql server 并行读取
- ios - iOS 13 beta 中 WKWebView 的内在内容大小问题
- python - 无法解释使用 tensorflow 创建 LSTM 单元的 Python 代码行
- bash - 可以在不保存为文件的情况下键入和执行 shell 脚本吗?
- swift - 快速覆盖方法
- javascript - 如何将谷歌课堂 API 与 express 一起使用?
- reactjs - 如何使用大量活动查询更新 Apollo Cache
- java - 向文本区域添加滚动条
- python - str=str.split('=') AttributeError: 'list' object has no attribute 'split'