이미 배포된 스마트 컨트랙트 코드를 업그레이드 할 수는 없지만 기본 로직이 업그레이드된 것처럼 새로 배포된 계약을 사용할 수 있도록 Proxy contract architect를 설정할 수 있다.
Proxy Architecture Pattern은 모든 메시지 호출이 최신 스마트 컨트랙트로 재연결(redirect)되는 proxy contract를 거치는 방식이다. 업그레이드를 위해 새 버전의 컨트렉트가 배포되고 proxy contract가 새 컨트랙트 주소를 참조하도록 업데이트 된다.
Proxy와 Contract는 둘 다 proxy state 변수를 저장하기 위해 같은 스토리지 구조를 상속한다.
registry
에 등록registry
컨트랙트에 UpgradeabilityProxy
인스턴스 생성 요청UpgradeabilityProxy
컨트랙트를 호출해 초기 버전으로 업그레이드Registry
에 등록UpgradeabilityProxy
인스턴스를 호출하여 업그레이드스토리지 스키마는 프록시 및 컨트랙트가 상속되는 별도의 로직 컨트랙트에 정의된다. 스토리지 컨트랙트는 로직 컨트랙트가 필요로 하는 모든 상태 변수를 보유하고 있으며 프록시도 이를 알고 있기 때문에 덮어쓸 염려없이 upgradeability
에 필요한 자체 상태 변수를 정의할 수 있다. 로직 컨트랙트의 모든 향후 버전은 다른 상태 변수를 정의해서는 안된다. 모든 버전의 논리 계약은 항상 처음에 정의된 eternal storage structure를 사용해야 한다.
EternalStorageProxy
인스턴스 배포EternalStorageProxy
를 호출하여 초기 버전의 주소로 업그레이드upgradeToAndCall
함수는 프록시 업그레이드 후 설정을 다시 실행하기 위해 로직 컨트랙트의 일부 기능을 호출함EternalStorageProxy와 유사하지만 upgradeability과 관련된 변수를 상속하기 위한 로직 컨트랙트가 필요하지 않다. 이 패턴은 프록시 컨트랙트에 정의된 구조화되지 않은 스토리지 슬롯을 사용하여 upgradeability에 필요한 데이터를 저장한다.
OwnedUpgradeabilityProxy
인스턴스 배포OwnedUpgradeabilityProxy
를 호출하여 초기 버전의 주소 업그레이드OwnedUpgradeabilityProxy
는 업그레이드 후 설정을 다시 실행하기 위한 upgradeToAndCall
함수를 가지고 있다.OwnedUpgradeabilityProxy
를 호출하여 업그레이드