首页 > 解决方案 > 我们应该如何升级一个由一个 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 是输出之一的交易。如果所有者要(授权和)启动升级,则流程将失败,因为相关参与者没有授权的合约升级。这里的正确方法是什么?

标签: corda

解决方案


一种解决方案是让所有者StateRefrelevantParticipant. 然后relevantParticipant可以检索StateAndRef使用ServiceHub.loadState,并选择授权合约升级使用ContractUpgradeFlow.Authorise

这比StateAndRef直接发送要好,因为relevantParticipant然后可以验证发送的状态没有被篡改(因为他们从存储中检索实际状态,而不是从对方的存储中)。


推荐阅读