블록체인 Block-Chain - Geth로 POA network 구축하기 ( Eth-netstats, bootnode )

dev_swan·2022년 12월 12일
0

블록체인

목록 보기
32/36
post-thumbnail

Geth 설치

Geth는 go 언어로 구성된 이더리움 클라이언트로 이더리움 네트워크의 노드를 구성하는데 사용합니다.

Golang 설치

$ sudo apt update
$ sudo apt install golang -y
$ sudo apt install -y libgmp3-dev tree make build-essential

Go Ethereum Clone

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

Go Ethereum 안에 있는 모든 파일들을 빌드

$ cd go-ethereum
$ make all

make all Error시 Go 언어 삭제 후 재설치

$ sudo apt-get remove golang-go -y
$ sudo apt-get remove --auto-remove golang-go -y
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt-get update
$ sudo apt-get install golang-go

Geth 환경변수 설정

Geth를 어떤 위치에서도 사용할 수 있도록 환경변수를 설정해줍니다.

$ pwd
 /Users/kimsanghun/Git/Suhwan/go-ethereum/build/bin => copy

$ vi ~/.bash_profile
export PATH=$PATH:/Users/kimsanghun/Git/Suhwan/go-ethereum/build/bin

/** 작성후 저장하고 나오기 */
:wq!

/** 환경변수 적용 */
$source ~/.bash_profile

Ethereum Network Stats Clone

eth-netstats은 이더리움 네트워크 상태 모니터링하는 비주얼 인터페이스입니다.

$ git clone https://github.com/cubedro/eth-netstats
$ cd eth-netstats
$ npm install

grunt cli 설치

$ sudo npm install -g grunt-cli
$ grunt

Workspace 지정

$ mkdir POA
$ cd POA
$ mkdir node1 node2 node3

Wallet 생성

각 디렉토리에 지갑 생성

$ geth --datadir node1 account new
$ geth --datadir node2 account new
$ geth --datadir node3 account new

지갑들의 비밀번호로 사용할 텍스트 파일 생성

$ echo '1234' > password.txt

생성된 지갑 주소 예시

Address: e9f20d71593c3defd993f93b99778ec0d3209003
Address: 91b28e4064e5a104122d4757aae3a754785d7b04
Address: 6ac344bfda2c70d2d8a66e1f52e1df8563b3f615

genesis.json 생성 ( puppeth tool 사용 )

puppeth는 geth에서 제공하는 genesis.json 파일 생성 툴입니다.

$ puppeth

/** genesis 파일 이름 설정 */
Please specify a network name to administer (no spaces, hyphens or capital letters please)
> test

/** 새로운 genesis 파일 구성 */
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2

/** 새로운 genesis 파일 생성 */
What would you like to do? (default = create)
1. Create new genesis from scratch
2. Import already existing genesis
> 1

/** POA 합의 알고리즘 선택 */
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 2

/** Block 생성 주기 설정 */
How many seconds should blocks take? (default = 15)
> 5

/** POA 알고리즘에서 보증을 담당할 권한자 지갑 설정 */
Which accounts are allowed to seal? (mandatory at least one)
> 0xe9f20d71593c3defd993f93b99778ec0d3209003
>

/** 선입금해야하는 계정 설정 */
Which accounts should be pre-funded? (advisable at least one)
> 0xe9f20d71593c3defd993f93b99778ec0d3209003
>

/** 사전 자금 조달 여부 */
Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)
> y

/** 사용할 ChainId 설정 */
Specify your chain/network ID if you want an explicit one (default = random)
> 1234

/** genesis 파일 관리 선택 */
What would you like to do? (default = stats)
1. Show network stats
2. Manage existing genesis
3. Track new remote server
4. Deploy network components
> 2

/** 생성한 genesis 파일 내보내기 */
1. Modify existing fork rules
2. Export genesis configurations
3. Remove genesis configuration
> 2

/** genesis 파일명 설정 */
Which folder to save the genesis specs into? (default = current)
> Enter

Will create heenet.json, heenet-aleth.json, heenet-harmony.json, heenet-parity.json
> ctrl+c로 종료 안되면 ctrl+d로 종료

genesis 파일 이름 변경
$mv test.json genesis.json

bootnode 생성

bootnodegeth에서 제공하는 특정 네트워크에 참여하고자 하는 노드들을 서로 연결시켜주는 프로그램입니다.

부트노드 키를 생성하여 boot.key라는 파일로 저장합니다.

$ bootnode -genkey boot.key

more 키워드로 생성된 부트노드 키를 확인 할 수 있습니다.

$ more boot.key

생성한 키를 가지고 부트 노드를 실행하면 bootnode 주소가 콘솔에 나옵니다.

-verbosity 9 옵션은 개별 노드와 정보를 ping/pong 하는 로그를 확인하기 위한 것으로 실 운용에서는 없어도 됩니다.

-addr 옵션으로 포트를 설정할 수 있습니다. 기본 포트는 30310 입니다.

$ bootnode -nodekey boot.key -verbosity 9 -addr :30310

아래는 부트 노드를 실행하여 나온 부트 노드 주소 예시입니다.

encode로 시작하는 부분이 해당 노드의 이더리움 주소입니다.

이제 네트워크에 연결할 노드들은 이 주소를 부트 노드로 해서 접속하면 됩니다.
방법은 bootnodes 옵션에 이 주소를 추가하면 됩니다. 부트 노드가 여러개일 경우네는 ,로 구분합니다.

Node 연결

init 명령어를 통해 Geth를 초기화 합니다. --datadirdms Geth가 구동되는 directory를 지정하는 명령어입니다.

$ geth --datadir node1/ init genesis.json

node 실행

  • nohup 명령어를 사용하여 터미널의 세션 연결이 끊어지더라도 지속적으로 Geth가 실행되도록 합니다.
  • --ethstats node1:Hello@localhost:3000 = 노드명:WS_SECRET@eth-netstat url 형식으로 추가하여 Geth와 rpc로 통신을 할 수 있습니다.
  • --syncmode 'full' = 동기화 모드 full
  • --port 30302 = 사용할 포트 번호
  • --http = HTTP-RPC 서버 활성화
  • --http.addr = 접속할 IP 주소
  • --http.addr "localhost" = HTTP-RPC 서버 포트 번호
  • --http.corsdomain '*' = CORS 설정
  • --http.port = HTTP Port 설정
  • --authrpc.port 8501 = API용 수신 Port 설정
  • --http.api 'personal,db,eth,net,web3,txpool,miner' = HTTP-RPC 인터페이스를 통해 제공되는 API
  • --bootnodes = 연결할 부트 노드 주소
  • --networkid 1234 = 사용할 네트워크 ID
  • --miner.gasprice "1" = Transaction 마이닝에 필요한 최소 가스 가격
  • --unlock'90375c9a9a831b59d65a12f2d95b32adc57ce421' = 잠금을 해제할 지갑 주소
  • --password password.txt = 지갑 잠금을 해제하는데 사용할 암호 파일
  • --mine = 채굴 허용
  • & = nohup 백그라운드로 실행

Geth Command Option List

node1 실행

--ethstats부분은 실행시킬 node 디렉토리명:WS_SECRET@eth-netstat url 형식으로 작성하는데 저는 WS_SECRETHello로 넣고 실행해보도록 하겠습니다.

테스트하실 분들은 --bootnodes 옵션과 unlock 옵션을 각각 생성된 부트노드 주소와 지갑을 입력하시고 실행하면 됩니다.

$ nohup geth --datadir node1/ --ethstats node1:Hello@localhost:3000 --syncmode 'full' --port 30302 --http --http.addr "localhost" --http.corsdomain '*' --http.port 8500 --authrpc.port 8501 --http.api "admin,eth,miner,net,txpool,personal,web3" --bootnodes "enode://7c000172ebf169bd9887d9f42be95446628db4480314d1b53e349bf7a422d5678c71f3d4816e982527d6812fd2e95a85e4e6fa14ae3c4cafc35e378387c40bde@127.0.0.1:0?discport=30310" --networkid 1234 --miner.gasprice "1" --allow-insecure-unlock --unlock 'e9f20d71593c3defd993f93b99778ec0d3209003' --password password.txt --mine &

node2 실행

$ geth --datadir node2/ init genesis.json

$ nohup geth --datadir node2/ --ethstats node2:Hello@localhost:3000 --syncmode 'full' --port 30303 --http --http.addr "localhost" --http.corsdomain '*' --http.port 8502 --authrpc.port 8503 --http.api "admin,eth,miner,net,txpool,personal,web3" --bootnodes "enode://7c000172ebf169bd9887d9f42be95446628db4480314d1b53e349bf7a422d5678c71f3d4816e982527d6812fd2e95a85e4e6fa14ae3c4cafc35e378387c40bde@127.0.0.1:0?discport=30310" --networkid 1234 --miner.gasprice "1" --allow-insecure-unlock --unlock '91b28e4064e5a104122d4757aae3a754785d7b04' --password password.txt --mine &

node3 실행

$ geth --datadir node3/ init genesis.json
$ nohup geth --datadir node3/ --ethstats node3:Hello@localhost:3000 --syncmode 'full' --port 30304 --http --http.addr "localhost" --http.corsdomain '*' --http.port 8504 --authrpc.port 8505 --http.api "admin,eth,miner,net,txpool,personal,web3" --bootnodes "enode://7c000172ebf169bd9887d9f42be95446628db4480314d1b53e349bf7a422d5678c71f3d4816e982527d6812fd2e95a85e4e6fa14ae3c4cafc35e378387c40bde@127.0.0.1:0?discport=30310" --networkid 1234 --miner.gasprice "1" --allow-insecure-unlock --unlock '6ac344bfda2c70d2d8a66e1f52e1df8563b3f615' --password password.txt --mine &

실행중인 geth 노드 확인

리눅스 명령어를 사용하여 실행중인 노드들을 확인해봅시다.

$ ps -ef | grep geth

ps => 현재 실행중인 프로세스 목록을 보여주는 명령어
-e => 모든 프로세스 출력
-f => 풀 포멧으로 출력 ( UID, PID 등... )
grep => 특정 문자열을 찾는 명령어 ex) grep (찾을 단어)
| => ps -ef | grep geth 가운데 파이프 라인은, 파이프 라인을 기준으로 명령어1|명령어2 이런식으로 구분하고 명령어1의 처리결과를 명령어2로 전달합니다.

eth-netstats 실행

노드를 실행할 때 넣어주었던 Hello 키워드로 실행하면 됩니다.

$ cd eth-stats
$ WS_SECRET=Hello npm start

각 노드들이 연결되었는지 확인하고, genesis 파일을 생성할 때 세팅했던대로 5초마다 블록이 생성되는지 확인합니다.

Geth 통신 연결

$ geth attach [ IP 주소 ] = geth attach http://127.0.0.1:8500

nohup 종료

실행중인 geth 노드 확인

$ ps -ef | grep geth

실행중인 geth 노드의 PID 종료

$ kill -9 ( processID )

0개의 댓글