

- 프록시 패턴은 업그레이드 가능한 스마트 컨트랙트를 구현하는 방법입니다.
- logic contract 앞에 proxy contract 를 두고,
- proxy 컨트랙트의 스토리지 데이터를 사용함으로써 logic contract가 업데이트 되더라도 기존의 데이터를 유지한 채 업데이트된 논리적 기능을 호출할 수 있는 방식입니다.
(logic 컨트랙트에서 데이터를 읽을 때도 프록시 컨트랙트의 스토리지로부터 가져오고, 데이터를 write할 때에도 프록시의 스토리지에 기록합니다.)
- 사용자는 proxy contract로 프록시 컨트랙트에는 존재하지 않는 logic 컨트랙트의 함수를 호출하기 때문에, proxy contract 의 fallback 함수가 호출됩니다. proxy 컨트랙트의 fallback 함수는 logic contract 를 delegatecall 해서 user가 logic 컨트랙트를 호출한 것과 동일한 효과를 갖습니다.
- logic contract 를 업데이트할 때에는 관리가자 ProxyAdmin 컨트랙트의 관리자만 호출 가능한 upgrade 함수를 통해서 새로운 기능의 logic contract 를 배포하고 이후에는 proxy contract 가 새롭게 업그레이드된 logic contract 를 호출합니다.
패키지 설치
npm i @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan @openzeppelin/hardhat-upgrades ethers hardhat
npm i -D @openzeppelin/contracts @openzeppelin/contracts-upgradeable
Logic Contract 작성
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
contract Box {
uint256 public val;
// constructor(uint _val) {
// val = _val;
// }
function initialize(uint256 _val) external {
val = _val;
}
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
contract BoxV2 {
uint256 public val;
// function initialize(uint _val) external {
// val = _val;
// }
function inc() external {
val += 1;
}
}
V1 배포 스크립트 작성
// .env
INFURA_API_KEY=
ETHERSCAN_API_KEY=
PRI_KEY=