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

时间:2018-06-25 10:07:35

标签: corda

我有一个ObligationV1和两个状态ObligationStateV1ObligationStateV2

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

在拥有新的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) {}
}

1 个答案:

答案 0 :(得分:1)

每次升级状态时,合同类都必须更改,但是其施加的规则可以保持不变。

您可以通过将事务检查委托给旧合同来实现:

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

您还可以将支票委托给旧合同,并添加其他支票:

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

但是,请注意,在升级状态时以这种方式委派verify仅在未对原始合同进行硬编码以按照旧状态验证交易的情况下才有效。您必须根据旧状态类和新状态类都实现的某些接口或抽象类来编写原始合同,或者以其他方式以开放式方式编写旧合同。如果您最初没有以这种前瞻性的方式编写旧合同,则必须重新编写verify方法。