초보자도 쉽게 할수 있는 Geth 설치/운영

JeungJoo Lee
Day34 Inc.
Published in
15 min readNov 3, 2018

--

우선 이 글을 쓰는 목적은 패스트캠퍼스 블록체인 엔지니어 스쿨 2기 강의를 하다가 비엔지니어 분들과 엔지니어 분들의 Gap을 줄이고자 비엔지니어를 대상으로 사전에 준비하시라고 쓴 글이긴 하다. 혹여나 이글이 우리 수업 이외에도 많은 사람들에게 Geth 를 손쉽게 설치하여 간단한 실습 정도 해볼 수 있으면 더더욱 좋을 거 같다는 생각이 든다.

  1. Virtual Box를 설치하도록 한다

https://www.virtualbox.org/wiki/Downloads

Virtual Box는 사실 수강생들의 편의에 맞춰 OS 환경을 맞추기 위함이다. 요즘 AWS 같은 글라우드 서비스가 많긴 하지만 돈을 내야하고 -_- 본인이 쓰고 있는 Windows 환경이나 Mac에서 각각 하자니 쉽지 않을 것 같아. Virtual Box라는 가상 OS 관리툴을 쓰고자 한다. 아래는 가상 OS 로 Linux 의 계열인 요즘 많이 쓰는 우분투 환경으로 하고자 한다.

사양은 각 노트북 환경의 리소스가 넉넉한 사람과 그렇지 않은 사람이 갈릴 것이다. 일단 어느정도 실습을 하고 그 이후엔 Geth 클라우드 서비스인 Infura나 Ganache 를 솔리디티 수업에서는 쓸거긴 하지만 어느정도 넉넉하게 설정했으면 한다. 최소 CPU 2 Core 이상과 8GB 그리고 SSD 100GB 정도 잡으면 되지 않을까 싶다. (실제 메인넷에 풀노드를 운영할것은 아니지만 실습시 원활한 환경에서 하고자 함이다)

각자 쓰는 OS 환경에 따라 다운받도록 한다.

2. Ubuntu 다운로드 -> https://www.ubuntu.com/download/desktop

Ubuntu Desktop 버전을 다운 받도록 한다

설치 과정은 아래 동영상을 보면 된다!. 인프런 강의 때 VirtualBox에 우분투를 사용하지 못하는 사람들을 대상으로 서비스 차원에서 찍어 본거..;; 이럴때도 사용될 줄이야..

설치 Step 1: https://drive.google.com/open?id=1naXBXQ0_Y9jIkw2sqbh5tjnpbxLjJ9gk

설치 Step 2: https://drive.google.com/file/d/19D1iTktiL2ed-vzfgeTN60tGJjYDwX1A/view?usp=sharing

자 설치가 이제 끝났다면 ! 터미널을 띄우도록 한다.

3. git 설치하고 go-ethereum 소스 가져오기 * git 설치는 인터넷에 뒤져보면 많다;

위의 깃헙주소가 이더리움 재단에서 운영하는 이더리움 클라이언트의 오픈소스라 할 수 있다.

$ sudo apt install git
// git 설치 하기
git 설치 화면

폴더를 먼저 하나 만들자

$ mkdir ~/ethereum && cd ~/ethereum

앞으로 ethereum 폴더는 실습의 root 폴더라고 생각하면 된다.

git 설치가 끝났으니 git을 통해 원격에 있는 github/ethereum/go-ethereum 의 geth 클라이언트를 복제해 와보겠다. 소스버전이고 컴파일 버전 전이다.

git clone https://github.com/ethereum/go-ethereum.git

git repository에서 go-ethereum 소스를 내려 받습니다.

*참고할 사항은 Virtual Box에서 동영상 보고 VBox Guest Image 까지 다 설치 했다면 복사 붙여넣기 키는 ctrl + shift + c (복사), v (붙여넣기) 이다. 마우스로 컨트롤 하다가 지치지 말자.

설치가 끝난 후

$ ll
go-ethereum 다운로드가 끝나고 ls 명령어 후 의 캡처 모습

위와 같이 go-ethereum 레파지토리가 원격으로부터 내 localhost에 다운로드가 받아졌다.

$ cd go-ethereum
$ sudo apt-get install -y build-essential golang

go-ethreum 폴더로 이동 후 빌드에 필요한 Go 언어와 컴파일러 등등 필수 라이브러리를 설치하자

설치가 완료되면 이제 make 로 go 소스를 build 하겠다

$ make all

빌드된 파일들 확인과 geth 버전을 확인해보자

$ cd build/bin
$ ./geth version

위와 같이 1.8.18-unstable 이라고 나올것이다.

Go-Ethereum 레파지토리 git branch 전략이 엄청 이상한?것같다. 왜 마스터 버전이 unstable 인지 모르겠다… 원래는 보통 stable한 버전을 master로 잡고 unstable 의 버전을 branch로 관리하기 때문이다. (이부분은 몰라도 됨)

우선, 환경변수를 설정해야한다. 어느 폴더에서든 geth 명령어를 날릴 수 있도록 말이다.

$ pwd
/home/blockchain/ethereum/go-ethereum/build/bin <-- 내용 복사 (본인 Pc에서)
$ sudo apt-get install vim

vim 에디터를 설치 후 아래와 같이 .bash_profile 안에 path 내용에 GETH 위치를 추가해준다. ( i 는 문서 수정 모드 이다 )

GETH=/home/blockchain/ethereum/go-ethereum
PATH="$PATH:$GETH/build/bin"

[ESC]->세미콜론 -> wq 키워드 엔터

$ source ~/.bash_profile

이렇게 하면 Geth 가 글로벌 환경변수에 등록 되면서 빌드된 파일을 실행할 수 있게 된다.!

geth를 실행하기 전 먼저 geth의 계정을 생성해 보도록 하겠다.

현재 ethereum 폴더 위치에서 test_data 폴더를 하나 만들도록 하자

$ mkdir test_data
$ cd test_data && touch password //패스워드 파일을 일단 만들어 놓자
$ cd ~/ethereum

이제 geth 명령어 중 account new를 해보도록 하겠다. 실제 geth 옵션은 -h 로 어떤것들이 있는지 확인해 볼 수 있다

$ geth --help

우선 옵션들이 다양하다 이더리움, 마이닝, 네트워킹, RPC 등 다양한 옵션들이 나오는 것을 확인할 수 있는데 이 모든 것들 다 알아야 하는 것은 아니니 우선 참고만 해두자.

$ geth --datadir test_data account new --password test_data/password

위의 명령어는 password 파일(실제 내용은 아무것도 없다)을 토대로 account 를 새로 생성하겠다는 의미이다. 패스워드를 따로 설정하지 않기 위해 만들어 놓았다.

위의 명령어를 몇번 더 반복해보자 한 10번 정도. 그럼 아래와 같이 계정들이 생기게 된다.

같은 패스워드라도 실제 Address는 다르다 그럼 내가 “” 아무것도 지정하지 않은 passphrase 가 결정론적인 Address의 결과를 가져온다는 것은 아니다. 저번시간에도 말했던 바로 엔트로피가 내부적으로 그런역할을 한다. 일단 이해가 안 되도 좋으니 넘어가 보자.

$ cd test_data
$ ls -al

위의 명령어를 치게 되면 못보던 keystore 폴더가 생긴 것을 볼 수 있다 들어가서 확인해보자.

$ cd keystore
$ ls -al

자 보이는가 이게 바로 JSON 형태의 Account 계정들의 private key json 파일이다. 아마 거래소는 고객의 EOA 계정을 본인들이 운영하는 Geth 에서 생성하고 위와 같은 Key 파일을 내부망 안에다 두고 관리할 수 있을 거라는 추측을 해볼 수 있다.

위의 파일을 하나 열어 보게 되면은 아래와 같은 내용이 나오게 된다.

"address":"c470eb7552ffb0bbf48c8e81f2991aee3b3f99f4","crypto":{"cipher":"aes-128-ctr","ciphertext":"5202436fb48511d210533f587a10a2aca769c00de33e42a79df162f713980046","cipherparams":{"iv":"a20d6252ffe669142bf52e7c04d9452d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5e5dccafe39fee8d70fd21012bab0487d7d019d748ef0a4fb002b516c3ecef30"},"mac":"6c5215fcc006ae3d44a4eac8a9ef358eb9991799c53929293c3d483d08b34a3d"},"id":"c771f36c-2c04-4e75-b88f-2796443f5af5","version":3}

JSON 형태이다. 저 안에는 우선 Address 정보와 내부적인 여러 Private key와 관련된 여러 정보들이 존재해 보이는 듯하다.

자 이제 계정도 만들었으니 geth 를 띄워서 console 창에 거래를 해보는 실습을 해보겠다. 먼저 geth를 띄우기 전에 블록체인을 설정하는 작업을 해야하는데 test_data 폴더에 genesis.json 파일을 생성하고 파일 안에 다음과 같은 내용을 집어 넣어보겠다.

$ vim ~/ethereum/test_data/genesis.json

genesis.json 내용

{
"config": {
"chainId": 8484,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20",
"extraData" : "",
"gasLimit" : "0x47e7c5",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}

위의 내용은 현재는 별다른 내용을 설명하지 않도록 하겠다.. 일단 따라 하라..-_-;

그리고 저장 하고 나오도록 한다 (세미콜론 -> wq 엔터)

$ cd ~/ethereum

이제 init을 해보자.

$ geth --datadir test_data init test_data/genesis.json

실행을하게 되면 위와 같이 나오는데 Successfully 가 나오면 성공적으로 프라이빗 네트워크의 제네시스 블록이 생성이 되는 것이다.

이제 geth를 실행해보자. 옵션에 대해선 지금은 몰라도 좋다 일단 실행만 해보자.

$ cd ~/ethereum
$ geth --networkid 8484 --nodiscover --datadir test_data --rpcaddr 0.0.0.0 --rpc --rpcport 8545 --rpccorsdomain "*" --rpcapi="db,eth,net,web3,personal,web3,miner,admin" --miner.threads 1 console 2>> test_data/geth.log

자 위와 같이 실행 한다면 아래와 같이 나올 것이다.

콘솔 창이 나오게 되고 이제부터는 console 에 직접 우리가 API를 보고 Geth에게 명령을 내리면 된다.

API 명령어 는 기본적인 Geth 명령어와 web3 명령어 둘로 나뉠 수 있다.

먼저 1주차때 배웠던 마이닝을 해보겠다. console 에 miner.start(1)를 하기 전 먼저 coinbase가 존재하는지 확인해 보자

> eth.coinbase // 존재한다면 address 하나가 나올 것이다. 확인 후 
> miner.start()

이제부터 DAG가 가동된다. 채굴을 하려면 좀 기다려야 되는데 본인의 PC의 경우 DAG 생성 시간은 대략적으로 7분정도 걸릴 것이다..;; 왜냐하면 설정의 minethread를 1로 세팅했기 때문에…;; 느리게 되는 것이다. 이 옵션은 풀어도 상관은 없다. 단, 좀 더 컴퓨터 리소스를 적게 사용하려고 설정을 넣은 것이였다 ㅠ

여튼 DAG가 다 생성이 되고 아래와 같이 콘솔에다 명령어를 치면 block number가 지속적으로 증가하는 것을 확인 할 수 있다.

마이닝 상태는 web3.eth.mining 명령어로 알 수 있고, eth.blockNumber는 현재 latest 상태의 블록의 height를 확인할 수 있는 것이다.

위의 채굴이 하나 둘 되는 것을 볼 수 있다. 총 6분 44초가 걸렸다..;;

블록도 5개가 만들어졌다.

자 이제 가장 기초적인 coinbase 에서 아까 위에서 만들었던 다른 계좌까지 송금 트랜잭션을 날려보도록 하겠다. 먼저 coinbase 에 잔고를 확인해보자

> web3.fromWei(eth.getBalance(eth.coinbase),'ether')

현재 계속 변하고 있지만 110 이더가 쌓였다. 자 이제 특정 계좌로 송금을 해보도록 하겠다 송금 전 먼저 마이닝을 중지하자.

> miner.stop()

그리고 아래와 같이 1 이더를 송금 해보도록 하겠다.

> eth.sendTransaction({from : eth.coinbase, to : eth.accounts[1], value : web3.toWei(1,'ether')});

아마 위와같이 실행하면 계정이 잠겨있다고 나올 것이다. 일단 풀어주자.

> personal.unlockAccount(eth.coinbase,'',0);

그리고 다시 위에 있는 sendTransaction을 다시 실행해보자.

이제는 Tx Id가 Return 된 것을 볼 수 있는데 이게 바로 Transaction ID이다. 이제 eth.accounts[1] 잔고를 확인해 보도록 하자.

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')

어라 0이다… 왜일까?….

답은 바로 마이닝에 있다. 우리가 1주차에도 배웠지만 현재 비트코인이나 이더리움은 컨센서스가 PoW 이다. 즉 Nonce의 값을 찾아내는 마이닝 과정을 통해서만 블록이 생성될 수 있고 해당 트랜잭션은 그 블록안에서 처리가 될 수 있는 것이다.

자 그럼 어느 공간에 트랜잭션이 있는지 확인해보자.

> eth.pendingTransactions

위와 같이 아직 처리가 되지 않고 Pending 된 상태로 존재한다는 것을 알 수 있다.

blockHash가 아직 null이고 Number도 null이기 때문이다.

이제 miner.start()를 실행해보면 알 수 있다.

> miner.start()
> eth.pendingTransaction //이제는 사라지고 [] 출력되는 것을 볼 수 있음

잔고를 다시 확인해보자

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')

이제 송금까지 코엔베이스에서 accounts[1] 계정까지 해보았다. 일단 비 엔지니어분들은 다양한 시도와 API들을 위에서 제시한 사이트에서 면밀히 살펴보도록 하자.

  • 저는 블록체인 개발사 (주)34일에서 블록체인 엔지니어로 일하고 있습니다.
  • 880만 팔로워 전세계 1위 한류 미디어 케이스타라이브(KStarLive)와 함께 만든 한류 플랫폼에서 사용되는 케이스타코인(KStarCoin) 프로젝트를 진행 중입니다. 팬 커뮤니티 활동을 하면서 코인을 얻을 수 있으며, 한류 콘텐츠 구매, 공연 예매, 한국 관광 상품 구매, 기부 및 팬클럽 활동 등에 사용 될 계획입니다.

--

--