5.2 EOSIO.CDT

2018년 9월 20일. EOSIO에서는 EOSIO v1.3.0을 릴리스하면서 EOSIO.CDT (CDT : Contract Develope Toolkit) 를 정식으로 소개했습니다. EOSIO.CDT는 웹 어셈블리(WASM)를 위한 도구모음이며, EOSIO 플랫폼의 Contract 작성을 용이하게 해줍니다.기존의 EOSIO EOS에서 발생하던 eosiocpp 오류를 해결했으며, wasm 웹어셈블리 파일의 크기를 줄여서 Contract 배포 비용을 절감시켜줍니다. eosiocpp 는 유지되어도 앞으로의 개선은 EOSIO.CDT에서 이루어 질 것이므로, 사용법을 알아두시길 추천드립니다.

EOSIO.CDT 설치

EOSIO.CDT는 EOSIO EOS와 같은 환경의 확장 버전 개념이 아니라, 완전히 다른 환경입니다. 때문에 따로 설치를 해서 사용해야 합니다.
설치 방법으로는 Binary Releases 방식으로 명령어를 통해 설치하는 방법과, Git을 이용하여 복사를 한 뒤 설치하는 방법 2가지가 있습니다.

Binary Releases 설치

EOSIO.CDT는 현재 Mac OS X brew, Linux x86_64 Debian Packages, Linux x86_64 RPM packages 에서만 지원됩니다. 설치를 진행하기 전에, 이미 설치된 EOSIO.CDT가 존재한다면 먼저 삭제해야 합니다. 설치는 운영체제에 따라 다음과 같습니다.

Mac OS X Brew Install

$ brew tap eosio/eosio.cdt $ brew install eosio.cdt

Mac OS X Brew Install

$ brew remove eosio.cdt

Debian Package Install

$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.1/eosio.cdt-1.4.1.x86_64.deb $ sudo apt install ./eosio.cdt-1.4.1.x86_64.deb

Debian Package Uninstall

$ sudo apt remove eosio.cdt

RPM Package Install

$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.1/eosio.cdt-1.4.1.x86_64-0.x86_64.rpm $ sudo yum install ./eosio.cdt-1.4.1.x86_64-0.x86_64.rpm

RPM Package Uninstall

$ sudo yum remove eosio.cdt

Git을 이용한 설치

Git에서 EOSIO.CDT 파일을 복사해서 직접 build 하는 방법입니다. 다음의 명령어로 Git에서 파일을 복사합니다

$ git clone --recursive https://github.com/eosio/eosio.cdt

Eosio.cdt 폴더로 이동한 뒤, build를 합니다.

$ cd eosio.cd $ ./build.sh

Build가 끝나면 다음의 명령어로 설치를 합니다.

$ sudo ./install.sh

스마트 컨트랙트

Action의 등록

기존의 eosiocpp의 Action 등록은 다음과 같습니다.

#include 

using namespace eosio;

class hello : public eosio::contract {
 public:
     using contract::contract;

     //@abi action
     void hi( account_name user );
};

// @abi action
abi 파일이 action을 인식하게 하기 위해서, 각각의 action위에 //@abi action 주석을 추가해줘야 했습니다.

eosio.cdt에서 다음의 방법으로 변경되었습니다.

#include 

using namespace eosio;

class hello : public eosio::contract {
 public:
     using contract::contract;

     [[eosio::action]]
     void hi( account_name user );
};

[[eosio::action]]

다음의 방법으로도 가능합니다.

#include 

using namespace eosio;

class hello : public eosio::contract {
 public:
     using contract::contract;

     __attribute__((eosio_action))
     void hi( account_name user );
};

__attribute__((eosio_action))

Table의 등록

기존의 eosiocpp의 Table 등록은 다음과 같습니다.

//@abi table accounts i64
struct account {
  asset balance;
  uint64_t primary_key()const { return balance.symbol.name(); }
};

//@abi table

eosio.cdt에서 다음의 방법으로 변경되었습니다.

struct [[eosio::table]] account {
  asset balance;
  uint64_t primary_key()const { return balance.symbol.name(); }
};

struct [[eosio::table]] account

기존에는 Table선언시 Table명도 함께 명시해 주었기 때문에 하나의 multi_index에 매칭되는 Table이 하나만 존재했습니다. 하지만 EOSIO.CDT에서는 Table명을 명시하지 않아도 되므로, 하나의 Table 구조체를 다수의 multi_index에서 서로 다른 Table명으로 사용할 수 있습니다. [[eosio::table(“table_name”)]] 를 사용하여 Table명을 명시하여 사용할 수도 있습니다.

Table 등록은 다음과 같은 방법으로도 가능합니다.

struct __attribute__((eosio_table)) account {
  asset balance;
  uint64_t primary_key()const { return balance.symbol.name(); }
};

struct __attribute__((eosio_table)) account

abi, wasm 파일 생성

기존에 사용하던 EOSIO와 EOSIO.CDT와의 가장 큰 차이는 abi, wasm 파일을 생성하는데 있습니다. 기존에는 다음과 같이 eosiocpp 를 사용해서 생성했습니다.

Eosiocpp 명령어를 사용하여 파일을 생성하며, wasm 파일과 abi 파일을 eosiocpp 의 옵션을 변경하여 따로 생성해줘야 했습니다. EOSIO.CDT에서는 eosiocpp 명령어 대신 eosio-cpp 명령어를 사용합니다. Smart Contract를 cpp, hpp 파일로 분리하지 않고 cpp파일로만 제작한 경우에는, eosio-cpp 명령어를 이용하여 다음의 명령어로 wasm파일과 abi파일을 한번에 생성할 수 있습니다.

Eosio-cpp 명령어로 한번에 두개의 파일을 생성한다는 장점도 있지만, 가장 큰 장점은 wasm 파일의 크기가 줄어든다는 것입니다. Wasm파일의 용량 감소는 Smart Contract 배포 비용의 절감으로 연결되기 때문에 굉장한 장점으로 작용합니다. Cpp파일과 hpp파일이 분리되어 wasm 파일과 abi파일을 따로 생성해야 할 경우에는 다음의 명령어를 사용합니다.

--abigen 옵션을 제거하면 wasm파일만 생성할 수 있습니다. Abi 파일만 생성할 경우에는 다음의 명령어를 사용합니다.

Eosio-cpp 명령어가 아닌 eosio-abigen 명령어를 사용하여 abi파일을 생성할 수 있습니다.

Cleos Command 부록

명령어 설명
Create key 키 쌍을 새로 만들고, public과 private 키를 출력해줍니다.
$cleos create key
Create account 블록 체인에 새 계정을 만듭니다.
$cleos create account 생성해주는계정 지을계정 Ownerkey ActiveKey
Get info 현재 블록 체인의 단순 상태정보를 보여줍니다.
$cleos get info
Get block 블록 체인에서 전체블록을 검색합니다.
$cleos get block 블록넘버
Get account 블록 체인에서 계정을 가져옵니다.
$cleos get account 계정
Get code 계정의 코드와 ABI를 검색합니다.
$cleos get code 컨트랙트명
Get table 테이블의 내용을 검색합니다.
$cleos get table 컨트랙트명 스코프 테이블명
Get currency balance 계정이 들고 있는 토큰 잔액을 검색합니다.
$cleos get currency balance 컨트랙트명 계정명 토큰명
Get currency stats 주어진 토큰의 정보를 가져옵니다.
$cleos get currency stats 컨트랙트명 토큰명
Get accounts 정의한 Public키와 연관된 모든 계정을 검색합니다.
$cleos get accounts 퍼블릭키
Get transaction 블록 체인에서 해당 트랜잭션을 검색합니다.
$cleos get transaction 트랜잭션값
Get actions 해당 컨트랙트에 있는 액션이 실행된 모든 작업을 검색합니다.
$cleos get actions 컨트랙트명
Set contract 컨트랙트를 블록 체인에 배포하거나 업데이트 합니다.
$cleos set contract 계정명 ./컨트랙트.wasm ./컨트랙트.abi
Set account permission 계정의 권한을 생성하거나 업데이트 합니다.
$cleos set account permission 권한을줄계정 active 권한을받을계정 owner -p 권한줄계정@owner
Set action permission Action의 권한을 생성하거나 업데이트 합니다.
$cleos set action permission @계정 @컨트랙트 액션명 권한종류
transfer 토큰을 전송합니다.
$cleos transfer 보낼계정 받을계정 “토큰”
Wallet create 지갑을 생성합니다.
$cleos wallet create -n 지갑이름
Wallet open 지갑을 엽니다.
$cleos wallet open -n 지갑이름
Wallet lock 지갑을 잠급니다.
$cleos wallet lock -n 지갑이름
Wallet lock_all 모든 지갑을 잠급니다.
$cleos wallet lock_all
Wallet unlock 지갑의 잠금을 해제합니다.
$cleos wallet unlock -n 지갑이름
Wallet import 지갑에 Private키를 임포트 합니다.
$cleos wallet import Private키
Wallet list 지갑의 목록을 가져옵니다.
$cleos wallet list
Wallet keys 지갑의 키 값을 확인합니다.
$cleos wallet keys
Wallet create_key 지갑 내에 키 쌍을 생성해 줍니다.
$cleos wallet create_key -n 지갑이름
Wallet private_key 지갑의 키 쌍을 조회합니다. 지갑이 해제 되어야하고 암호를 입력해야 합니다.
$cleos wallet private_keys
Push action 컨트랙트의 액션을 트랜잭션으로 푸시합니다.
$cleos push action 컨트랙트명 액션명 ‘[”인자1 인자2 … 인자n”]’ -p 실행자권한

Prev | Next