Protocol Ugprades
Sui 프로토콜, Framework, 그리고 실행 엔진은 새로운 기능 추가와 버그 개선을 위해 주기적으로 업데이트된다. 이러한 기능은 소프트웨어 베포의 일부로, Validator 운영자에게 배포되는 새로운 code 형태로 추가된다. Sui 프로토콜은 각 Transaction 실행 결과에 대한 모든 Validator 동의를 필요로 한다.
이는 다음과 같은 문제를 야기한다. 모든 운영자가 동시에 업그레이드할 수 없는 상황에서 Transaction 실행을 변경하는 코드는 어떻게 Release할 수 있을까? 또한 기능이 변경된 후에도 모든 Transaction 기록의 재생 여부는 어떻게 보장될까?
이 문제를 해결하기 위해 Sui는 '프로토콜 업그레이드'라고 불리는 Process를 사용한다.
Protocol upgrade process
Protocol Upgrade Process에는 다음과 같은 단계가 포함된다.
- 개발자는 새로운 기능을 구현하되, 처음에는 'false'로 설정된 Boolean 기능 플래그로 해당 기능에 대한 접근을 제한한다.
- 기능 플래그의 값은
ProtocolConfig라고 불리는 구조체에서 호출된다. - 개발자는 기능 플래그가 'true'로 설정된 새로운 버전의
ProtocolConfig구조체를 생성한다. - 새로운 버전의 Sui Validator 소프트웨어가 빌드되어 Validator 및 풀 노드 운영자에게 Release된다.
- Validator Process가 시작되면 플래그가 'false'로 설정된 이전 버전의
ProtocolConfig를 계속 사용한다. 모든 Validator는 새로운 소프트웨어의 유무와 관계없이 동일하게 작동한다. - Validator가 업그레이드되면, 새로운 버전의 Configuration(플래그 활성화)으로 전환할 준비가 되었음을 Validator 위원회에 알린다.
- 충분한 수의 Validator들이 새로운 프로토콜 버전으로 전환하는 데 투표하면, 새로운 버전은 다음 Epoch 시작 시점에 적용된다.
- 새로운 기능이 활성화된다.
풀 노드 운영자는 유사한 과정을 따르지만 투표에는 참여하지 않는다. 이들은 Validator들이 기록한 액션들을 따른다.
Validator가 새로운 프로토콜 버전으로 전환할 때, 그들은 특별한 Epoch 종료 Transaction에 새로운 버전 번호를 기록한다. 풀 노드는 체인 기록을 재생하면서 이 트랜잭션을 실행하며, 이를 통해 올바른 시점에 새로운 프로토콜 버전으로 전환할 수 있다.
Framework upgrades
Sui의 모든 새로운 기능이 Validator 코드 변경에서 비롯되는 것은 아니다. 개발자들은 Sui Framework를 확장하기도 한다. 예를 들어, Smart Contract에서 새로운 기능을 활용할 수 있도록 Native Function을 추가하기도 한다. Framework Upgrade Process는 Protocol Upgrade와 유사하다.
Sui Object는 기능 플래그 대신 Framework의 변경 사항을 조정한다. Sui Framework는 0x2
라는 ID를 가진 특별한 객체이다. Framework의 Move 소스 코드는 Validator Binary에 내장되어 있다.
만약 Validator가 내장된 Framework가 객체 0x2의 Framework와 상이함을 인지할 경우, 해당 Validator는 다른 Validator들에게 Framework를 신규 버전으로 업그레이드할 것을 요청한다.ProtocolConfig와 마찬가지로, 충분한 수의 Validator들이 동의하면, 새로운 Framework 객체는 현재 Epoch 종료 시점에 기록된다. 이후 새로운 Epoch에서 실행되는 Transaction들은 해당 Framework의 신규 버전을 사용하게 된다.