eosBLACK 에어드랍(Airdrop) 따라잡기
eosBLACK 에어드랍(Airdrop) 따라잡기
안녕하세요. 이오스블랙팀입니다.
앞으로 이오스 블랙 개발팀에서는 EOSIO DApp 개발을 목표로 하는 개발자 분들께 도움이 될 수 있는 내용으로 연재를 하도록 하겠습니다. 오늘은 그 첫번째로, 지난달 진행했던 BLACK토큰의 에어드랍을 주제로 작성하겠습니다.
이 글을 읽기 전에 우선, EOS가 권고하는 OS환경이 준비되어야 하고 해당 OS에 EOS 소스를 다운 받아 빌드가 되어 있어야 합니다. 이 부분은 많은 분들의 글에서 소개가 되고 있으니 참고해서 준비하시기 바랍니다.
이제부터 설명드릴 내용은 EOS 1.0.8 버전을 기준으로 작성되었으며, C/C++을 컴파일하는 웹 어셈블리 기반인 스마트 컨트랙트이므로 C/C++ 관련 지식이 필요합니다. 초보 개발자도 누구나 에어드랍을 할 수 있도록 그 과정을 쉽게 설명하도록 하겠습니다. 전체 소스는 GitHub에 공개하고 있으니 참고 하시기 바랍니다.
에어드랍은 어렵거나 복잡하지 않으며 EOS에서 제공하는 기본 컨트랙트 명령으로 자신만의 토큰을 생성하여 배포할 수 있습니다. 그러나, 스마트한 개발자라면 효율적인 대응을 위해 토큰마다 정책을 추가하여 컨트랙트에 기능을 구현할 수 있습니다. 그래서 기본 준비 작업, 토큰 기능 추가, 에어드랍 실행, 이 3가지 단계를 진행하면 자신만의 토큰으로 고급스러운 에어드랍을 하실 수 있습니다. 처음부터 어렵게 느껴지실 수 있지만 이 글을 스텝별로 천천히 따라오시면 쉽게 이해가 될 것이라 믿습니다.
기본준비
기본 준비작업에는 토큰 컨트랙트 작성, 작성된 컨트랙트 코드 컴파일, 체인에 컨트랙트 올리기, 이 3단계가 있습니다. 이 과정을 STEP1~STEP3 까지 단계별로 설명하겠습니다.
STEP1. 컨트랙트 작성
EOS 토큰으로 에어드랍을 하기 위해서 맨 처음 해야 할 일은 해당 토큰에 맞는 컨트랙트를 작성해야 합니다. EOS 소스에는 기본적으로 eosio.token 컨트랙트 class를 제공하고 있는데, 이 class를 상속받아 아래 코드처럼 에어드랍을 하려는 토큰에 맞게 작성하시면 됩니다. 저희는 BLACK토큰이므로 아래와 같이 blacktoken class를 만들었습니다. 참고로 eosio.token 컨트랙트 class 는 EOS 소스의 ‘contracts/eosio.token’ 에 있으니 각자 한번 보시기 바랍니다.
컨트랙트의 주요 액션은 create, issue, transfer 이 3가지 입니다. 3가지에 대해서 간략히 설명하고 다음으로 넘어가도록 하겠습니다.
① 토큰 생성
void create( account_name issuer, asset maximum_supply );
issuer 계정으로 생성하게 되며 asset은 “10000 SYMBOL” “10.00 SYMBOL” 과 같은 포맷으로 전달해야 합니다. asset의 앞에 숫자는 최대 발행량이고 소수점 18자리까지 표현 가능하며, 뒤에 SYMBOL(토큰 이름)은 1~7자리의 대문자로 정의해야 합니다.
② 토큰 발행
void issue( account_name to, asset quantity, string memo );
수량(quantity)만큼 해당 계정(to)에 발행할 때 사용하며 발행에 대한 메모(memo)를 적을 수 있습니다.
③ 토큰 전달
void transfer( account_name from, account_name to, asset quantity, string memo );
한 계정(from)에서 다른 계정(to)으로 수량(quantity)만큼 전송할 때 사용합니다. 전달시에 메모(memo)를 적을 수 있습니다.
STEP2. 컴파일
소스 코드를 작성했으면 컴파일을 진행합니다. eos는 llvm과 abigen을 이용하여 wast, abi 파일을 차례로 생성하게 되는데, 이를 위해서는 eosiocpp라는 유틸리티를 사용하게 됩니다. eosiocpp 명령의 사용법과 옵션은 다음과 같고 해당 소스가 있는 경로에서 실행하시면 됩니다.
위의 설명처럼 두번에 걸쳐 명령을 실행하게 되는데, 먼저 eosiocpp -o 옵션을 사용 하여 웹 어셈블리(.wast, .wasm) 파일을 생성합니다.
그 다음으로 eosiocpp -g 옵션을 사용하여 abi(application binary interface) 파일을 생성하는 과정을 거치게 됩니다.
컴파일이 성공적으로 되었다면 ‘ls’ 명령으로 파일 목록에서 3개의 파일이 생성된 것을 확인 하실 수 있습니다.
STEP3. 컨트랙트 올리기
이제 cleos 명령으로 토큰을 발행할 EOS 계정에 컨트랙트를 올리면 되는데, 명령은 아래와 같습니다.
‘api_server_address’는 컨트랙트를 실행할 서버 주소이고 ‘계정’은 각자에 맞게 만들어서 실행하면 됩니다. 저희는 eosblackteam으로 계정을 만들었습니다. 이 계정은 실제 메인넷에서 토큰을 발행할 때 사용해야 하고 테스트를 위해서는 정글넷에 계정을 따로 만들어 사용하면 됩니다.
여기까지 하면 기본적인 토큰 발행 준비는 됩니다. 생각보다 정말 간단하죠?
그런데, 에어드랍시 상황에 따라 여러가지 필요한 조건들이 생길 수 있습니다. 예를 들어, 거래소 해킹에 대비한 기능, 블랙리스트 기능, 토큰에 대한 제한 등. 이런 조건들이 생기게 되면 해당 기능에 대한 추가적인 처리를 해줘야 합니다.
이제부터는 추가된 기능에 따른 처리를 어떻게 하는지 잠시 보도록 하겠습니다. 아시겠지만 추가된 기능을 위해 소스를 수정한 후에는 위에서 설명한 것처럼 STEP2.컴파일 단계를 다시 거쳐야 합니다.
추가기능
● 컨트랙트 정지/ 재시작 기능
● blacklist 등록/ 삭제 기능
● 토큰 추가 발행 기능
● 토큰 개수 삭제 기능
● 특정 기간 토큰 사용 개수 제한 기능
eosblackteam에서는 위와 같이 추가 기능 정책이 결정되었고 해당 정책에 따른 처리를 했습니다.
참고로, 블랙리스트 기능은 EOS에서도 제공하는데 따로 구현하는지 궁금해 하실 수 있습니다. 그 이유는 EOS에서 계정을 블랙리스트에 등록할 때까지 기다리는 것보다 컨트랙트에 기능을 추가하여 능동적으로 처리 하는 것이 더 효율적이기 때문입니다.
추가 기능 중에 ‘특정 기간 토큰 사용 개수 제한(홀드)’ 기능 구현을 간단히 살펴보겠습니다. 홀드 기능을 위해서는 토큰의 생성시점을 기준으로 비교하여 처리하면 되는데, 눈치가 빠르신 분은 아시겠지만 위의 예제 코드를 보면 create_time 이 private으로 추가된 것을 보실 수 있습니다.
토큰의 최초 생성 시점이 유지되어야 하는데, 위와 같이 하면 생성시마다 create_time이 현재 시간으로 할당되어 최초 시간이 유지가 안되기 때문에 생성시점을 비교하여 홀드기능을 처리하는데 문제가 생기게 됩니다. 그러면 어떻게 처리해야 할까요?
eos 라이브러리를 검색해 보면 개발자에게는 꽤 익숙한 singleton을 찾을 수 있습니다. private로 선언한 변수들을 아래와 같이 구조체로 만들고 singleton 에 구조체를 연결하면 됩니다. 그리고, abi로 데이터를 추출하기 위해 struct tokencfg 윗줄에 주석을 추가해야 합니다.
eosblackteam은 singleton 을 사용하여 처리하였는데, 만약 더 나은 방법을 알고 계신다면 댓글로 서로 공유해 주시면 좋을 것 같습니다.
에어드랍 실행
컨트랙트 생성 시간이 기록 되도록 하였으니, 정글넷에서 먼저 확인해야겠죠? 테스트로 만든 time.tarzan 계정을 사용하여 정글넷에서 아래와 같이 create명령으로 토큰을 생성해 봅니다. create와 issue 액션은 위에서 설명했기에 좀더 이해하기 쉬우실 겁니다.
토큰을 생성하도록 하였으니, 설정 값들이 제대로 설정 되었는지 확인해 봐야겠죠? 아래처럼 nodeos 메시지에서 설정 값들이 보입니다. 설정한 값 그대로 잘 출력되어 있는 것이 확인됩니다.
이제, 코드상으로는 준비가 끝났으므로 에어드랍을 위해 필요한 자원을 준비합니다. 보통 에어드랍은 제네시스 스넵샷 기준으로 발행하기 때문에 대상자가 무려 약 163,560 명 정도입니다. RAM을 계산해 봅시다.
레코드 사용량 * 대상자 + 컨트랙트 사이즈 이므로 대략, 163,560 x 240byte = 37.44MB + 300KB(약 38MB) 가 됩니다. 에어드랍 대상에 맞게 자원을 구매하면 발행할 준비는 완료된 것이고, 아래와 같이 issue 명령을 통해 토큰을 전송하면 모든 에어드랍 작업은 끝나게 됩니다.
에어드랍이 끝났습니다. 어렵지 않죠? ^^
주의할 점
. abi 추출시 주의
contract 작성 후 abi 파일을 추출하면 transfer 항목의 type이 name으로 추출됩니다. type을 name 으로 사용할 경우eos.transaction(‘code’, contract=> { contract.transaction(…) } ) 형태로 토큰을 전송할 때, authorization 부분이 채워지지 않는 문제가 있기 때문에 transaction authentication error 가 발생합니다. 그러므로, 반드시 abi 파일 추출 후transfer fields의 type을 name 이 아닌 account_name 으로 해야 합니다.
eosBLACK 팀의 에어드랍 소스 코드는 아래 GitHub주소를 통해 확인하실 수 있습니다.
소스 코드 : https://github.com/eosBLACK/airdrop
EOSIO 생태계 발전에 참여 하고 계신 모든 개발자 분들에게 저희 글이 작은 도움이 되었으면 하는 바람을 가져보며 계속해서 좋은 주제를 가지고 찾아뵙겠습니다.
감사합니다.
eosBLACK 팀 드림.
eosBLACK Homepage : http://eosblack.io
eosBLACK Koreos : http://koreos.io/eosBLACK
eosBLACK steemit : https://steemit.com/@eosblack
eosBLACK Facebook : https://www.facebook.com/eosBLACKTeam
eosBLACK twitter : https://twitter.com/EOSBLACK_IO
eosBLACK Telegram(Korean) : https://t.me/eosBLACK_Korea
eosBLACK Telegram(English) : https://t.me/eosBLACK_English
White Paper (Korean) : http://bitly.kr/nap2
White Paper (English) : http://bitly.kr/MOsA