초보자도 쉽게 할수 있는 Geth 설치/운영
우선 이 글을 쓰는 목적은 패스트캠퍼스 블록체인 엔지니어 스쿨 2기 강의를 하다가 비엔지니어 분들과 엔지니어 분들의 Gap을 줄이고자 비엔지니어를 대상으로 사전에 준비하시라고 쓴 글이긴 하다. 혹여나 이글이 우리 수업 이외에도 많은 사람들에게 Geth 를 손쉽게 설치하여 간단한 실습 정도 해볼 수 있으면 더더욱 좋을 거 같다는 생각이 든다.
- 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 정도 잡으면 되지 않을까 싶다. (실제 메인넷에 풀노드를 운영할것은 아니지만 실습시 원활한 환경에서 하고자 함이다)
2. Ubuntu 다운로드 -> https://www.ubuntu.com/download/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 설치 하기
폴더를 먼저 하나 만들자
$ 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 레파지토리가 원격으로부터 내 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) 프로젝트를 진행 중입니다. 팬 커뮤니티 활동을 하면서 코인을 얻을 수 있으며, 한류 콘텐츠 구매, 공연 예매, 한국 관광 상품 구매, 기부 및 팬클럽 활동 등에 사용 될 계획입니다.