EOS는 Ethereum과 달리 일반 사용자 계정과 스마트 컨트랙트 계정의 구분이 없습니다.
그래서 계정을 만들고 스마트 컨트랙트를 입히는 방법으로 만듭니다.
cleos set contract eosio contracts/eosio.bios -p eosio
cleos set contract eosio.token contracts/eosio.token -p eosio.token
cleos set contract 는 계정 하나에 하나의 스마트 컨트랙트를 입히는 명령어입니다.
cleos set contract 계정명 '스마트 컨트랙트 위치' [-p 계정 권한, 주로 앞에 계정명에 자동으로 매칭됨으로 필요할 때만 씀]
와 같은 순서로 지정됩니다. [] 괄호 안에 있는 것은 비필수적 요소입니다.
그리고 설정된 스마트 컨트랙트와 통신하기 위해서는 스마트 컨트랙트에 어떤 함수로 통신하는지 알고 있어야 하는데....
eosio.token의 스마트 컨트랙트를 알아볼려면 eos의 git 풀더(git clone 명령으로 생성된 풀더)의 contracts 풀더로 가서
eosio.token/eosio.token.hpp 를 확인하면
void create( account_name issuer,
asset maximum_supply,
uint8_t can_freeze,
uint8_t can_recall,
uint8_t can_whitelist );
void issue( account_name to, asset quantity, string memo );
void transfer( account_name from, account_name to, asset quantity, string memo );
한 클래스 내에 세 계의 함수가 있는 것을 확인을 할 수 있습니다.
eosio.token/eosio.token.cpp 에서는 마지막에 EOSIO_ABI 매크로를 통해 해당 클래스를 맵핑하는 것도 확인할 수 있습니다.
cleos push action eosio.token create '[ "eosio", "100000000000.0000 EOS", 0, 0, 0]' -p eosio.token
cleos push action eosio.token issue '[ "eosio", "100.0000 EOS", "memo"]' -p eosio
cleos push action eosio.token transfer '[ "eosio", "user", "100.0000 EOS", "memo"] -p eosio
전에 나왔던 마지막 설명할 시간 없다고 했던 명령어들 입니다.
그런데 저것들 중 함수명과 닮은 부분이 있는 것 같지 않나요?
아 몰론 클래스만 상속해서 짠다고 되는게 아니라 abi 포맷으로 만들어야 하는데 EOSIO_ABI 매크로가 하는 일입니다. 일단은 설명은 하지 않겠습니다.
cleos push action 명령어는 사용법으로는 스마트 컨트랙트 계정, 함수명, ' ' 로 패킹한 인수와 '-p' 권한 설정 (이제는 필수)의 순서로 지정합니다.
eosio.token 에서는 create로 토큰의 한계를 설정하고 issue를 통해 사용가능한 토큰으로 변환합니다. 그리고 transfer로 전송합니다.
이제 직접 user 계정에서 test 계정으로 토큰을 전송해보세요!
특이점으로는 asset이 숫자 토큰이름의 형식으로 지정됩니다. 정수로 되는게 아닙니다.
eos 에서는 트랜젝션이 하나의 일을 처리하는 것이 아닙니다.
트랜젝션이 액션들의 집합으로써 한번에 많은 일을 처리할 수 있습니다.
그런데 액션을 호출하면 하나의 트랜젝션에 집어넣는 것이라 별 문제는 없습니다.
복잡한 Dapp을 설계할 때 쓰이는 개념으로 예상되고 있다는 것만 알아두세요.
필수 스마트 컨트랙트 들을 적용하는 것을 적을 것 같은데
휴재 대신(1일 1스팀 연재 보팅지원 걸려서 @onehand) 월요병(사실 상 연재 시점 화요일 오전 1시 LOL) 기념으로 선유기지(
@seonyu-base)에 쳐들어가는 이야기 쓸려고 하는데... 스달이 될 지 궁금하다ㅋㅋㅋㅋㅋ
ps. 댓글 좀 써주라 ㅠㅠㅠㅠㅠ 외롭다!