如何在不更改合约版本的情况下将stateV1升级到V2?

How to upgrade stateV1 to V2 without changing the Contract version?

我有一个 ObligationV1 和两个状态 ObligationStateV1ObligationStateV2

如何在不更改合约版本的情况下实现 A state is upgraded while the contract stays the same. 状态从 V1 变为 V2。基于示例 exampleLink, docs

你有一个新的 ObligationContractV2,代码看起来会像这样?该示例试图实现 This CorDapp shows how to upgrade a state without upgrading the Contract. 但我不明白实施实际上如何证明新状态仍然指的是旧合同?

open class ObligationContractV2 : UpgradedContractWithLegacyConstraint {

    override val legacyContract: ContractClassName = ObligationContractV1.id

    override val legacyContractConstraint: AttachmentConstraint = AlwaysAcceptAttachmentConstraint

    override fun upgrade(oldState: ObligationStateV1) = ObligationContractV2.ObligationStateV2(oldState.a, oldState.b, 0)

    data class ObligationStateV2(val a: AbstractParty, val b: AbstractParty, val value:Int ) : ContractState {
        override val participants get() = listOf(a, b)
    }

    override fun verify(tx: LedgerTransaction) {}
}

无论何时升级状态,合同 class 都必须更改,但它施加的规则可以保持不变。

您可以通过将交易检查委托给旧合约来实现此目的:

override fun verify(tx: LedgerTransaction) {
    ObligationContractV1().verify()
}

您还可以将检查委托给旧合同,并添加额外的检查:

override fun verify(tx: LedgerTransaction) {
    ObligationContractV1().verify()
    additionalChecks()
}

但是,请注意,只有在原始合约未硬编码以根据旧状态验证交易时,以这种方式在升级状态时委派 verify 才有效。您必须根据由旧状态 class 和新状态 class 实现的某些接口或抽象 class 来编写原始合约,或者以其他方式编写旧状态以开放式方式签订合同。如果你最初没有以这种前瞻性的方式编写旧合约,你将不得不重写 verify 方法。