我正在寻找正确的合同升级流程。请考虑以下示例:
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是其中一个输出的事务。如果所有者要(授权并)启动升级,则流程将失败,因为相关参与者没有授权合同升级。这里有什么正确的方法?
答案 0 :(得分:1)
一个解决方案是让所有者将StateRef
发送到relevantParticipant
。然后,relevantParticipant
可以使用StateAndRef
检索ServiceHub.loadState
,并选择使用ContractUpgradeFlow.Authorise
授权合同升级。
这比直接发送StateAndRef
更好,因为relevantParticipant
可以验证发送的状态是否未被篡改(因为它们从存储中检索实际状态,而不是对手方的)。