특정 팔레트의 저장소를 수정하고 새로운 저장소 레이아웃으로 마이그레이션하기 위한 준비 방법을 설명합니다.
이 가이드는 FRAME Nicks 팔레트를 수정하여 특정 팔레트에 대한 저장소 마이그레이션을 수행하는 방법을 설명합니다. 이 튜토리얼에서는 옵션 필드를 포함하는 마지막 이름을 포함하는 저장소 맵을 수정하고, 이후 런타임 업그레이드로 트리거할 수 있는 마이그레이션 함수를 작성합니다. 이러한 유형의 간단한 저장소 마이그레이션은 변경 사항이 특정 팔레트와 개별 저장소 항목에 제한되는 경우에 사용할 수 있습니다. 더 복잡한 데이터 마이그레이션에 대해서는 이 튜토리얼에서 설명하는 것보다 더 복잡한 마이그레이션 함수를 작성하고 마이그레이션을 테스트하기 위해 추가 도구를 사용해야 합니다.
새로운 데이터 구조체를 추가하고 저장소에 이름과 선택적인 성을 모두 포함하도록 수정한 후에는 Nicks 팔레트 함수를 업데이트하여 새로운 last: Option<BoundedVec<u8>> 매개변수 선언을 포함해야 합니다. 대부분의 경우, 저장소 항목을 수정할 때 함수를 업데이트하려면 변경 사항을 처리하기 위해 일부 로직을 추가해야 합니다. 예를 들어, 매개변수 이름을 수정하거나 새 변수를 추가해야 할 수 있습니다.
이 경우에는 set_name 및 force_name 함수에서 대부분의 변경 사항이 필요합니다. 예를 들어, set_name 함수를 수정하여 bounded_name을 bounded_first로 변경하고 다음과 같은 코드로 bounded_last 선언을 추가할 수 있습니다:
pallet::pallet 매크로는 traits::GetStorageVersion을 구현하지만 현재 저장소 버전은 매크로에 전달되어야 합니다. 이를 위해 pallet::storage_version 매크로를 사용할 수 있습니다.
/// 현재 저장소 버전, 새 버전으로 2를 설정합니다.const STORAGE_VERSION:StorageVersion=StorageVersion::new(2); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)]pubstructPallet<T>(_);
마이그레이션 모듈 선언
마이그레이션 모듈은 두 부분으로 구성되어야 합니다:
마이그레이션할 이전 저장소를 나타내는 모듈
마이그레이션 함수로 가중치를 반환하는 함수
src/pallets/nicks/migration.rs에 새 파일을 생성합니다.
이 모듈의 구조는 다음과 같습니다:
pubmod migration {use super::*;pubmod v1 {...} // V1 저장소 형식만 포함pubfnmigrate_to_v2<T:Config>() ->Weight {...} // 저장소를 V2 형식으로 변환하는 체크 및 변환 로직}
migrate_to_v2 작성
이 함수가 수행해야 할 작업에 대한 개요입니다:
마이그레이션이 필요한지 확인하기 위해 저장소 버전을 확인합니다(좋은 습관).
저장소 값을 새로운 저장소 형식으로 변환합니다.
저장소 버전을 업데이트합니다.
마이그레이션에 소비된 가중치를 반환합니다.
저장소 버전 확인
마이그레이션 로직을 migrate_to_v2 주위에 구성합니다. 저장소 마이그레이션이 필요하지 않은 경우 0을 반환합니다:
let onchain_version =Pallet::<T>::on_chain_storage_version();if onchain_version <2 { }else {// 여기서는 아무 작업도 수행하지 않습니다.Weight::zero() }
저장소 값을 변환
translate storage 메서드를 사용하여 저장소 값을 새 형식으로 변환합니다. 기존 저장소의 nick 값은 공백으로 구분된 문자열일 수 있으므로, ' '에서 분할하여 새로운 last 저장소 항목에 그 이후의 모든 것을 배치합니다. 그렇지 않은 경우 last는 None 값을 가집니다: