【问题标题】:How to upgrade stateV1 to V2 without changing the Contract version?如何在不更改合约版本的情况下将 stateV1 升级到 V2?
【发布时间】:2018-06-29 17:47:01
【问题描述】:

我有一个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. 但是我看不到实现实际上如何证明新状态仍然指的是旧合同?

公开课 ObligationContractV2 : UpgradedContractWithLegacyConstraint { 覆盖 val legacyContract: ContractClassName = ObligationContractV1.id 覆盖 val legacyContractConstraint: AttachmentConstraint = AlwaysAcceptAttachmentConstraint 覆盖有趣的升级(oldState:ObligationStateV1)= ObligationContractV2.ObligationStateV2(oldState.a,oldState.b,0) 数据类 ObligationStateV2(val a: AbstractParty, val b: AbstractParty, val value:Int ) : ContractState { 覆盖 val 参与者 get() = listOf(a, b) } 覆盖有趣的验证(tx:LedgerTransaction){} }

【问题讨论】:

    标签: corda


    【解决方案1】:

    每当您升级状态时,合约类都必须更改,但它施加的规则可以保持不变。

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

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

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

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

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

    【讨论】:

    • 但这里的目的是在没有合约的情况下升级状态。如何在不需要升级合约版本的情况下做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2018-12-06
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多