ICON 스마트 컨트랙트 실용 예제 #1

in #blockchain3 years ago (edited)

안녕하세요. 블록체인 개발자 최재필입니다.

최근 ICON 기반 스마트 컨트랙트를 개발하고 있는데요. 아직 ICON 프로젝트에서 참고할 만한 스마트 컨트랙트 예제가 부족하다는 생각이 들어서, 도움이 될지 모르겠지만 제가 예제로 작성한 코드를 소개 및 공유 하려고 합니다.

이번 포스트에서는 "Upgradable Smart Contract"에 대해서 다루어 보려고 합니다. 이더리움에서는 스마트 컨트랙트의 업그레이드가 불가능하므로 어플리케이션 레벨에서 이를 해결하려는 방안들이 이미 다수 공유되어 있습니다. 참고로, 여기에 업그레이드 가능한 스마트 컨트랙트에 대한 여러가지 방안에 대해서 잘 정리되어 있습니다.

ICON 플랫폼에서는 스마트 컨트랙트(SCORE) 배포시 update 모드를 지원하므로 어플리케이션 레벨에서 굳이 고려하지 않아도 될 것 같습니다. 하지만, ICON에서 이더리움 네임 서비스(ENS)와 같은 기능이 아직 제공되지 않으므로 로직을 별도의 스마트 컨트랙트로 분리하고 네임 서비스와 버전 관리가 가능한 일종의 레지스트리 컨트랙트를 두면 관리적인 측면에서 유용할 수 있을 것 같습니다. 특히, 컨트랙트 로직 업그레이드 후 문제가 발견되어 이전 버전으로 롤백해야 하는 경우, 컨트랙트 배포 없이 함수 호출만으로 빠르게 처리 가능한 것이 유용할 것 같습니다.

그럼, 조금 더 구체적으로 들어가볼까요?

ICON SCORE에서 이더리움의 delagatcall과 같은 호출 기능을 제공하지 않으므로, 데이터의 분리는 불가능하고 로직의 분리만 가능합니다. 따라서, 아래와 같이 프록시 컨트랙트(Proxy Contract)와 로직 컨트랙트(Logic Contract), 로직 컨트랙트들이 등록되는 컨트랙트 레지스트리(Contract Registry)로 모듈을 구성할 수 있습니다.

스크린샷 2018-09-29 오후 5.09.36.png

스마트 컨트랙트 개발 및 운영자는 로직 배포 후, 컨트랙트 주소로 컨트랙트 레지스트리에 register/upgrade 할 수 있고, 필요한 경우 downgrade도 가능합니다. 프록시 컨트랙트는 컨트랙트 레지스트리에서 원하는 로직 컨트랙트의 이름으로 주소를 받아와서 호출할 수 있습니다.

예제 코드는 아래 링크를 통해서 확인하실 수 있습니다. Python 개발자라면, 블록체인 배경 지식과 ICON SCORE 개발 가이드를 먼저 공부하셔야 합니다. 참고로, ICON의 Audit을 받은 코드가 아니므로 참고용으로 사용해주세요. 그리고, json import하는 부분도 향후 정식으로 지원되면 수정 필요합니다.

다음 포스트에서는 탈중앙화된 "개인간 중고 물품 거래를 위한 스마트 컨트랙트 예제"에 대해서 공유할 예정입니다.

Coin Marketplace

STEEM 1.17
TRX 0.15
JST 0.156
BTC 63305.82
ETH 2298.77
BNB 569.45
SBD 9.21