don't stop believing

Geth (Go-ethereum) 설치 (on Ubuntu) 본문

Ethereum

Geth (Go-ethereum) 설치 (on Ubuntu)

Tongchun 2018. 8. 23. 14:37

Ubuntu에 Geth (Go-ethereum)을 설치합니다.

참고한 url은 아래와 같습니다.

https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu


Geth를 설치하는 방법은 두 가지가 있습니다. PPA로 설치하는 방법과 github에서 source를 다운받아 build를 하는 방법입니다.

저는 간단하게 PPA를 이용해 설치하겠습니다.


먼저 Ubuntu 버전부터 확인하고 가겠습니다.

간단하게 버전을 확인할 경우 cat /etc/issue로 확인할 수 있습니다.

$ cat /etc/issue
Ubuntu 18.04.1 LTS \n \l


버전을 확인하는 다른 방법은 lsb_release -a 입니다.

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.1 LTS
Release:	18.04
Codename:	bionic

Ubuntu는 18.4 버전입니다.


PPA를 이용한 geth 설치는 아래 명령대로 하면 됩니다.

$ sudo apt-get install software-properies-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum

ethereum 패키지를 설치하면 아래 툴들이 한꺼번에 설치됩니다.

bootnode, puppeth, evm, abigen, rlpdump, wnode, geth


geth 버전을 확인해 보겠습니다.

$ geth version
Geth
Version: 1.8.14-stable
Git Commit: 316fc7ecfc10d06603f1358c1f4c1020ec36dd2a
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.1
Operating System: linux
GOPATH=
GOROOT=/usr/lib/go-1.10

geth 설치가 완료되었습니다.

설치까지 했으면 로컬 테스트넷에서 Geth를 돌려봐야겠죠?


로컬 테스트넷에서 Geth를 실행하기 위해서는 데이터 디렉터리와 Genesis 파일이 있어야 합니다.

데이터 디렉터리는 송수신한 블록 데이터와 계정 정보를 저장할 디렉터리입니다.

Genesis파일은 블록체인의 Genesis 블록(0번째 블록)의 정보가 저장된 json 형태의 텍스트 파일입니다.


데이터 디렉터리는 home/ngle/data_testnet이라고 만듭니다.

$ mkdir ~/data_testnet
$ cd ~/data_testnet/
$ pwd
/home/ngle/data_testnet


데이터 디렉터리안에 아래와 같이 genesis.json파일을 만들어 줍니다.

{
	"config": {
		"chainId": 45,
		"homesteadBlock": 0,
		"eip155Block": 0,
		"eip158Block": 0
	},
	"alloc"			: {},
	"coinbase"		: "0x3333333333333333333333333333333333333333",
	"difficulty"	: "0x4000",
	"extraData"		: "",
	"gasLimit"		: "0x80000000",
	"nonce"			: "0x0000000000000042",
	"mixhash"		: "0x0000000000000000000000000000000000000000000000000000000000000000",
	"parentHash"	: "0x0000000000000000000000000000000000000000000000000000000000000000",
	"timestamp"		: "0x00"
}


genesis.json 파일의 자세한 설명은 아래 링크에서 확인할 수 있습니다.

https://gist.github.com/0mkara/b953cc2585b18ee098cd


데이터 디렉터리와 genesis.json 파일이 준비됐다면 Geth를 초기화합니다.

geth --datadir /home/ngle/data_testnet/ init /home/ngle/data_testnet/genesis.json

$ geth --datadir /home/ngle/data_testnet/ init /home/ngle/data_testnet/genesis.json
INFO [08-28|13:57:44.039] Maximum peer count                       ETH=25 LES=0 total=25
INFO [08-28|13:57:44.039] Allocated cache and file handles         database=/home/ngle/data_testnet/geth/chaindata cache=16 handles=16
INFO [08-28|13:57:44.147] Writing custom genesis block 
INFO [08-28|13:57:44.147] Persisted trie from memory database      nodes=0 size=0.00B time=1.84µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-28|13:57:44.147] Successfully wrote genesis state         database=chaindata                              hash=a0dbf0…35ae76
INFO [08-28|13:57:44.147] Allocated cache and file handles         database=/home/ngle/data_testnet/geth/lightchaindata cache=16 handles=16
INFO [08-28|13:57:44.272] Writing custom genesis block 
INFO [08-28|13:57:44.272] Persisted trie from memory database      nodes=0 size=0.00B time=1.547µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [08-28|13:57:44.272] Successfully wrote genesis state         database=lightchaindata                              hash=a0dbf0…35ae76
ngle@ngle-B85M-HD3:~/data_testnet$ 


tree로 데이터 디렉터리를 확인할 수 있습니다.

$ tree
.
├── genesis.json
├── geth
│   ├── chaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   └── lightchaindata
│       ├── 000001.log
│       ├── CURRENT
│       ├── LOCK
│       ├── LOG
│       └── MANIFEST-000000
└── keystore

4 directories, 11 files

Geth를 초기화 했다면 실행할 차례입니다.

아래 명령으로 실행해 줍니다.

geth --networkid 45 --nodiscover --maxpeers 0 --datadir /home/ngle/data_testnet console 2>> /home/ngle/data_testnet/geth.log


--networkid 45 : 네트워크 식별자입니다.

--nodiscover : 생성자의 노드를 다른 노드에서 검색할 수 없게 하는 옵션입니다.

--maxpeers 0 : 생성자의 노드에 연결할 수 있는 노드의 수를 지정합니다. 0을 지정하면 다른 노드와 연결하지 않습니다.

--datadir /home/ngle/data_testnet : 데이터 디렉터리를 지정합니다.

consol : 대화형 자바스크립트 콘솔을 기동합니다.

2>> /home/ngle/data_testnet/geth.log : 로그 파일을 만들 때사용할 옵션으로 에러를 해당 경로의 파일에 저장합니다. 


$ geth --networkid 45 --nodiscover --maxpeers 0 --datadir /home/ngle/data_testnet console 2>> /home/ngle/data_testnet/geth.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.14-stable-316fc7ec/linux-amd64/go1.10.1
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

문제가 없다면 Welcome 메시지와 프롬프트 (>) 표시가 나타납니다.


Geth를 실행했으니 계정까지 만들어 봅시다.

이더리움에는 두 가지 종류의 계정이 있습니다. EOA (Externally Owned Account)이고, 다른 하나는 Contract 계정입니다. EOA는 일반 사용자가 사용하는 계정으로 비밀키로 관리됩니다. Ether를 송금허거나 계약을 실행할 수 있습니다. Contract 계정은 계약용 계정으로 계약을 블록체인에 배포할 때 만들어지는 계정으로 블록체인에 존재합니다.


Geth console에서 personal.newAccount 명령으로 EOA를 만들수 있습니다.

> personal.newAccount("ngle1234")
"0x26a43bc3dcef48f91b77df47dd353d9f34c163c4"

비밀번호 ngle1234로 계정을 생성했습니다.

출력된 0x26a43bc3dcef48f91b77df47dd353d9f34c163c4는 계정의 주소입니다. 이 주소를 지정해 송금 등을 할 수 있습니다.


계정(EOA)는 eth.accounts 명령으로 확인할 수 있습니다.

> eth.accounts
["0x26a43bc3dcef48f91b77df47dd353d9f34c163c4"]

송금을 하려면 계정이 두 개 있어야 겠죠. personal.newAccount로 계정을 하나 더 만들고 확인해 봅시다.

> personal.newAccount("tongchun1234")
"0x6a6ea6d5128554638b138a5331529989fcde4271"
> eth.accounts
["0x26a43bc3dcef48f91b77df47dd353d9f34c163c4", "0x6a6ea6d5128554638b138a5331529989fcde4271"]

비밀번호 tongchun1234로 계정을 하나 더 추가하고 eth.accounts를 보면 두 개의 주소가 보입니다.

각 계정은 eth.accounts[0], eth.accounts[1] 처럼 인덱스 형태로 지정해 확인할 수 있습니다.

> eth.accounts[0]
"0x26a43bc3dcef48f91b77df47dd353d9f34c163c4"
> eth.accounts[1]
"0x6a6ea6d5128554638b138a5331529989fcde4271"

exit 명령으로 Geth Console을 종료할 수 있습니다.

> exit

Console을 종료하면 Geth 프로세스도 종료됩니다.


Console을 사용하지 않고 셀에서 geth명령으로도 계정을 생성할 수 있습니다.

$ geth --datadir /home/ngle/data_testnet account new
INFO [08-28|14:17:23.908] Maximum peer count                       ETH=25 LES=0 total=25
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat passphrase: 
Address: {7208e3ca69793ec72d6b08a3497edf8e447c5304} 

geth --datadir /home/macaron/data_testnet account new 명령 실행 후 Passphrase: 가 나오면 비밀번호를 입력하면 됩니다.

저는 macaron1234로 만들었습니다.

Address가 출력되는 것도 확인되네요.


이번엔 geth명령으로 계정을 확인해 보겠습니다.

명령은 geth --datadir /home/ngle/data_testnet account list 입니다.

$ geth --datadir /home/ngle/data_testnet account list
INFO [08-28|14:18:47.317] Maximum peer count                       ETH=25 LES=0 total=25
Account #0: {26a43bc3dcef48f91b77df47dd353d9f34c163c4} keystore:///home/ngle/data_testnet/keystore/UTC--2018-08-28T05-12-54.258094296Z--26a43bc3dcef48f91b77df47dd353d9f34c163c4
Account #1: {6a6ea6d5128554638b138a5331529989fcde4271} keystore:///home/ngle/data_testnet/keystore/UTC--2018-08-28T05-15-00.686555773Z--6a6ea6d5128554638b138a5331529989fcde4271
Account #2: {7208e3ca69793ec72d6b08a3497edf8e447c5304} keystore:///home/ngle/data_testnet/keystore/UTC--2018-08-28T05-17-42.450985442Z--7208e3ca69793ec72d6b08a3497edf8e447c5304

지금까지 만들어진 세 개의 계정을 확인할 수 있습니다.


tree 명령으로 디렉터리를 확인하면 keystore예 계정 정보가 추가된 것을 볼 수 있습니다.

$ tree
.
├── genesis.json
├── geth
│   ├── chaindata
│   │   ├── 000002.ldb
│   │   ├── 000003.log
│   │   ├── CURRENT
│   │   ├── CURRENT.bak
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000004
│   ├── lightchaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   ├── LOCK
│   ├── nodekey
│   └── transactions.rlp
├── geth.log
├── history
└── keystore
    ├── UTC--2018-08-28T05-12-54.258094296Z--26a43bc3dcef48f91b77df47dd353d9f34c163c4
    ├── UTC--2018-08-28T05-15-00.686555773Z--6a6ea6d5128554638b138a5331529989fcde4271
    └── UTC--2018-08-28T05-17-42.450985442Z--7208e3ca69793ec72d6b08a3497edf8e447c5304

4 directories, 21 files

여기까지 Ubuntu에 Geth 설치와 계정 생성이었습니다.


Comments