EOS 로컬 개발 환경 구성

in #coinkorea6 years ago (edited)

EOS 로컬 개발 환경 구성

<p dir="auto"><a href="https://github.com/EOSIO/eos/releases/tag/v1.0.0" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">EOSIO 1.0.0이 출시되었다. <p dir="auto"><span>공식 문서인 <a href="https://github.com/EOSIO/eos/wiki/Local-Environment" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/EOSIO/eos/wiki/Local-Environment 를 기준으로 약간의 커스터마이징과 과도한 친절함을 가미했다. <p dir="auto">참고로 이 글은 EOSIO 1.0.0의 바로 앞 버전인 <a href="https://github.com/EOSIO/eos/releases/tag/dawn-v4.2.0" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">EOSIO Dawn 4.2를 기준으로 작성되었으나 EOSIO 1.0.0 에서도 그대로 적용할 수 있다. <h2>EOSIO 아키텍처 <p dir="auto">EOSIO는 여러개의 컴포넌트로 구성되어 있다. 가장 중요한 3가지는 다음과 같다. <ul> <li><code>nodeos: 서버 사이드 블록체인 노드 <li><code>cleos: 블록체인과의 상호작용 및 지갑 관리 컴포넌트인 <code>keosd에 대한 CLI(명령행 인터페이스) <li><code>keosd: EOSIO 지갑 관리 컴포넌트 <p dir="auto">위 3가지 컴포넌트의 관계는 다음 그림과 같다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/6rtKs0Z.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/6rtKs0Z.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/6rtKs0Z.png 2x" /> <h2>사전 조건 <h3>OS <p dir="auto">공식 문서에 아래와 같이 안내 되어 있다. 이 문서는 Linux Mint 18.3에서 빌드하고 작성했다. <ol> <li>Amazon 2017.09 and higher. <li>Centos 7. <li>Fedora 25 and higher (Fedora 27 recommended). <li>Mint 18. <li>Ubuntu 16.04 (Ubuntu 16.10 recommended). <li>MacOS Darwin 10.12 and higher (MacOS 10.13.x recommended). <h3>용량 <ul> <li>RAM: 8G 이상 <li>Disk: 20G 이상 <h2>소스 가져오기 <p dir="auto">문서에는 EOSIO의 리포지토리를 직접 clone하도록 안내하고 있지만, Pull Request도 보내면서 개발하려면 각자 fork 뜬 리포지토리를 clone하는 것이 좋다. <p dir="auto">각자 fork 뜬 리포지토리의 URL을 <code>https://github.com/YOUR_USERNAME/eos라고 하면, 다음과 같이 clone 하면 된다. <blockquote> <p dir="auto"><span>$ git clone <a href="https://github.com/YOUR_USERNAME/eos" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/YOUR_USERNAME/eos --recursive <h2>빌드 <p dir="auto">EOSIO 에서 제공하는 빌드 스크립트를 실행하면 된다. <blockquote> <p dir="auto">$ cd eos <p dir="auto">$ ./eosio_build.sh <h3>자잘한 버그 수정 <blockquote> <p dir="auto">아래 기술한 빌드 스크립트 에러는 이미 Pull Request가 받아들여져서 현재 릴리스 버전인 EOSIO 1.0.1 에서는 발생하지 않으나, 참고로 내용만 남겨둔다. <p dir="auto">그런데 우분투 용 빌드 스크립트에는 의존 관계 구성 관련 사소한 버그가 있어서, 빌드 스크립트를 살짝 고치고 Pull Request를 날려두었다. <p dir="auto"><span><a href="https://github.com/EOSIO/eos/pull/2979/files" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/EOSIO/eos/pull/2979/files <p dir="auto">이 글을 보는 시점에 Pull Request가 반영되어있다면 아래 내용은 무시하고 다음 단원으로 건너뛰면 된다. <p dir="auto">원본 그대로 실행하면 먼저 다음과 같이 라이브러리를 설치해야 한다는 안내가 나온다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/FdCnNY9.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/FdCnNY9.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/FdCnNY9.png 2x" /> <p dir="auto">메시지가 살짝 깨져 나오지만 일단 넘어가고, 1 을 입력하고 엔터를 치면 설치가 안 되고 다음과 같은 에러가 난다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/9EyuWR0.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/9EyuWR0.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/9EyuWR0.png 2x" /> <p dir="auto">위의 Pull Request 링크를 참고해서 <code>scripts/eosio_build_ubuntu.sh파일을 수정하고 다시 <code>./eosio_build.sh를 실행해서, 라이브러리 설치 문의 시 1을 입력하고 엔터를 치면 다음과 같이 라이브러리 설치가 정상적으로 진행된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/uI88CPW.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/uI88CPW.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/uI88CPW.png 2x" /> <h2>기다림 <p dir="auto">라이브러리 설치 후 Boost, mongoDB, LLVM 등도 빌드하는데 넉넉 잡아 120분 정도 소요되었다. 느긋한 기다림이 필요하다. 생산 되는 로그량도 20,000라인을 넘는다. <p dir="auto">몇 가지 화면 캡처를 떠놨으니 미리 구경해보자. <h3>Boost <p dir="auto">별 문제없이 설치된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/QS1BX2K.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/QS1BX2K.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/QS1BX2K.png 2x" /> <h3>mongoDB <p dir="auto">별 문제없이 설치된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/TgsjIC5.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/TgsjIC5.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/TgsjIC5.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/KhhsDyP.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/KhhsDyP.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/KhhsDyP.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/AvnGEG0.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/AvnGEG0.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/AvnGEG0.png 2x" /> <h3>secp256k1-zkp <p dir="auto">mongoDB 설치까지 완료된 후 지루할만 하니 에러가 나준다(이것도 Pull Request가 받아들여져서 더는 발생하지 않을 것이다). <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/HqkYJ7q.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/HqkYJ7q.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/HqkYJ7q.png 2x" /> <p dir="auto"><code>aclocal이 없다는 얘긴데 <code>automake를 설치하면 해결된다. <blockquote> <p dir="auto">$ sudo apt install automake <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/Dy1kTfc.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/Dy1kTfc.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/Dy1kTfc.png 2x" /> <p dir="auto"><code>automake 설치 완료 되면 다시 <code>./eosio_build.sh를 실행한다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/tkyTrmz.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/tkyTrmz.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/tkyTrmz.png 2x" /> <p dir="auto">아까 받아둔 파일이 있어서 문제라고 하니 개뿐하게 지워주고, 다시 <code>./eosio_build.sh를 실행한다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/QBGDIzg.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/QBGDIzg.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/QBGDIzg.png 2x" /> <h3>LLVM <p dir="auto">이제 secp256k1-zkp도 깔끔하게 설치되고 다음 단계인 LLVM으로 넘어간다. LLVM은 별 문제없이 설치된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/KOsUI6Q.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/KOsUI6Q.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/KOsUI6Q.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/zICvgid.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/zICvgid.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/zICvgid.png 2x" /> <h3>EOSIO <p dir="auto">이제 드디어 EOSIO 설치로 넘어간다. EOSIO는 별 문제없이 설치된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/wcPRLJl.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/wcPRLJl.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/wcPRLJl.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/G4bcK1s.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/G4bcK1s.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/G4bcK1s.png 2x" /> <p dir="auto">드디어 빌드가 완성 되었다. 총 90분 정도 걸렸다고 나오는데, 중간에 오류 나기 전에 설치되는 것들까지 감안하면 CPU i5-2500 3.3GHz, RAM 8G 정도로 넉넉잡아 2시간은 걸린 것 같다. <h2>테스트 <p dir="auto">위 빌드 결과에 안내해준 대로 테스트를 수행해보자. <blockquote> <p dir="auto">export PATH=${HOME}/opt/mongodb/bin:$PATH <p dir="auto">/home/hanmomhanda/opt/mongodb/bin/mongod -f /home/hanmomhanda/opt/mongodb/mongod.conf & <p dir="auto">cd /home/hanmomhanda/gitRepo/crypto/eos/build <p dir="auto">make test <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/EVWbJK4.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/EVWbJK4.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/EVWbJK4.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/SQh7tA0.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/SQh7tA0.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/SQh7tA0.png 2x" /> <p dir="auto">테스트도 시간은 10여분 정도 걸렸지만 문제없이 모두 통과한다. <h2>설치 <p dir="auto"><code>/eos/build 디렉터리에서 <code>sudo make install을 실행해서 설치하면 실행 파일이 <code>/usr/local/bin에 설치된다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/jgB2MUx.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/jgB2MUx.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/jgB2MUx.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/lu1eUF2.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/lu1eUF2.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/lu1eUF2.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/ljgjYaO.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/ljgjYaO.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/ljgjYaO.png 2x" /> <h2>원본 리포지토리(upstream)와 Fork 리포지토리 Sync <h3>upstream remote 추가 <p dir="auto"><span><a href="https://help.github.com/articles/configuring-a-remote-for-a-fork/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://help.github.com/articles/configuring-a-remote-for-a-fork/ 를 참고해서 다음을 실행한다. <ol> <li><p dir="auto">현재 remote 확인 <blockquote> <p dir="auto">$ git remote -v <pre><code>origin https://github.com/YOUR_USERNAME/eos.git (fetch) origin https://github.com/YOUR_USERNAME/eos.git (push) <li><p dir="auto">원본 리포지토리를 가리키는 upstream 추가 <blockquote> <p dir="auto"><span>$ git remote add upstream <a href="https://github.com/EOSIO/eos.git" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/EOSIO/eos.git <li><p dir="auto">upstream 확인 <blockquote> <p dir="auto">$ git remote -v <pre><code>origin https://github.com/YOUR_USERNAME/eos.git (fetch) origin https://github.com/YOUR_USERNAME/eos.git (push) upstream https://github.com/EOSIO/eos.git (fetch) upstream https://github.com/EOSIO/eos.git (push) <h3>원본 리포지토리와 Sync <p dir="auto">EOSIO 프로젝트가 진행되면서 버전이 올라가면 로컬 개발 환경의 버전도 맞춰줘야 한다. <p dir="auto">그냥 일반적인 remote 리포지토리와 Sync하는 것과 다르지 않다. <p dir="auto"><code>git merge 뿐아니라 <code>git rebase도 물론 쓸 수 있다.<span><a href="https://help.github.com/articles/syncing-a-fork/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://help.github.com/articles/syncing-a-fork/ 를 참고하되, <p dir="auto">로컬의 master 브랜치에서 다음과 같이 <code>git fetch upstream으로 EOSIO 의 최신 내용을 가져온다. <blockquote> <p dir="auto">git fetch upstream <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/LNdlV8e.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/LNdlV8e.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/LNdlV8e.png 2x" /> <p dir="auto">rebase로 EOSIO의 최신 버전을 베이스로 설정한다(merge도 가능). <blockquote> <p dir="auto">git rebase upstream/master <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/iKwaDpp.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/iKwaDpp.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/iKwaDpp.png 2x" /> <p dir="auto">다음 명령으로 submodule도 업데이트한다. <blockquote> <p dir="auto">git submodule update --init --recursive <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/HMxnI2o.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/HMxnI2o.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/HMxnI2o.png 2x" /> <p dir="auto">추적하지 않는 파일이라고 표시된 파일은 IDE(Clion)과 테스트 설정 파일로 무시하거나 <code>.gitignore에 추가해서 버전관리 대상에서 제외하면 된다. <h3>Fork 리포지토리 Sync <p dir="auto">원본 리포지토리와 Sync를 완료한 로컬 리포지토리에서 다음 명령으로 Fork 리포지토리로 강제 푸쉬를 날리면 된다. <blockquote> <p dir="auto">git push -f origin master <h2>새 버전으로 다시 빌드 <p dir="auto">빌드 스크립트로 새 버전을 다시 빌드한다. <blockquote> <p dir="auto">./eosio_build.sh <p dir="auto">boost 등 의존 라이브러리 버전이 변경된 경우 재설치하므로 20분 가량 소요되며, boost 버전 관련 다음과 같은 에러가 발생한다(발생하지 않으면 boost 버전 변경 작업 불필요). <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/e5ML3FO.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/e5ML3FO.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/e5ML3FO.png 2x" /> <p dir="auto"><code>~/.bashrc에 지정해둔 boost 관련 버전을 1.67로 변경해준다. <pre><code>export BOOST_ROOT=~/opt/boost_1_67_0 export BOOST_INCLUDEDIR=~/opt/boost_1_67_0/include <p dir="auto">이전 버전의 빌드 캐시가 남아있는 build 디렉터리를 삭제하고 다시 빌드 스크립트를 실행하면 약 15분 후 빌드가 성공적으로 마무리 된다. <blockquote> <p dir="auto">rm -rf build/ <p dir="auto">./eosio_build.sh <p dir="auto"><img src="https://images.hive.blog/768x0/https://i.imgur.com/Lz3OG75.png" alt="Imgur" srcset="https://images.hive.blog/768x0/https://i.imgur.com/Lz3OG75.png 1x, https://images.hive.blog/1536x0/https://i.imgur.com/Lz3OG75.png 2x" /> <p dir="auto">빌드 후 테스트는 앞에서 서술한 테스트 과정을 그대로 반복하면 된다. <p dir="auto">이것으로 로컬 환경에서 EOSIO 소스를 빌드하는 작업을 마쳤다. 다음에는 EOS Single Node Testnet을 실행해보자.