솔리디티로 스마트 계약을 한번 배포하고 나면, 이를 수정해서 배포하기에 어려운 경우가 있다.

예를 들면, 토큰을 10억개 발행했다면 이를 다시 배포하면 새로운 토큰이 되므로 수정배포할 수가 없다.

 

한번 배포한 토큰 10억개를 계속해서 사용할 수 있도록, 로직만 재배포 하면서 업그레이드 해야한다.

 

이를 위해서 고려할 만한 몇가지 방법이 있는데, 현재까지 파악한 수준에서 나열해 보면 다음과 같다.

 

1. 다른 컨트랙트에서 특정 컨트랙트를 호출 : REF

 

Contract A를 배포하고,

Contract B에서 A를 이용만하는 구조이다.

 

Contract A에 storage변수 및 몇몇 함수 저장하고, Contract B에서 지속적으로 이용할 수 있다.

 

<필요사항>

Contract B 생성자에서 Contract A의 배포된 주소가 필요.

Contract B 에서 Contract A를 호출하기 위해, A의 간단한 ABI가 필요 -> 즉 A의 함수만 포함한 간단한 껍데기 Contract 필요.

 

 

2. Library 사용

라이브러리는 컨트랙트와 유사하지만, 한번 배포 후 다양한 컨트랙트에서 재사용하는것이 목적이다.

단점은 라이브러리는 상태변수(storage변수)를 가질 수 없다.

- 따라서 토큰의 재활용과 같은 기능은 구현하기 어렵다.

 

3. deletegateCall  : REF

- fallback함수를 이용해서, 자기 컨트랙트에 없는 함수를 실행하는 방법이다. 

 

proxy 컨트랙트를 이용해, 항상 proxy컨트랙트를 호출하지만 proxy컨트랙트에 함수가 없는 경우

다른 컨트랙트를 자동으로 호출하는 방법이다.

 

사용법:

 - contract.at( proxy Address) 를 해서 instance를 가져온 후, instance.함수 호출 방법으로 실행한다. 

 

단점:

- 상태변수(storage 변수)가 재대로 관리되는지 확인이 필요한다. 아직 이 부분이 잘 되는지 의심이 가서

테스트 중에 있다.

 

 

총평:

현재로서는 1번 방식이 가장 간단한 방법이다.

단, 1번 방식의 경우 Contract A안에 있는 mapping등을 Contract B에서 마음껏 사용하기가 어렵기 때문에

 

3번 방식을 사용하는 것이 좋아 보인다.

3번방식이 상속된 컨트랙트가 부모 컨트랙트의 상태변수를 재사용하지 못하고 새로 만드는 문제는 있으므로,

3번 방식의 경우에도 Contract A안에 모든 mapping변수들을 넣어놓고, Cotract A-> Contract B함수 호출시
Contract A안의 mapping 및 상태변수들이 제대로 이용되는지 확인이 필요하다. 
즉 A의 Context를 이용해 B를 이용하는 것인데, truffle test에서는 잘 되는 걸 확인했으나, web3.js를 이용해서는

아직 잘 호출이 안되고 있다. (호출 확인시 update예정)

 

 

 

 

Posted by yongary
,