EOS 로컬 개발환경 구성

in #kr7 years ago (edited)

EOS 로컬 개발환경 구성

안녕하세요, 블록체인을 이제 막 공부하기 시작한 @woojin.joe 입니다. 블록체인을 공부하기 시작하면서 그동안 비트코인, 이더리움의 클라이언트 소스코드를 가볍게 살펴보고 각각 로컬에서 테스트 넷을 띄워봤습니다. 오늘은 EOS 소스를 받아서 설치하고 테스트 노드를 실행한 과정을 공유합니다.

설치 준비사항

개발환경 설치 문서

로컬 개발환경 구성에 대한 내용은 다음 EOS 공식 위키에 자세하게 설명되어 있습니다. 이 글의 설치과정 또한 아래 문서의 내용을 그대로 따라한 것입니다.

https://github.com/EOSIO/eos/wiki/Local-Environment

설치 버전 및 환경

로컬 개발환경 설치를 위한 소스는 글 쓰는 시점의 최신 커밋인 410501a 입니다. 개발환경은 현재 일부Linux 배포판 과 Mac만 지원합니다. 저는 테스트 할 때만 사용할 목적으로 AWS에서 EC2를 사용했습니다. EOS의 빌드스크립트가 지원하는 배포판에 "Amazon 2017.09 and higher"가 명시되어 있어 설치에 문제가 없습니다.

EOS에서 요구하는 시스템 사양 중 RAM 8GB 이상이 포함되어 있어 프리티어인 t2.micro 사양은 쓸 수 없고 t2.xlarge (4cpu, 16GB)를 선택했습니다. 요금은 서울 리전 기준 스토리지는 프리티어만큼 30GB EBS를 사용했고 10시간 정도 테스트할 걸 감안하면 1700원 정도 될 것 같습니다.

소스 빌드 & 설치

EC2 생성 후 SSH 접속하여 제일 먼저 git을 설치합니다.

$ sudo yum install git


이제 git에서 EOS 소스를 받습니다. EOS는 몇몇 리파지토리를 의존하고 있기 때문에 리파지토리 클론 시 --recursive 옵션을 반드시 붙여야 합니다.

$ git clone https://github.com/EOSIO/eos --recursive


소스를 다운 받은 후 매뉴얼에서 제안하는 대로 eosio_build.sh를 실행합니다. 스크립트는 클론한 eos 폴더 안에 있습니다.

$ cd eos
$ ./eosio_build.sh


자 이제 상당히 오랜 시간 동안 빌드 작업이 진행됩니다. 저는 빌드하는데 약 2시간 5분 가량 걸렸습니다. 빌드하는데 오랜 시간이 필요한 이유는 EOS에서 요구하는 여러 패키지들을 추가로 설치해야 하기 때문입니다. 이제 빌드 스크립트 소스를 한 번 가볍게 살펴보면서 어떤 패키지들이 설치되는지 알아보겠습니다.

OS 분기

eosio_build.sh의 내용을 보면 코드 38번 라인에서 uname 명령을 통해 현재 OS 정보를 ARCH 변수에 저장한 것을 확인할 수 있습니다.

ARCH=$( uname )


이후 코드 67번 라인과 133번 라인에서 각각 ARCH 변수에 저장된 값에 따라 "Linux"와 "Mac"에 해당하는 설정을 별도로 진행하는 것을 확인할 수 있습니다. 이 글에서 우리는 Amazon Linux 이미지를 설치했으니 67번 if 문 안을 살펴봐야겠습니다. 여기서 리눅스 배포판별로 한 번더 분기가 이뤄집니다. 코드 81번 라인에서 다음과 같이 OS_NAME 변수에 현재 배포판의 정보를 저장합니다.

OS_NAME=$( cat /etc/os-release | grep ^NAME | cut -d'=' -f2 | sed 's/\"//gI' )


이제 코드 83-126번 라인에서 OS_NAME에 저장된 배포판의 이름에 따라 별도의 각 배포판에 맞는 설정 변수를 저장합니다. 이후 코드 128-130번 라인에서 공통 변수를 선언합니다. 배포판 별로 선언된 변수 중에서 중요한 변수는 FILE 변수 입니다. 이 변수에 실제 배포판별로 별도의 설치 빌드 스크립트가 존재합니다. Amzon Linux의 경우에는 코드 85번 라인에서 scripts/eosio_build_amazon.sh 파일을 사용하는 것을 확인할 수 있습니다.

EOS의 의존 패키지 확인하기

scripts 폴더의 eosio_build_amazon.sh 에서 하는 일은 시스템 요구사항 확인과 의존 패키지 설치입니다.

시스템 요구사항 체크

코드 1-35번 라인을 보면 차례대로 OS의 버전, 현재 머신의 메모리, Cpu 코어 수, 디스크 용량 등을 확인하여 EOS에서 요구하는 시스템 최소 사양을 만족하는지 확인합니다. 체크하는 사양은 총 3가지로 다음과 같습니다.

  1. 메모리: 7GB 이상 (문서에는 8GB 지만 코드에서는 7GB로 되어 있습니다.)
  2. OS 버전: Amazon Linux AMI의 경우에는 2017년 버전 이상을 요구합니다.
  3. Disk 용량: DISK_MIN 변수 이상을 요구합니다. DISK_MIN변수는 eos_build.sh의 코드 39번 20으로 선언되어 있었네요.

위 요구사항에 부합하지 않을 경우 설치과정을 더 이상 진행할 수 없고 빌드 과정을 종료하게 됩니다. 다음 코드는 메모리 최소 사양을 확인하는 부분입니다.

    if [ $MEM_MEG -lt 7000 ]; then
        printf "\tYour system must have 7 or more Gigabytes of physical memory installed.\n"
        printf "\texiting now.\n"
        exit 1
    fi

의존 패키지 설치

의존 패키지 설치도 2가지로 구분할 수 있습니다. OS의 패키지관리자로 설치할 수 있는 것과 아닌 것입니다. 다음은 코드에서 확인된 OS 패키지 매니저를 통해 설치하는 EOS의 의존 패키지입니다.

    DEP_ARRAY=( git gcc72.x86_64 gcc72-c++.x86_64 autoconf automake libtool make bzip2 \
    bzip2-devel.x86_64 openssl-devel.x86_64 gmp.x86_64 gmp-devel.x86_64 libstdc++72.x86_64 \
    python36-devel.x86_64 libedit-devel.x86_64 ncurses-devel.x86_64 swig.x86_64 )


주로 C++ 관련 개발 패키지들입니다. EOS의 주요코드가 C++가 개발되어 있기 때문에 필요한 의존패키지들입니다. 이제 순차적으로 다음의 패키지들을 설치합니다.

  • CMake
  • Boost Lib
  • MongoDB (eos 내부에서 사용하는 것으로 보임)
  • MongoDB C++ Driver
  • secp256k1-zkp (해싱에 사용할 라이브러리)
  • LLVM (WASM 컴파일용)

빌드 스크립트를 보니 EOS가 어떤 패키지를 사용하는지 알 수 있네요. 설치 패키지만 보면 EOS는 몽고DB를 사용하는 것으로 보입니다. 비트코인이나 이더리움이 블록 저장을 위해 leveldb를 사용하는 것으로 기억하는데 EOS는 이런 용도로 몽고DB를 사용하는지는 앞으로 코드를 보면서 알아가야 할 것 같습니다.

빌드 확인

정상적으로 EOS가 빌드되었는지 확인해 보겠습니다. 문제 없이 설치가 완료되면 빌드과정 마지막에 다음과 같은 심볼을 보게 됩니다.

eosio_install.png

그런데 위 메시지 아래에 뭔가 의심스런 메시지가 보입니다.

잠깐 여기서부터는 현재 설치에 사용한 410501a 커밋에 있는 빌드 스크립트의 간단한 타이포 오류를 찾는 과정입니다. 관련 내용이 PR이 머지되어서 aeb5205 이후 부터는 Amazon 이미지로 설치 가능합니다.

빌드 스크립트 오류 패치

이상한 메시지는 설치를 검증하기 위해서 몽고 DB 데몬을 띄워보라는 명령 출력이 제대로 되지 않고 다음과 같이 mongod를 찾지 못했다고 나오는 것입니다.

/usr/bin/which: no mongod in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin)


위 내용에 해당하는 스크립트를 찾아보면 eos_build.sh 의 코드 211번 라인에 해당하는 것을 확인할 수 있습니다.

printf "\n\t$( which mongod ) -f ${MONGOD_CONF} &\n"


설치된 몽고DB의 bin 패스가 환경변수에 등록이 안된 게 아닐까 했지만… 코드 85-91번 라인에서 패스가 다음과 같이 선언되어 있음을 알 수 있었습니다.

FILE=${WORK_DIR}/scripts/eosio_build_amazon.sh
CXX_COMPILER=g++
C_COMPILER=gcc
MONGOD_CONF=${HOME}/opt/mongodb/mongod.conf
export LLVM_DIR=${HOME}/opt/wasm/lib/cmake/llvm
export CMAKE=${HOME}/opt/cmake/bin/cmake
export PATH=${HOME}/opt/mongodb/bin:$PATH


그렇다면 문제는 다른 곳에 있다는 것인데요. 위 코드를 보면 알 수 있듯이 스크립트로 EOS를 설치하면 EOS가 의존하는 외부 패키지는 $HOME 의 opt에 위치합니다. 아무래도 opt 폴더에 정상적으로 설치가 되었는지를 살펴봐야 할 것 같습니다.

eos_pkg.png

opt 폴더를 보니 문제의 원인을 알 것 같습니다. mongodb를 설치하고 난 후 심볼릭 링크가 제대로 걸려 있지 않네요. 분명 몽고DB 설치 과정 중 심볼릭 링크를 거는 쪽에 폴더의 경로가 틀렸을 것 같습니다. eosio_build_amazon.sh 의 코드 187번 라인을 보면 예상대로 심볼릭 링크를 거는 부분이 나옵니다.

ln -s ${HOME}/opt/mongodb-linux-x86_64-3.6.3/ mongodb


이 명령의 패키지 폴더 mongodb-linux-x86_64-3.6.3가 잘못이었습니다. Github에서 blame으로 다음과 같이 eosio_build_amazon.sh 파일의 변경사항을 확인해 봅니다.

blame.png

blame에서 변경 커밋을 클릭하여 위 수정내역의 diff를 확인해 보니 코드를 개선하다가 다음과 같이 amazon 을 폴더 패스에서 빠뜨린 것을 것을 알 수 있었습니다.

diff.png

잘못된 부분을 확인 했으니 이왕 코드를 본 김에 잘못된 mongodb의 심볼릭 링크 경로를 수정하고 패치코드를 PR했습니다.

script_pr.png

문제의 원인을 파악했으니 설정을 마무리 하기 위해 ${HOME}/.bashrc에 mongodb의 bin 패스를 추가해 둡니다. 더불어 심볼릭 링크가 잘못 걸려서 제대로 실행되지 못한 다음의 로직이 코드 188-203번 라인이 있습니다.

        mkdir ${HOME}/opt/mongodb/data
        mkdir ${HOME}/opt/mongodb/log
        touch ${HOME}/opt/mongodb/log/mongodb.log

tee > /dev/null ${MONGOD_CONF} <<mongodconf
systemLog:
 destination: file
 path: ${HOME}/opt/mongodb/log/mongodb.log
 logAppend: true
 logRotate: reopen
net:
 bindIp: 127.0.0.1,::1
 ipv6: true
storage:
 dbPath: ${HOME}/opt/mongodb/data
mongodconf


몽고DB의 data, log 폴더 및 log 파일을 생성하고 기본 conf 파일을 생성합니다. 이제 매뉴얼의 Build Validation 에 따라 몽고DB 인스턴스를 띄웁니다.

$ ~/opt/mongodb/bin/mongod -f ~/opt/mongodb/mongod.conf &


${HOME}/opt/mongodb/log/mongodb.log 파일의 로그를 확인해 보고 정상적으로 몽고DB 인스턴스가 실행되었는지 확인해봅니다.

$ tail -f opt/mongodb/log/mongodb.log


이제 ${HOME}/eos/build 로 이동한 후에 make test를 실행합니다. 31개의 준비된 테스트가 순차적으로 진행됩니다. 이중 29번째 테스트에서는 몽고DB와의 연동 테스트가 있습니다. 아직 mongodb.log의 tail 명령을 실행해 둔 상태라면 29번째 테스트의 로그를 확인할 수 있습니다. 모든 테스트가 정상적으로 성공하면 다음과 같은 메시지를 확인할 수 있습니다.

100% tests passed, 0 tests failed out of 31

설치

지금까지 빌드한 바이너리를 sudo make install 명령으로 설치하면 EOS 실행을 위한 모든 준비가 끝납니다.

로컬 테스트 넷 실행

마지막으로 매뉴얼 Create and Launching a Single Node Testet 의 내용을 따라서 nodeos 명령을 실행합니다. 앞서 make install로 바이너리를 설치했기 때문에 매뉴얼의 명령과 달리 바로 nodeos 명령을 다음처럼 실행합니다.

$ nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin

마치며

주말의 여유를 맞아 간단하게 AWS 에서 EC2 인스턴스 하나를 사용하여 EOS를 설치하고 로컬 환경에 노드 하나를 실행해 봤습니다. 이제 테스트 하지 않을 때 EC2 인스턴스를 내려두고 앞으로 차근히 테스트 할 때만 인스턴스를 띄워서 수정한 코드를 빌드해서 확인해 볼 수 있게 되었습니다.

Sort:  

솔리디티 기초 공부만 마무리하고 이제 EOS 공부하려 했는데 마침 글을 올려주셨군요ㅎㅎ 후속글 기다릴게요!!

감사합니다. ^^ 이제 본격적으로 코드 보면서 함께 나눌 만한 내용 생기면 또 공유하겠습니다.

저는 주말에 지트코인을 가상 머신에서 컴파일하고 실행해서 블록을 받아왔는데요.
결국은 드스크 공간이 부족해서 멈추게 되었네요.
삽질은 했지만 좋은 경험이었어요.
EOS관련된 좋은 경험 공유 감사드려요.

네 저도 비트코인 코어 소스빌드해서 돌려봤는데 메인 넷은 용량이 많이 필요해서 테스트넷으로 했었습니다. ^^
테스트도 전체 싱크하니 10GB 넘게 필요했었던 것 같아요.