EOSIO.CDT (컨트랙트 개발 툴킷)

in eso •  6 years ago  (edited)

_eosBLACK_thumbnail_2000 1030_kr.jpg

안녕하세요. eosBLACK 팀입니다.

오늘은 개발 일지 3번째로, 변경된 EOSIO.CDT에 대해서 알아 보도록 하겠습니다. 2018년 8월 15일 v1.2.0 이 발표되면서, 컨트랙트 빌드 스크립트인 eosiocpp 가 EOSIO v1.3.0 부터 더 이상 사용되지 않을 것이라는 소식이 전해진 바 있습니다. 그리고 지난 9월 20일, EOSIO는 EOSIO v1.3.0 이 릴리즈 되면서 컨트랙트 작성을 용이하게 해주는 EOSIO.CDT를 정식으로 소개하였습니다.

참고 : https://github.com/EOSIO/eosio.cdt

참고로, eosiocpp 가 당장 사라지지는 않는다고 하지만, 앞으로의 개선은 EOSIO.CDT에서 이루어질 테니 미리미리 개발 환경을 옮겨두는 편이 좋을 듯 하며 이 글은 윈도 10의 wsl에서 우분투 16.04를 설치한 뒤 eosio.cdt v1.2.0 을 기반으로 작성 되었습니다.

설치하기

 
●소스 복제
먼저 소스를 복제 해 옵니다. 태그 중 v1.2.0을 체크아웃 하였습니다.

그림1.png

빌드 및 설치 방법
코어 심볼을 'EOS'로 지정했습니다.

그림2.png

설치 경로는 '/usr/local/eosio.cdt/' 입니다. '/usr/local/bin' 에 관련 명령어들이 심볼릭 링크됩니다. 가장 큰 차이점은 eosiocpp 대신 eosio-cpp 가 사용된다는 것입니다. 세부적인 차이점은 실제 예제를 통해 알아보도록 하겠습니다.

간단한 예제로 확인해보자

 
다음과 같은 간단한 컨트랙트 예제를 만들어 봅시다.

mytest.hpp

그림3.png

mytest.cpp

그림4.png

예전 방식과 비교를 위해 먼저 eosiocpp 로 빌드 해 봅니다.

그림5.png

출력된 mytest.wasm 의 크기는 3,059 바이트 입니다. ABI 출력도 잘 됩니다. 이번에는 오늘의 주인공인 eosio-cpp 을 사용해 보겠습니다.

그림6.png

출력된 mytest.wasm 의 크기가 2,392 바이트 입니다. 뒤에서 살펴보겠지만, 동일한 -O3 옵션이 전달되는데도 컴파일 결과의 상당한 다이어트가 눈에 띕니다. EOSIO 에서 컨트랙트의 크기는 곧 비용과 직결되므로 작아진 크기 만으로도 옮겨갈 이유는 충분하다고 하겠습니다. 문제는 ABI 파일인데, 네. 텅 비었습니다. 아무것도 출력되지 않네요. eosio-abigen 이 예전 방식의 '주석' 을 인식하지 못하기 때문인데, 일단 이 ABI부터 제대로 생성해 봅시다.

좀 더 자세히 살펴 보자

 
ABI 생성
예전 방식의 eosiocpp 의 경우, 액션 또는 테이블에 다음과 같이 주석을 달아 ABI 정보를 출력할 수 있습니다.

그림7.png

변경된 eosio-cpp 의 경우는 C++11 의 attribute 를 사용해 출력할 ABI를 기술합니다.

그림8.png

또는

그림9.png

앞에서 문제가 되었던 mytest.hpp 를 변경된 규칙에 맞춰 다음과 같이 수정 해 보겠습니다.

그림10.png

다시 빌드 해 보면, 제대로 출력된 ABI를 볼 수 있습니다.

ABI 생성 심화
‘~/eosio.cdt/example/abigen_test/test.cpp’ 에 ABI 생성 방법에 대한 예제가 들어있습니다.
컴파일 후 각 경우에 따라 정리 해 보겠습니다.

먼저 구조체의 액션 정의 입니다.

그림11.png

출력 결과는 다음과 같습니다.

그림12.png

다음은 상속된 구조체의 이름을 명시 하는 경우 입니다. 액션/테이블 타입은 32개 문자열(‘.12345abcdefghijklmnopqrstuvwxyz’) 사용할 수 있으며, 64비트 정수로 인코딩 됩니다. 최대 13자까지 작성 가능하며, 12자리 까지는 32개 문자열을 사용할 수 있고 13번째 문자는 ‘1-5’와 ‘a-j’로만 작성해야 합니다. 코딩할 때 이런 제한은 답답함을 유발하는데, 내부 코드와 외부 인터페이스의 이름을 다르게 하면 이 부분이 많이 해소되지요. 구조체 선언과 ABI의 노출 이름을 다르게 할 경우, 다음과 같이 명시할 수 있습니다.

그림13.png

출력 결과는 다음과 같습니다.

그림14.png

이제 함수의 액션 정의 방법을 살펴보겠습니다. 액션의 이름을 명시해 출력하는 예 입니다.

그림15.png

출력 결과는 다음과 같습니다.

그림16.png

정의된 이름을 그대로 사용하는 예 입니다. 전달되는 인자값이 앞에서 정의한 test_c 형인 것도 주의해서 보시기 바랍니다.

그림17.png

마지막으로 테이블 정의 입니다. 동일한 구조체로 두 개의 다른 멀티인덱스 테이블을 정의하는 예를 살펴보겠습니다.

그림18.png

출력 결과는 다음과 같습니다.

그림19.png

테이블의 이름을 명시한 예 입니다.

그림20.png

출력 결과는 다음과 같습니다.

그림21.png

동작 살펴보기

 
eosio.cdt 환경은 한마디로, wasm32를 타겟으로 하는 clang 툴체인에 대한 인터프리터 입니다. 셸 스크립트로 제공되던 eosiocpp 를 C++로 변경한 것이라고 봐도 무방합니다. 빌드 과정에서 관련 디렉토리들, 특히 부스트의 include 경로같은 것들이 현재 시스템에 귀속되기 때문에, 컴파일된 eosio-cpp, eosio-ld 등의 실행파일을 다른 컴퓨터에 옮겨서 사용하는 것이 쉽지 않습니다. 때문에 eosio-cpp 가 실제 clang 툴체인에 어떤 파라미터를 전달하는지 파악해두는 것도 상당히 의미있는 작업이 될 것입니다.

eosio-cpp 의 소스는 ~/eosio.cdt/build/EosioClang-prefix/src/EosioClang-build/eosio-cpp.cpp 에서 살펴볼 수 있습니다.
~/eosio.cdt/eosio_llvm/tools/clang/tools/extra/eosio_c_tool/eosio-cpp.cpp.in 파일이 빌드 과정에서 현재 로컬 환경에 맞추어 변환된 것입니다. 나머지 eosio-ld.cpp, eosio-abigen.cpp 등의 소스들도 마찬가지 입니다.

컨트랙트 소스의 컴파일에는 clang++ 을, 링크에는 eosio-ld 를, abi 생성에는 eosio-abigen 을 호출합니다. 각 단계에서 커맨드라인이 어떻게 전달되는지 살펴보기 위해 eosio-cpp과 eosio-ld의 instr, linkstr, genstr 등등을 콘솔에 출력 해 보았습니다.

그림22.png

다시 빌드한 뒤 mytest.cpp 을 컴파일 해 보았습니다.

그림23.png

앞에서 언급했듯이 최적화 옵션은 “-O3” 가 전달되고 있습니다.

eosio-abigen.cpp 소스를 살펴보면, 전달되는 대부분의 옵션이 소스코드 자체에 이미 기록되어 있는 것을 알 수 있습니다. 따라서 예전 “eosiocpp -g” 처럼 ABI만 생성하기 위해서는 다음과 같이 간단한 명령줄을 사용할 수 있습니다.

그림24.png

한가지 이상한 것은, eosio-abigen 경로가 이미 PATH에 걸려있는데도, 실행 경로를 생략하면 다음과 같은 에러가 출력된다는 것입니다.

그림25.png

파라미터 전달부분은 지금도 계속 수정되고 있으므로 곧 고쳐질 것으로 보입니다. eosio-cpp 의 옵션중 눈에 띄는 것은 -I 인데, 외부 헤더파일을 사용할 때 경로를 지정하는 역할을 하며 다음과 같이 사용할 수 있습니다.

그림26.png

이 옵션은 clang++ 을 호출할 때 -I 인자로 잘 전달되지만

그림27.png

abigen 에서는 생략되어 버립니다.

그림28.png

eosio-xx 커맨드에서 더블대시 “ — “ 는 툴체인에 직접 명령을 전달하는 옵션입니다. 때문에 다음과 같이 해 주면 가능할까 싶어 시도 해 봤는데

그림29.png

컴파일에서는 제대로 전달되지만

그림30.png

abigen 단계 에서는 엉뚱하게도 앞부분에 박혀버립니다.

그림31.png

따라서 외부 헤더를 사용할 때는 위에서 살펴본 대로 eosio-abigen 을 직접 호출하면서 더블대시로 추가옵션을 주는 방법을 사용해야 합니다.

그림32.png

이 글을 작성한 직후 v1.2.1 이 릴리즈 되었습니다. -I 파라미터가 전달되지 않는 문제가 수정되었다고 하네요.
https://github.com/EOSIO/eosio.cdt/releases/tag/v1.2.1

마무리

 
eosio 는 아직 젊습니다. eosiocpp 에 대시가 추가되어 eosio-cpp 가 되는 과정도 머뭇거림이 없고 과감합니다. 아무쪼록 이 글이 변화무쌍한 eosio 에서 즐거운 개발이 되는데 작은 나침반이 되기를 바랍니다.

감사합니다.

eosBLACK 팀 드림.

eosBLACK Contact
eosBLACK Homepage : http://eosblack.io
eosBLACK Koreos : http://koreos.io/eosBLACK
eosBLACK Medium : https://medium.com/@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!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!