[IT/기술] 이미 배포된 스마트 컨트렉트에서 대량으로 ownable 함수를 실행할 때의 Tip!

Ownable Class

ICO를 마무리하고 나면, 개발팀 및 사업개발팀은 예상치 못한 많은 일을 겪게 된다. 개발팀은 이미 배포되어 있는 토큰 컨트랙트에 ownable 함수를 대량으로 실행해야 할 수도 있는데, 토큰을 release 하기 전에 미리 예측을 했다면 문제가 없지만, 그렇지 않은 경우가 대다수이기 때문이다. 이는 setTranferAgent()일 수도 있고, transferFrom() 일 수도 있다.

Ownable은 Solidity의 프로그램 패턴 중에 하나이다(https://solidity.readthedocs.io/en/v0.4.25/common-patterns.html). 이 함수를 상속받은 후, 함수 옆에 onlyOwner(소유자만 사용) 라고 지정(function modifier)하면 클래스에서 Owner(소유자)만이 프로그램을 실행할 수 있게 된다. 그리고 여기서 Owner(소유자)는 스마트 컨트랙트에 생성된 주소로 설정되는 것이 일반적이며, OpenZeppelin( https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol)에서 제작된 버전이 자주 사용되고 있다.

Problem

Ownable의 문제점은 오리지널이 아닌 다른 스마트 컨트랙트(smart contract)에서 프로그램 함수를 호출하는 것이 불가능하다는 것이다. 같은 지갑 주소에서 생성되었다면 가능할 것 같지만 그렇지 않다. 스마트 컨트렉트를 생성하고 오리지널 컨트렉트에 이를 실행하고자 할 때, 새로운 스마트 컨트렉트를 만든 이가 오너가 되지 않고 새롭게 생성된 컨트렉트 자체가 오너가 되기 때문이다.

현재 스마트 컨트렉트의 creator가 본인이면서 sender를 기각하고 함수를 실행하는 방법은 없는 것으로 알고 있다. 따라서 onlyOwner가 붙은 함수를 다른 스마트 컨트렉트에서 실행하려면 다른 무언가를 해야만 한다.

가장 간단한 방법은 스크립트를 만들어서 실행하는 것이다. 그러나 이에도 문제가 있다. 스크립트를 owner가 실행하려면 일반적으로 hardware wallet을 사용하는데, 스크립트에서 하드웨어 월렛을 연결하는 것뿐만 아니라 개발자들이 실제 하드웨어 월렛(일반적으로 굉장히 많은 자산이 들어있는)을 주고받으면서 개발하는 것이 쉽지 않기 때문이다.

What we did

우리는 이를 특별한 디자인 패턴을 만들어서 해결하였다. 새로 만든 컨트렉트에 오너십을 부여하고, 원하는 함수를 실행한 다음 다시 오너십을 본래의 홀더에게 수동 혹은 자동으로 돌려주는 방식이다.

ted blog.png

이는 간단하게 들릴 수 있으나, 실행하는데 큰 리스크를 갖고 있다. 따라서 우리는 다양한 상태와 조건을 가지고 테스트를 진행하였다. 한번 컨트렉트의 오너십을 잘못 바꾸면 다시는 오너십을 가지고 올 수 없으며, 토큰을 업그레이드하는 등의 다른 대응이 어려워질 수 있기 때문이다.

또한 몇 가지 안전장치를 추가로 마련하였는데, 오너십을 받은 주소로만 다시 오너십을 되돌려주는 기능을 추가하였다. 이런 방식은 실수로 주소를 잘못 입력하거나 함수가 잘못 호출되었을 때의 최악의 상황을 막아준다.

오너십을 전송할 때는 항상 두 번 세번 이상 확인한 뒤, 컨트렉트를 실행하는 것을 추천한다.

ted blog1.png

앞으로도 인슈어리움에서 진행되는 대부분의 프로젝트는 공개로 진행할 예정이니 관련 소식은 인슈어리움의 다양한 채널을 통해 확인하시기 바랍니다.

인슈어리움 대표
김경태

Note: 저희가 사용한 컨트랙트는 TokenMarketNet을 기본으로 하며, 팀에서 수정한 사항은Hosho그룹에게 감사를 받았습니다.

Join Our Community

Insureum Homepage: https://insureum.co
Kakaotalk: https://open.kakao.com/o/ggNWf8K
Facebook: https://www.facebook.com/ziktokorea
Instagram: https://www.instagram.com/insureum_by_zikto
Telegram (Korean): https://t.me/insureum_korea

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center