Blockchain 使用SignatureConstraint在Corda中进行非向后兼容状态升级

Blockchain 使用SignatureConstraint在Corda中进行非向后兼容状态升级,blockchain,corda,Blockchain,Corda,我想使用签名约束执行非向后兼容的状态升级。如果是向后兼容的更改,例如添加一个属性,那么我只是在状态中添加了一个可为null的属性,这会起作用。但是,我不知道在以下情况下应该如何操作: 场景1:状态中添加了一个新的非空字段 场景2:一个字段已从状态中删除 场景3:状态中的字段已修改。例如,Date类型的字段转换为包含该日期和其他字段的对象 场景4:状态中的字段已重命名 问题是显式升级不支持签名约束,我得到以下错误消息旧合同不满足升级合同的约束,因此,我需要找到隐式升级的解决方案。ContractU

我想使用签名约束执行非向后兼容的
状态
升级。如果是向后兼容的更改,例如添加一个属性,那么我只是在状态中添加了一个可为null的属性,这会起作用。但是,我不知道在以下情况下应该如何操作:

场景1:状态中添加了一个新的非空字段

场景2:一个字段已从状态中删除

场景3:状态中的字段已修改。例如,
Date
类型的字段转换为包含该日期和其他字段的对象

场景4:状态中的字段已重命名


问题是显式升级不支持签名约束,我得到以下错误消息旧合同不满足升级合同的约束,因此,我需要找到隐式升级的解决方案。

ContractUpgradeFlow不支持使用SignatureConstraint升级状态。但是,签名约束的灵活性允许您添加任何CorDapps,只要它由相同的密钥签名。您可以很容易地编写一个简单的流来模拟您提到的场景的显式等级

以下是您可以做的:

  • 在nodes
    corDapps
    文件夹中添加两个corDapps jar文件(旧的和更新的)
  • 编写另一个cordapp,其中包含一个使用现有状态并输出新状态(升级状态)的流
  • 将此流jar添加到nodes
    cordapps
    文件夹
  • 执行新流以使用旧状态并输出升级状态
注意事项:

  • 确保有一套正确的签名人,以避免各州的不正确支出
  • 这只是一个总体想法。实际的方法可能会变得有点复杂,这取决于该州退出事务的合同规则
  • 我宁愿添加一个新的升级命令来适应这种情况

您可能已经有了总体想法,并在您的终端进行了调整,以执行用例的升级。希望这有帮助

作为一种解决方法,我将不兼容的更改变成了兼容的更改。下面是它的工作原理

我已经创建了一个具有propertiesV1对象的状态。此对象包括
CompanyState
应该包含的所有字段

@CordaSerializable
@BelongsToContract(CompanyContract::class)
data class CompanyState(
        override val linearId: UniqueIdentifier,
        val propertiesV1: CompanyV1?
) : LinearState
现在,当我需要对属性进行不兼容的更改时,我只需将对象的另一个版本添加到状态

@CordaSerializable
@BelongsToContract(CompanyContract::class)
data class CompanyState(
        override val linearId: UniqueIdentifier,
        val propertiesV1: CompanyV1?,
        val propertiesV2: CompanyV2?
) : LinearState
合同和流程都没有改变。它们只是被更新来处理propertiesV2字段