Untitled

Untitled

  1. 프록시 패턴은 업그레이드 가능한 스마트 컨트랙트를 구현하는 방법입니다.
  2. logic contract 앞에 proxy contract 를 두고,
  3. proxy 컨트랙트의 스토리지 데이터를 사용함으로써 logic contract가 업데이트 되더라도 기존의 데이터를 유지한 채 업데이트된 논리적 기능을 호출할 수 있는 방식입니다. (logic 컨트랙트에서 데이터를 읽을 때도 프록시 컨트랙트의 스토리지로부터 가져오고, 데이터를 write할 때에도 프록시의 스토리지에 기록합니다.)
  4. 사용자는 proxy contract로 프록시 컨트랙트에는 존재하지 않는 logic 컨트랙트의 함수를 호출하기 때문에, proxy contract 의 fallback 함수가 호출됩니다. proxy 컨트랙트의 fallback 함수는 logic contract 를 delegatecall 해서 user가 logic 컨트랙트를 호출한 것과 동일한 효과를 갖습니다.
  5. 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=