如何在不更改合约版本的情况下将stateV1升级到V2?
How to upgrade stateV1 to V2 without changing the Contract version?
我有一个 ObligationV1
和两个状态 ObligationStateV1
和 ObligationStateV2
。
如何在不更改合约版本的情况下实现 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
方法。
我有一个 ObligationV1
和两个状态 ObligationStateV1
和 ObligationStateV2
。
如何在不更改合约版本的情况下实现 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
方法。