Tendermint Core 노드 설치 방법

Cosmos Hub 파헤치기 [1]

Posted by JayB Kim on 2018-09-25

오늘은 Tendermint Core 노드 설치하는 방법에 대해서 알아보겠습니다.

# 사전 요구사항

Go 설치 및 $GOPATH 환경설정 (MacOS 기준)

brew 를 이용해서 go를 설치

1
brew install go

저 같은 경우 MacOS 운영체제에서 기본 터미널 대신 iTerm2 를 사용중이며 zsh (Z-Shell 오픈소스 프레임워크) 를 사용중입니다.

방법 1


$ echo export GOPATH=\"\$HOME/go\" >> ~/.zshrc
$ echo export PATH=\"\$PATH:\$GOPATH/bin\" >> ~/.zshrc

방법 2

사용하는 Editor (vim, nano)를 이용해서 zshrc 파일 열기

아래 두줄 추가


export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"

변경된 zshrc 파일 적용


$ source ~/.zshrc

적용이 됬는지 확인 한 후 적용이 안되있는 경우는 터미널을 껐다 키면 된다.

# Tendermint Core Github & 공식 홈페이지

# Tendermint Core 노드 설치

사전 요구사항인 go 언어와 $GOPATH 환경설정을 마쳤으니 이제 본격적으로 텐더민트 코어 노드를 설치해보도록 하자

[ 직접 소스코드를 다운받아 설치하는 방법 ]

tendermint core 소스코드 가져오기


$ go get github.com/tendermint/tendermint/

go 명령어 사용법 참고: https://golang.org/cmd/go/


$ ls $GOPATH/src/github.com/tendermint/tendermint

> 결과

CHANGELOG.md         LICENSE              abci                 consensus            mempool              scripts
CHANGELOG_PENDING.md Makefile             appveyor.yml         crypto               networks             state
CODE_OF_CONDUCT.md   README.md            benchmarks           docker-compose.yml   node                 test
CONTRIBUTING.md      ROADMAP.md           blockchain           docs                 p2p                  tools
DOCKER               SECURITY.md          cmd                  evidence             privval              types
Gopkg.lock           UPGRADING.md         codecov.yml          libs                 proxy                version
Gopkg.toml           Vagrantfile          config               lite                 rpc

tendermint 폴더로 이동


$ cd $GOPATH/src/github.com/tendermint/tendermint 

아래 이미지와 같은 디렉토리 구조를 확인했다면 잘 가져온 거다.

소스 컴파일 (관련 툴과 패키지 설치)


$ make get_tools && make get_vendor_deps

> 결과

--> Installing tools
go get -u -v github.com/mitchellh/gox github.com/golang/dep/cmd/dep gopkg.in/alecthomas/gometalinter.v2 github.com/gogo/protobuf/protoc-gen-gogo github.com/square/certstrap
...
......
..........

Installing:
  deadcode
  dupl
  errcheck
  gochecknoglobals
  gochecknoinits
  goconst
  gocyclo
  goimports
  golint
  gosec
  gosimple
  gotype
  gotypex
  ineffassign
  interfacer
  lll
  maligned
  megacheck
  misspell
  nakedret
  safesql
  staticcheck
  structcheck
  unconvert
  unparam
  unused
  varcheck
--> Running dep

make를 통해 생성된 설치파일 설치


$ make install

> 결과

CGO_ENABLED=0 go install -ldflags "-X github.com/tendermint/tendermint/version.GitCommit=`git rev-parse --short=8 HEAD`" -tags 'tendermint' ./cmd/tendermint

Tendermint Core 버전 확인


$ tendermint version 
> 0.24.0

[ Script 를 이용한 설치하는 방법 ]

아래 링크를 보면 OS 환경 (Ubuntu, OSX, bsd) 별로 script 가 짜여져 있다

필자는 Ubuntu 16.04 환경에서 Script 를 실행시켜 설치를 해보았다.


$ nano install_tendermint_ubuntu.sh

아래 소스 추가

저 같은 경우 아래 스크립트 실행 결과 ubuntu 유저 권한 문제가 있어 $GOPATH 부분을 아래와 같이 변경하였습니다.

1
2
변경 전: echo "export GOPATH=/root/goApps" >> ~/.profile
변경 후: echo "export GOPATH=/ubuntu/goApps" >> ~/.profile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env bash

# XXX: this script is intended to be run from
# a fresh Digital Ocean droplet with Ubuntu

# upon its completion, you must either reset
# your terminal or run `source ~/.profile`

# as written, this script will install
# tendermint core from master branch
REPO=github.com/tendermint/tendermint

# change this to a specific release or branch
BRANCH=master

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y make

# get and unpack golang
curl -O https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz
tar -xvf go1.10.linux-amd64.tar.gz

# move go binary and add to path
mv go /usr/local
echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile

# create the goApps directory, set GOPATH, and put it on PATH
mkdir goApps
echo "export GOPATH=/root/goApps" >> ~/.profile
echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile

source ~/.profile

# get the code and move into repo
go get $REPO
cd $GOPATH/src/$REPO

# build & install
git checkout $BRANCH
# XXX: uncomment if branch isn't master
# git fetch origin $BRANCH
make get_tools
make get_vendor_deps
make install

# the binary is located in $GOPATH/bin
# run `source ~/.profile` or reset your terminal
# to persist the changes

install_tendermint_ubuntu.sh 파일에 실행권한을 부여한 후 실행


$ chmod + install_tendermint_ubuntu.sh
$ sudo ./install_tendermint_ubuntu.sh

$GOPATH 경로 설정 확인 후 profile 파일 적용


$ nano ~/.profile
$ source ~/.profile

# Tendermint Core 실행

이제 설치를 다 마쳤으니 실행을 해봐야겠죠


$ tendermint init

> 결과

I[09-19|14:57:21.180] Generated private validator                  module=main path=/Users/coincube/.tendermint/config/priv_validator.json
I[09-19|14:57:21.180] Generated node key                           module=main path=/Users/coincube/.tendermint/config/node_key.json
I[09-19|14:57:21.180] Generated genesis file                       module=main path=/Users/coincube/.tendermint/config/genesis.json

싱글, 로컬 노드를 실행함과 동시에 $HOME/.tendermint 경로에 관련 파일이 생성된다. 싱글, 로컬 노드는 별다른 설정이 필요없지만 클러스터 노드 부터는 별도의 설정 작업이 필요하다


$ ls $HOME/.tendermint
> config data

$ ls $HOME/.tendermint/config
> config.toml         genesis.json        node_key.json       priv_validator.json

$ ls $HOME/.tendermint/data
blockstore.db  cs.wal  evidence.db  mempool.wal  state.db  tx_index.db

tendermint 명령어 도움


$ tendermint help
$ tendermint node --help

Usage:
  tendermint node [flags]

Flags:
      --abci string                     Specify abci transport (socket | grpc) (default "socket")
      --consensus.create_empty_blocks   Set this to false to only produce blocks when there are txs or when the AppHash changes (default true)
      --fast_sync                       Fast blockchain syncing (default true)
  -h, --help                            help for node
      --moniker string                  Node Name (default "제 맥북 이름")
      --p2p.laddr string                Node listen address. (0.0.0.0:0 means any interface, any port) (default "tcp://0.0.0.0:26656")
      --p2p.persistent_peers string     Comma-delimited ID@host:port persistent peers
      --p2p.pex                         Enable/disable Peer-Exchange (default true)
      --p2p.private_peer_ids string     Comma-delimited private peer IDs
      --p2p.seed_mode                   Enable/disable seed mode
      --p2p.seeds string                Comma-delimited ID@host:port seed nodes
      --p2p.upnp                        Enable/disable UPNP port forwarding
      --priv_validator_laddr string     Socket address to listen on for connections from external priv_validator process
      --proxy_app string                Proxy app address, or 'nilapp' or 'kvstore' for local testing. (default "tcp://127.0.0.1:26658")
      --rpc.grpc_laddr string           GRPC listen address (BroadcastTx only). Port required
      --rpc.laddr string                RPC listen address. Port required (default "tcp://0.0.0.0:26657")
      --rpc.unsafe                      Enabled unsafe rpc methods

Global Flags:
      --home string        directory for config and data (default "/Users/coincube/.tendermint")
      --log_level string   Log level (default "main:info,state:info,*:error")
      --trace              print out full stack trace on errors

노드 실행시 아래 flag를 이용하면 테스트넷을 실행시킬 수 있다. 노드를 실행시켜보자.


--proxy_app string                Proxy app address, or 'nilapp' or 'kvstore' for local testing. (default "tcp://127.0.0.1:26658")

프록시 앱 주소, kvstore 는 로컬 테스트를 위한 옵션이다. (default "tcp://127.0.0.1:26658) 

$ tendermint node --proxy_app=kvstore

노드를 실행하면 블록이 3~5초 마다 동기화되는걸 확인할 수 있고

아래 경로에 로그 파일을 열어보면 블록이 생성되는 되고 있는 걸 알 수 있다.


$ ls $HOME/.tendermint/data

또 다른 터미널창을 킨 후 아래 명령어를 통해 블록 상태를 확인해보자

help에 나와있는 포트번호는 26658번 이지만 지금은 26657 번호로 변경이 된걸로 판단된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ curl -s localhost:26657/status

> 결과

{
"jsonrpc": "2.0",
"id": "",
"result": {
"node_info": {
"id": "2aebd9eb03afe628455ccf1272a7c28faa0bccd3",
"listen_addr": "192.168.0.19:26656",
"network": "test-chain-qiYxoD",
"version": "0.24.0-d419fffe",
"channels": "4020212223303800",
"moniker": "제 맥북 이름",
"other": [
"amino_version=0.12.0",
"p2p_version=0.5.0",
"consensus_version=v1/0.2.2",
"rpc_version=0.7.0/3",
"tx_index=on",
"rpc_addr=tcp://0.0.0.0:26657"
]
},
"sync_info": {
"latest_block_hash": "9F0E582E2F100C5926DF24E8308542CC3714D061",
"latest_app_hash": "0000000000000000",
"latest_block_height": "185",
"latest_block_time": "2018-09-19T06:25:05.4725544Z",
"catching_up": false
},
"validator_info": {
"address": "27D9C29D2177BC07E731CE3B5F11EFCBF212531F",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "xxxxxxxxxbxEmTpiOJFM1tPcbxxxxxxxxxxxxxxxxxx"
},
"voting_power": "10"
}
}
}

# 업데이트 하는 방법

1
2
3
4
5
6
7
8
9
10
11
$ cd $GOPATH/src/github.com/tendermint/tendermint

$ make install

$ cd $GOPATH/src/github.com/tendermint/tendermint
$ git pull origin master
$ make get_vendor_deps
$ make install

$ tendermint init
$ tendermint node --proxy_app=kvstore

지금까지 Tendermint Core 노드 설치하는 방법에 대해서 알아보았습니다.