Как обновить состояние V1 до V2 без изменения версии контракта? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть 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) {}
}

1 Ответ

0 голосов
/ 26 июня 2018

Класс контракта должен изменяться всякий раз, когда вы обновляете состояние, но налагаемые им правила могут оставаться прежними.

Этого можно достичь, делегировав проверку транзакции старому контракту:

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

Вы также можете делегировать проверку старому контракту и добавить дополнительные проверки:

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

Однако учтите, что делегирование verify таким образом при обновлении состояний будет работать только в том случае, если исходный контракт не установлен.Твердо закодирован для проверки транзакции в терминах старого состояния.Вам придется написать исходный контракт в терминах некоторого интерфейса или абстрактного класса, реализованного как старым классом состояний, так и новым классом состояний, или каким-либо другим способом написать старый контракт открытым способом.Если вы изначально не писали старый контракт таким дальновидным способом, вам придется переписать метод verify.

...