You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何升级单参与者所有但含多参与者列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:37