본문 바로가기
IT/이더리움 Ethereum

이더리움 Geth 개인 테스트 네트워크 구축 . genesis.json

by SidePower 2022. 9. 19.

이더리움의 네트워크는 크게 두가지 있습니다.

라이브 네트워크와 테스트 네트워크인데요.

네트워크를 줄여서 넷으로 표현할게요.ㅋ

 

라이브넷(메인넷)은 실제로 공개되어 지금도 전 세계 노드들이 참가해서

채굴도 하고 거래도 하는 공개 블록체인이며

라이브넷에서 채굴된 ether가 가상화폐 거래소에서 사고팔고 하고 있죠.

아시겠지만 블록체인은 클라이언트만 설치해서 아무나 다 참가할 수 있어요.

 

테스트넷은 말 그대로 이더리움 플랫폼을 이용해 

아무나 테스트을 할 수 네트워크 영역입니다.

 

테스트넷은 또 두가지로 나눠지는데요.

첫번째는

라이브넷과 동일하게 전세계 노드들이 참가해서 테스트하는 Morden 테스트 넷

두번째는

개인 테스트를 위한 노드 한개 또는 노드 개수가 제한된 사설 테스트넷입니다.

 

라이브넷과 테스트넷은 별개이므로 아무것도 공유되지 않습니다.

테스트넷에서 채굴한 Ether을 라이브넷으로 옮기는 건 불가능입니다.

 

저도 사설 테스트넷(Local Private Test-Net)을 구성해서 이더리움 흐름을 파악할 거예요.

 

사설 테스트넷 구축에 필요한 준비는 두가지입니다.

제네시스(Genesis ) 파일과 블록 데이터 디렉터리입니다.

 

 Genesis 파일

블록체인의 최초 시작 정보가 있는 0번째 블록의 정보가 기록된 파일입니다.

Genesis블록이라고 하며 JSON 형식의 파일입니다.

 

우리가 일상생활에서의 숫자 시작은 1부터 하죠.

컴퓨터 프로그램에서의 숫자의 시작은 0부터 하는데요.

블록체인에서 블록의 최초는 0부터이고

사설 테스트넷 구성해도 0블록부터 시작하게 됩니다.

 

 genesis.json

{
    "config": {
          "chainId": 999,
          "homesteadBlock": 0,
          "eip150Block": 0,
          "eip155Block": 0,
          "eip158Block": 0

    },
    "nonce": "0x0000000000000042",
    "timestamp": "0x00",
    "extraData": "0x00",
    "gasLimit": "0x80000000",
    "difficulty": "0x4000",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "alloc": {}
}
항목 설명
config 블록체인 구성 정보가 있는 오브젝트
chainId 현재 블록체인 네트워크를 식별하는 값
homesteadBlock 이더리움 블록체인 버전 .
Olympic, Frontier, Homestead , Ropsten 등이 있으며
Homestead (홈스테드) 버전이 안정화된 버전이라고 하네요.
값이 0으로 지정하면 이 버전을 사용한다는 거에요.
eip150Block EIP(Ethereum Improvement Proposal),
이더리움 업그레이드 설정
eip155Block replay attack을 막기 위한 설정
eip158Block state clearing을 의미
nonce 블록 생성을 위해 연산을 얼마나 많이 실행했다는 작업 증명 값으로
블록 채굴(마이닝)할때 논스(nonce)값을 증가시키면 정답을 찾아냅니다.
64비트 상수값으로 mixhash와 함께 작업 증명에 사용
timestamp 블록 생성 시간 . 유닉스 타임 스탬프
parentHash 이전 블록의 해시값
extraData 이 블록에 관련된 추가 정보들
gasLimit 이더리움에서 송금과 계약을 실행하기 위한 수수료를 Gas라고 함.
이 블록의 수수료 최대값입니다.
difficulty 이 블록의 nonce값 범위의 난이도.
해당 채굴자에만 국한되며 숫자가 낮을수록 채굴이 쉬워집니다.
mixhash 해당 이더리움의 채굴 난이도 결정값.
해당 이더리움에 참여하는 모든 채굴자의 채굴 난이도 영향을 줌.
256비트 해시값으로 nonce와 함께 작업 증명에 사용
coinbase 첫번째 블록을 채굴한 보상을 할 지갑 주소
alloc 블록체인 시작과 동시에 특정 지갑 주소에 코인 지급

이 외에 항목들이 무지 많아요.^^;;

테스트넷 구성에 필요한 거만 최소한으로 나열했으며 

하나씩 해보면서 필요한 항목들을 추가해야 될 거 같네요.

그리고 config 오브젝트 안에 값들은 10진수이고

그 외에는 모두 16진수(0x???)로 표현해야 됩니다.

 

genesis.json 안에 값들은

사실 처음부터 모든것을 알고 정확하게 세팅하기가 힘들어요.

각 항목에 대한 의미를 숙지하고 위의 샘플 genesis.json를

그대로 사용하시는걸 권장합니다.

 

개인 테스트용으로 사용할때 한가지만 맟주면 되요.

config의 chainId 값을 사설 테스트넷 기동할때 설정하는

networkid값과 일치 시키는것입니다.

 

 

 블록 데이터 디렉터리

블록체인으로 송신, 수신할 때의

블록 데이터와 계정정보를 저장할 디렉터리를 지정해야 됩니다.

 

사실 지정하지 않을 경우에 이더리움에서

강제로 ~/.ethereum로 지정해 버리기 때문에 문제 될 건 없어요.ㅋ

그치만 향후에 다른 이더리움 블록체인 네트워크 간에 공유할 경우에

데이터 디렉터리가 동일하게 되면서 충돌 나서 공유가 안된다고 하네요.

 

이왕 하는 거 블록 데이터 디렉터리를 지정해서 해볼 거예요.

 블록 데이터 디렉터리 만들기 . testnet_data
[tmach@localhost gethmain]$ mkdir testnet_data
[tmach@localhost gethmain]$ ll
total 0
drwxrwxr-x. 2 tmach tmach 6 Dec  3 23:17 testnet_data

[tmach@localhost gethmain]$ cd testnet_data
[tmach@localhost testnet_data]$ ll
total 0

 genesis.json 만들기
[tmach@localhost testnet_data]$ vi genesis.json
{
    "config": {
          "chainId": 999,
          "homesteadBlock": 0,
          "eip150Block": 0,
          "eip155Block": 0,
          "eip158Block": 0

    },
    "nonce": "0x0000000000000042",
    "timestamp": "0x00",
    "extraData": "0x00",
    "gasLimit": "0x80000000",
    "difficulty": "0x4000",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "alloc": {}
}
[tmach@localhost testnet_data]$ ll
total 4
-rw-rw-r--. 1 tmach tmach 475 Dec  4 02:21 genesis.json

 

 

테스트넷 구성에 필요한 두가지 준비 끝났네요.

사설 테스트넷을 기동해 볼게요.

 

 Geth 초기화

geth --datadir 데이터 디렉터리 init genesis.json
 데이터 디렉터리 : /home/tmach/gethmain/testnet_data
genesis.json 경로 : /home/tmach/gethmain/testnet_data/genesis.json

경로가 길어서 .. 으로 생략했어요.^^;;
[tmach@localhost gethmain]$ geth --datadir /home/../testnet_data init /home/../testnet_data/genesis.json

INFO [12-04|03:11:06.500] Maximum peer count                       ETH=50 LES=0 total=50
INFO [12-04|03:11:06.501] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [12-04|03:11:06.507] Set global gas cap                       cap=50,000,000
INFO [12-04|03:11:06.507] Allocated cache and file handles         database=/home/tmach/gethmain/testnet_data/geth/chaindata cache=16.00MiB handles=16
INFO [12-04|03:11:06.523] Writing custom genesis block
INFO [12-04|03:11:06.523] Persisted trie from memory database      nodes=0 size=0.00B time="18.673µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-04|03:11:06.524] Successfully wrote genesis state         database=chaindata hash=04d8be..e469b5
INFO [12-04|03:11:06.524] Allocated cache and file handles         database=/home/tmach/gethmain/testnet_data/geth/lightchaindata cache=16.00MiB handles=16
INFO [12-04|03:11:06.532] Writing custom genesis block
INFO [12-04|03:11:06.533] Persisted trie from memory database      nodes=0 size=0.00B time="5.166µs"  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-04|03:11:06.533] Successfully wrote genesis state         database=lightchaindata hash=04d8be..e469b5

 geth와 keystore 디렉터리가 생겼어요.
[tmach@localhost testnet_data]$ ll
total 4
-rw-rw-r--. 1 tmach tmach 477 Dec  4 03:10 genesis.json
drwx------. 4 tmach tmach  72 Dec  4 03:11 geth
drwx------. 2 tmach tmach   6 Dec  4 03:11 keystore

[tmach@localhost testnet_data]$ cd geth
[tmach@localhost geth]$ ll
total 4
drwxr-xr-x. 2 tmach tmach 85 Dec  4 03:11 chaindata
drwxr-xr-x. 2 tmach tmach 85 Dec  4 03:11 lightchaindata
-rw-r--r--. 1 tmach tmach  0 Dec  4 03:11 LOCK
-rw-------. 1 tmach tmach 64 Dec  4 03:11 nodekey

[tmach@localhost testnet_data]$ cd keystore
[tmach@localhost keystore]$ ll
total 0

 tree 명령어로 testnet_data 디렉터리 내부 구조를 파악할수 있다.
[tmach@localhost testnet_data]$ tree
.
├── genesis.json
├── geth
│   ├── chaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   ├── lightchaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   ├── LOCK
│   └── nodekey
└── keystore

4 directories, 13 files

 

 Geth 실행하기

geth 실행으로 테스트넷을 시작해 볼게요.

geth --networkid 식별자 --nodiscover --maxpeers 0 --datadir 데이터 디렉터리 console 2>>로그파일
항목 설명
networkid 블록체인 네트워크 식별자
클라이언트는 이 값을 chainId에 지정해야 접속됩니다.
nodiscover 생성자의 노드를 다른 노드에서 검색할수 없게 합니다.
maxpeers 생성자의 노드에 연결할수 있는 노드의 제한수
datadir 블록 데이타 디렉터리 지정
console JavaScript 대화형 콘솔 기동
2>>로그파일 리눅스 표준 에러를 로그파일에 기록한다.
 데이터 디렉터리 : /home/tmach/gethmain/testnet_data
경로가 길어서 .. 으로 생략했어요.^^;;
[tmach@localhost testnet_data]$ geth --networkid 999 --nodiscover --maxpeers 0 --datadir /home/../testnet_data console 2>>/home/../testnet_data/gethErr.log

Welcome to the Geth JavaScript console!

instance: Geth/v1.10.14-unstable-85064ed0-20211202/linux-amd64/go1.17.3
at block: 0 (Wed Dec 31 1969 19:00:00 GMT-0500 (EST))
 datadir: /home/tmach/gethmain/testnet_data
 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

To exit, press ctrl-d or type exit
>

 ps명령어로 geth 프로세스가 기동된게 확인됩니다.
[tmach@localhost ~]$ ps -ef|grep geth
tmach     1664  1663  1 09:02 pts/0    00:00:00 geth --networkid 999 --nodiscover --maxpeers 0 --datadir /home/tmach/gethmain/testnet_data console

 exit로 console 종료
...생략..
To exit, press ctrl-d or type exit
>
> exit
[tmach@localhost gethmain]$

 geth 프로세스가 다운되어 있어요.
[tmach@localhost ~]$ ps -ef|grep geth
[tmach@localhost gethmain]$

사설 테스트넷이 정상 기동 되었다면
Welcome 메시지와 console 프롬프트 >가 표시됩니다.

그리고 콘솔을 빠져나오면 테스트넷도 종료됩니다.

 

감사합니다.

반응형

댓글