Не обратно совместимое обновление состояния в Corda с использованием SignatureConstraint - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу выполнить state обновление, не совместимое с предыдущими версиями, используя SignatureConstraint. Если бы это было обратно совместимое изменение, например, добавление свойства, я бы просто добавил свойство обнуляемого состояния, и это сработало бы. Однако я понятия не имею, как мне действовать в следующем сценарии ios:

Сценарий1: новое ненулевое поле добавляется в состояние

Сценарий2: поле было удалено из состояния

Сценарий3: поле было изменено в состоянии. Например, поле типа Date, преобразованное в объект, который содержит эту дату и некоторые другие поля.

Сценарий4: поле в состоянии было переименовано.

Проблема заключается в том, что явное обновление делает не поддерживается SignatureConstraint, и я получаю следующее сообщение об ошибке Legacy contract does not satisfy the upgraded contract's constraint, поэтому мне нужно найти решение для обновления implicity.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

ContractUpgradeFlow не поддерживает обновление состояния с помощью SignatureConstraint. Однако гибкость Signature Constraint позволяет добавлять любые CorDapps, если они подписаны одним и тем же ключом. Вы можете легко написать простой поток для mimi c ExplicitUpgrade для сценария, который вы упомянули.

Вот что вы можете сделать:

  • Добавьте оба файла jar corDapps (старый и обновляется) в папке узлов cordapps.
  • Напишите другой шнур приложения с потоком, который потребляет ваше существующее состояние и выводит новое состояние (обновленное).
  • Добавьте этот поток jar в папку узлов cordapps.
  • Выполните новый поток, чтобы использовать более старые состояния и вывести обновленное состояние.

Указывает на Примечание:

  • Убедитесь, что у вас есть правильный набор подписавших, чтобы избежать неправильного расходования штатов.
  • Это всего лишь общая идея. Фактический способ сделать это может быть немного сложным в зависимости от правил контракта для вашей транзакции Exit состояния.
  • Я бы предпочел добавить новую команду обновления, чтобы удовлетворить этот сценарий.

Вы могли бы получить общую идею и настроить на своем конце, чтобы выполнить обновление вашего сценария использования. , Надеюсь, это поможет!

0 голосов
/ 13 апреля 2020

В качестве обходного пути я сделал несовместимое изменение, чтобы стать совместимым. Вот как это работает.

Я создал состояние, которое имеет объект propertiesV1. Этот объект включает в себя все поля, которые должен CompanyState.

@CordaSerializable
@BelongsToContract(CompanyContract::class)
data class CompanyState(
        override val linearId: UniqueIdentifier,
        val propertiesV1: CompanyV1?
) : LinearState

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

@CordaSerializable
@BelongsToContract(CompanyContract::class)
data class CompanyState(
        override val linearId: UniqueIdentifier,
        val propertiesV1: CompanyV1?,
        val propertiesV2: CompanyV2?
) : LinearState

Ни контракт, ни потоки не изменены. Они просто обновляются для обработки поля propertiesV2.

...