solidity 프록시 패턴

오동재·2022년 9월 6일
2

https://blog.openzeppelin.com/proxy-patterns/

Proxy Patterns

이미 배포된 스마트 컨트랙트 코드를 업그레이드 할 수는 없지만 기본 로직이 업그레이드된 것처럼 새로 배포된 계약을 사용할 수 있도록 Proxy contract architect를 설정할 수 있다.
Proxy Architecture Pattern은 모든 메시지 호출이 최신 스마트 컨트랙트로 재연결(redirect)되는 proxy contract를 거치는 방식이다. 업그레이드를 위해 새 버전의 컨트렉트가 배포되고 proxy contract가 새 컨트랙트 주소를 참조하도록 업데이트 된다.

Proxy Patterns 종류

📌 Inherited Storage

Proxy와 Contract는 둘 다 proxy state 변수를 저장하기 위해 같은 스토리지 구조를 상속한다.

초기화 방법

  1. 스마트 컨트랙트 배포
  2. 컨트랙트(v1)의 초기 버전을 배포하고 업그레이드 가능한 컨트랙트를 상속하는지 확인
  3. 초기버전(v1)의 address를 registry에 등록
  4. registry컨트랙트에 UpgradeabilityProxy 인스턴스 생성 요청
  5. UpgradeabilityProxy 컨트랙트를 호출해 초기 버전으로 업그레이드

업그레이드 방법

  1. 프록시의 스토리지 구조와 컨트랙트의 초기 버전에 있는 스토리지 구조를 유지하도록 초기 버전을 상속하는 새 버전의 컨트랙트(v2)를 배포
  2. 새 버전의 계약읠 Registry에 등록
  3. UpgradeabilityProxy인스턴스를 호출하여 업그레이드

📌 Eternal Storage

스토리지 스키마는 프록시 및 컨트랙트가 상속되는 별도의 로직 컨트랙트에 정의된다. 스토리지 컨트랙트는 로직 컨트랙트가 필요로 하는 모든 상태 변수를 보유하고 있으며 프록시도 이를 알고 있기 때문에 덮어쓸 염려없이 upgradeability에 필요한 자체 상태 변수를 정의할 수 있다. 로직 컨트랙트의 모든 향후 버전은 다른 상태 변수를 정의해서는 안된다. 모든 버전의 논리 계약은 항상 처음에 정의된 eternal storage structure를 사용해야 한다.

초기화 방법

  1. EternalStorageProxy 인스턴스 배포
  2. 컨트랙트(v1) 초기버전 배포
  3. EternalStorageProxy를 호출하여 초기 버전의 주소로 업그레이드
  4. 로직 컨트랙트가 초기 상태를 설정하기 위해 생성자에 의존하는 경우, 프록시의 스토리지가 해당 값에 대해 알지 못하기 때문에 프록시에 연결된 후 다시 실행해야 함. upgradeToAndCall 함수는 프록시 업그레이드 후 설정을 다시 실행하기 위해 로직 컨트랙트의 일부 기능을 호출함

업그레이드 방법

  1. eternal storage structure를 유지하도록 새 버전의 계약(v2)을 배포
  2. EternalStorageProxy를 호출하여 업그레이드

📌 Unstructured Storage

EternalStorageProxy와 유사하지만 upgradeability과 관련된 변수를 상속하기 위한 로직 컨트랙트가 필요하지 않다. 이 패턴은 프록시 컨트랙트에 정의된 구조화되지 않은 스토리지 슬롯을 사용하여 upgradeability에 필요한 데이터를 저장한다.

초기화 방법

  1. OwnedUpgradeabilityProxy인스턴스 배포
  2. 계약(v1)의 초기 버전 배포
  3. OwnedUpgradeabilityProxy를 호출하여 초기 버전의 주소 업그레이드
  4. 로직 컨트랙트가 초기 상태를 설정하기 위해 생성자에 의존하는 경우 프록시의 스토리지가 해당 값을 알지 못하기 때문에 프록시에 연결한 후 다시 실행해야 한다. OwnedUpgradeabilityProxy는 업그레이드 후 설정을 다시 실행하기 위한 upgradeToAndCall 함수를 가지고 있다.

업그레이드 방법

  1. 새 버전의 계약(v2)을 배포하여 이전 버전에서 사용된 상태 변수 구조를 상속하는지 확인
  2. OwnedUpgradeabilityProxy를 호출하여 업그레이드
profile
https://donggni0712.tistory.com 로 이사했습니다~

0개의 댓글