체인의정석

Upgradable 컨트렉트 작성 시 추가해야할것들 본문

블록체인/퍼블릭 블록체인

Upgradable 컨트렉트 작성 시 추가해야할것들

체인의정석 2023. 3. 28. 18:21
728x90
반응형

업그레이더블 컨트렉트를 사용할 시 기존의 컨트렉트에서 추가할 점에 대해서 정리해보겠다.

1. 오픈제플린의 Initializer 또는 Owner 사용시 Ownable Upgradable을 사용한다.

이때 컨트렉트가 들어간 폴더 명은 contracts로 해줘야 오픈제플린 모듈에서 인식이 된다. 안그러면 인식을 못하니 컨트렉트가 들어있는 폴더명을 함부로 바꾸지 말자

import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

contract Example is OwnableUpgradeable {

2. constructor에는 _disableInitializer를 명시해준다. initialize가 다시 되는것을 방지해 주는 것이다.

    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() {
        _disableInitializers();
    }

3. constructor대신 initializer를 작성하는데 이때 modifier에 initalizer를 걸어준다.

만약 업그레이드를 하는 경우라면 버전을 1부터 명시해서 reinitalizer(2) 이런식으로 버전을 관리하고 initialize함수도 initialize2 이런식으로 관리해준다.

    function initialize() public initializer {
        __Ownable_init();
    }

오픈제플린의 Initializable.sol 파일을 보면 사용 예시가 적혀있다.

이렇게 버전을 적게 되면 이미 적용된 버전인지 체크하고 결과값을 준다.

 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }

4. 업그레이드 할 시 상속사용?

상속을 사용하면 더 안전한 업그레이드가 가능하지만 그런 경우 제약이 생기는 경우도 있다.

그래서 불가피하다면 이전 코드를 그대로 넣고 추가할 부분만 추가한 후 reinitilizer에 버전만 잘 명시해 준 후 배포하면 된다.

728x90
반응형
Comments