Как обновить внутреннюю структуру Versioned в Sui

В обновлённом пакете может появиться тип V2, хотя объекты всё ещё содержат данные V1. Контейнер Versioned позволяет заменить содержимое при сохранении идентичности внешнего объекта.

Преобразуйте данные в одной транзакции

В модуле типов V1 и V2 получите изменяемую ссылку Versioned и проверьте, что текущая версия равна 1. Извлечение возвращает старое значение и полномочие на смену версии. Используйте его при сохранении преобразованных данных под большим номером.

let (old, change) = state.remove_value_for_upgrade<V1>();
let V1 { count } = old;
let next = V2 { count, paused: false };
state.upgrade(2, next, change);

Проверьте сохранность данных и повторный вызов

Если до миграции count равнялся 18, чтение V2 должно вернуть 18 и paused равным false. Полномочие привязано к контейнеру, а новая версия должна быть больше старой. При массовом обновлении учитывайте достигнутую версию объектов и обрабатывайте повторы без попытки прочесть V2 как V1.

Источники