corda - 我们应该如何升级一个由一个 DL 参与者拥有但有一个包含多个参与者的参与者列表的状态?
问题描述
我正在寻找正确的合同升级过程。考虑以下示例:
SimpleContract : Contract {
data class State(override val owner: AbstractParty, val relevantParticipant: AbstractParty) : OwnableState {
override val participants: List<AbstractParty> = listOf(owner, relevantParticipant)
override fun withNewOwner(newOwner: AbstractParty): CommandAndState
= CommandAndState(Commands.Move(), copy(owner = newOwner))
}
}
据我了解,此状态仅存储在所有者的保险库中,但相关参与者也具有(在其交易存储中)SimpleContract.State 是输出之一的交易。如果所有者要(授权和)启动升级,则流程将失败,因为相关参与者没有授权的合约升级。这里的正确方法是什么?
解决方案
一种解决方案是让所有者StateRef
将relevantParticipant
. 然后relevantParticipant
可以检索StateAndRef
使用ServiceHub.loadState
,并选择授权合约升级使用ContractUpgradeFlow.Authorise
。
这比StateAndRef
直接发送要好,因为relevantParticipant
然后可以验证发送的状态没有被篡改(因为他们从存储中检索实际状态,而不是从对方的存储中)。
推荐阅读
- python - urlopen 错误 [Errno 11001] getaddrinfo 失败 - 自动下载图像
- g++ - g++ 变量未声明但已声明
- javascript - 有没有办法同时完成这两个功能?
- json - 你可以设置动态 json 结构字段标签吗?
- java - Netty 客户端中配置的密码列表未发送到服务器
- android - Exoplayer - 如何在缓冲之前检索内容长度?
- tensorflow - 如何在 tfds.load 中使用自定义数据集
- linux - clad 扫描功能的奇怪行为
- python - 权限错误[Errno13]安装robotframework-SikuliLibrary时权限被拒绝
- fuzzing - 更改 AFL 的输入源优先级