일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 컨트렉트 동일한 함수이름 호출
- 체인의정석
- ethers websocket
- ethers type
- 스마트컨트렉트 예약어 함수이름 중복
- SBT표준
- 스마트컨트렉트테스트
- nestjs 튜토리얼
- 머신러닝기초
- 컨트렉트 배포 자동화
- rust 기초
- multicall
- 스마트컨트렉트 함수이름 중복 호출
- 러스트 기초 학습
- 프록시배포구조
- 스마트컨트렉트프록시
- ethers
- 러스트기초
- git rebase
- 스마트 컨트렉트 함수이름 중복
- ethers typescript
- 러스트 기초
- Vue.js
- chainlink 설명
- Vue
- nest.js설명
- ambiguous function description
- ethers v6
- 깃허브명령어
- vue기초
Archives
- Today
- Total
체인의정석
Upgradable 컨트렉트 작성 시 추가해야할것들 본문
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
반응형
'블록체인 > 퍼블릭 블록체인' 카테고리의 다른 글
Oasys testnet 사용방법 (0) | 2024.05.24 |
---|---|
sepolia base 테스트넷 사용방법 (0) | 2024.05.24 |
web3에서 트랜잭션 정보를 가져오는 방법들과 차이점(getTransactionReceipt, getTransaction, getBlock) (0) | 2023.02.23 |
CURG 특강) DVT 초안 (0) | 2023.01.28 |
Dapp 속도 최적화 시키는데 필수! Multicall 불러와서 상호작용하기 (0) | 2023.01.03 |
Comments