
백엔드
Hardhat과 Hardhat-deploy를 이용한 upgradeable smart contract 개발 (상)
두줄요약
Hardhat-deploy와 OpenZeppelin Transparent Proxy로 업그레이더블 컨트랙트 배포 구조를 설명했습니다. initializer, delegatecall, storage 분리와 Etherscan 프록시 검증 방법을 다뤘습니다.
구조와 흐름
- Hardhat, hardhat-deploy, OpenZeppelin 업그레이더블 패키지 기반 프로젝트 설정
- Proxy의 storage와 Implementation의 로직을 분리한 Transparent Proxy 구조
- Proxy fallback에서 delegatecall로 Implementation 로직을 Proxy context에서 실행하는 호출 흐름
선택 이유
- constructor 대신 한 번만 실행 가능한 initializer로 상태 변수 초기화
- proxy 옵션의 owner·execute 설정을 통한 업그레이드 권한 관리와 초기화 실행
- 로직 주소만 교체하고 Proxy 주소와 저장 데이터는 유지하는 업그레이드 방식
주의할 점
- storage slot 원칙 위반 시 기존 변수 데이터 변경 또는 사용 불가 위험
- Implementation 주소 직접 호출 시 Proxy storage 기반 기능 미동작
- 업그레이드 가능한 패키지의 Initializable 상속 및 initializer modifier 필요
적용해볼 점
- hardhat-deploy 배포 후 Implementation, Proxy, DefaultProxyAdmin 컨트랙트 구성 확인
- Etherscan의 proxy verification으로 Read as Proxy·Write as Proxy 인터페이스 연동
- 후속 V2 컨트랙트에서 로직 변경과 함수 추가를 통한 업그레이드 수행

