如何升级单参与者所有但含多参与者列表的DL状态?合约升级方案问询
Corda合约升级:多参与者状态的授权处理方案
首先来看你提供的状态定义代码:
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)) } }
你提到的问题是Corda合约升级里典型的多参与者场景问题:虽然owner是状态的主要持有方,但relevantParticipant作为participants列表中的一员,其节点的交易存储里确实留存了包含该状态的交易记录,所以Corda的合约升级机制要求所有状态参与者必须共同授权,否则升级交易无法通过验证。
针对这个场景,正确的处理流程可以分为以下几个部分:
1. 明确合约升级的核心规则
Corda中,任何包含多参与者的状态进行合约升级时,必须获得所有在participants列表中的节点签名。这是为了保证所有关联节点的Vault和交易存储数据一致性,避免出现部分节点使用旧合约、部分使用新合约的分裂情况。
2. 执行标准升级流程
- 定义升级命令:首先需要在原合约或目标升级合约中添加合法的升级命令,示例如下:
interface SimpleContract : Contract { // 原有State和Move命令定义... class Upgrade : CommandData // 新增升级命令 } - 生成并分发升级提案:通常由
owner发起升级提案,创建包含旧合约ID、目标新合约ID、待升级状态列表的交易草稿,然后将该草稿发送给relevantParticipant节点。 - 收集双方签名:
relevantParticipant节点验证升级提案的合法性后,签署该交易;待双方签名完成后,由任意一方将完整签名的交易提交到Corda网络。 - 节点自动更新状态:交易被网络确认后,所有参与节点的Vault会自动将旧合约状态替换为新合约状态,交易存储也会同步更新对应的记录。
3. 特殊场景的备选方案
如果遇到relevantParticipant无法联系或拒绝签署的情况,只能通过网络强制升级来解决,但这属于极端场景:
- 需要由网络管理员提交网络参数更新提案,将旧合约ID映射到新合约ID;
- 该操作需要网络中大部分节点的同意,且会强制所有节点完成升级,无需单个参与者授权;
- 这种方式必须严格遵循网络的治理规则,一般只用于合约出现严重漏洞等紧急情况。
内容的提问来源于stack exchange,提问作者Siddhartha Sengupta
相关产品推荐
相关产品推荐

