How to SCORE #1

Declare & Initialize SCORE member variables

Joonyoung Choi
B!ock.Chain
9 min readApr 19, 2019

--

이번 시리즈를 이해하기 위해서는 Python 언어 및 ICON 이 제공하는 CLI 개발도구인 T-Bears 및 ICON SDK 활용법에 대한 약간의 사전지식이 필요합니다.

시리즈의 첫번째 파트에서는 SCORE 프로젝트 생성부터 SCORE 에서 사용할 변수를 선언 및 초기화하는 과정까지 살펴보겠습니다.

Table of Contents

SCORE 프로젝트

IconScoreBase

  • __init__
  • on_install
  • on_update

Hands-on Exercise

SCORE 프로젝트

SCORE 프로젝트를 생성하기 위해서는 갖추어야 할 구조가 있습니다.

SCORE 프로젝트의 구성

물론 직접 파일을 하나씩 생성하고, 내용을 채워가면서 구조를 맞춰갈 수도 있겠지만, T-Bears 를 통해 필수 뼈대를 갖춘 SCORE 프로젝트를 생성하는 것이 보다 효율적일 것입니다.

이미지는 tbears init sample_one SampleOne를 실행하면 자동으로 생성되는 SCORE 프로젝트의 뼈대에 해당합니다. tests 디렉토리는 SCORE를 테스트하기 위한 테스트 코드가 작성되어 있는 디렉토리로, 실제로 SCORE를 배포할때는 테스트와 관련된 내용이 포함되지 않습니다.

__init__.py : 해당 디렉토리가 Python 패키지라는 것을 의미합니다.

package.json : main_file, main_score, version 같은 SCORE와 관련된 데이터들을 기록합니다.

T-Bears 1.1.0.1 버전의 package.json을 기준으로 작성된 내용입니다.

sample_one.py : SCORE를 실제로 작성하는 Python 파일입니다. T-Bears 를 통해 간단하게 생성된 sample_one.py 를 보다 자세히 살펴보며 가장 기본적인 SCORE의 형태에 대해 살펴봅시다.

IconScoreBase

모든 SCORE 클래스는 생성된 SampleOne 같이 IconScoreBase 클래스를 상속받아야 합니다. IconScoreBase에 대해서는 앞으로 다가올 파트에서 보다 자세히 알아보는 것으로 하고, 이번 파트에서는 상속받은 클래스가 반드시 구현해야 하는 추상메소드들에 대해 살펴보도록 하겠습니다.

__init__

실행 시기 : 클래스의 생성자로 SCORE 클래스의 인스턴스가 생성될 때 마다 실행됩니다.

Usage : SCORE 내부에서 사용할 변수를 선언하기에 적합합니다. 따라서 데이터 저장 및 변경과 같은 쓰기 작업은 권장하지 않습니다. SCORE 에서 사용할 멤버 변수들은 모두 state DB에 의해 관리되어야 합니다.

def __init__(self, db: IconScoreDatabase) -> None:
super().__init__(db)

부모클래스의 __init__ 메소드를 반드시 호출해야 합니다.

on_install

실행 시기 : SCORE가 배포되는 순간 단 한번 실행됩니다.

Usage : __init__ 에서 선언한 변수들의 초기값을 설정하기에 적합합니다.

def on_install(self) -> None:
super().on_install()

부모클래스의 on_install 메소드를 반드시 호출해야 합니다.

on_update

실행 시기 : 기존에 배포된 SCORE 가 업데이트될 때 마다 실행됩니다.

Usage : 기존의 상태(state)들을 새로운 형태로 저장하기에 적합합니다.

def on_update(self) -> None:
super().on_update()

부모클래스의 on_update 메소드를 반드시 호출해야 합니다.

Hands-on Excercise

IconScoreBase의 추상메소드들이 어떠한 상황에서 어떠한 목적으로 사용되
는지 알아보았으니, 이제 코드를 통해 실제로 __init__on_install 메소드에서 사용할 변수가 어떻게 선언되고, 초기화되는지 알아봅시다.

아직 VarDB, ArrayDB, DictDB 와 같이 ICON 에서 제공하는 DB Abstraction 사용법에 대해서는 다루지 않았으니, 일단 예시를 따라서 작성해 봅시다.

from iconservice import *TAG = 'SampleOne'class SampleOne(IconScoreBase):
_OWNER_NAME = "owner_name"
def __init__(self, db: IconScoreDatabase) -> None:
super().__init__(db)
self._owner_name = VarDB(self._OWNER_NAME, db, str)
def on_install(self) -> None:
super().on_install()
self._owner_name.set("Life4honor")
def on_update(self) -> None:
super().on_update()
@external(readonly=True)
def hello(self) -> str:
return f"Hello {self._owner_name.get()}"

SCORE가 처음 배포될 때 on_install 메소드가 실행되며 self._owner_nameLife4honor 로 초기화합니다.

작성한 SCORE 를 T-Bears CLI 를 통해 로컬 T-Bears 환경에 배포하고 변수의 초기화 작업이 제대로 수행 되었는지 확인해 봅시다.

tbears deploy sample_one

tbears txresult 0x96ca69fb6b96ca21e0d13...

이어지는 실습을 위해 scoreAddress 를 반드시 기록해주세요.

편의를 위해 ICONex 를 활용하여 T-Bears 환경에 배포한 SCORE 의 메소드를 호출하여 결과를 확인합니다. 물론 T-Bears CLI 와 ICON SDK 도 메소드를 호출하여 결과를 확인할 수 있습니다.

ICONex 를 T-Bears 환경에 연결하기
ICONex 를 통해 hello 메소드 호출 결과 확인하기

업데이트를 통해 self._owner_name의 상태를 수정하고 작업이 제대로 수행 되었는지 확인해 봅시다.

def on_update(self) -> None:
super().on_update()
self._owner_name.set("Life4honor v2")
@external(readonly=True)
def hello(self) -> str:
return f"Hello {self._owner_name.get()}. Update Completed."

SCORE가 수정된 소스코드로 업데이트될 때 on_update 메소드가 실행되며 처음 on_install메소드에서 Life4honor 로 설정하였던 self._owner_nameLife4honor v2 로 재설정합니다.

tbears deploy -m update -o cx21322d25c2633... sample_one

tbears txresult 0x511599fb8fc144b0d0b4190...

ICONex 를 통해 수정된 hello 메소드 호출 결과 확인하기

이것으로 How to SCORE 시리즈의 첫번째 파트를 마치겠습니다.

다음 파트에서는 이번 파트에서 설명을 생략하고 넘어간 DB Abstraction 들에 대해 알아보고, 사용 방법까지 알아보도록 하겠습니다.

ICON 과 관련된 추가적인 질문사항이 있는 경우, ICON 의 공식 개발자포럼 혹은 페이스북 그룹에 질문하시면 답변을 얻으실 수 있습니다.

아이콘 공식 개발자포럼

Dive into ICON 페이스북 그룹

ICON Developers 유튜브 채널

--

--

Joonyoung Choi
B!ock.Chain

Blockchain / Java / Python / Developer / Researcher