Geth는
go
언어로 구성된 이더리움 클라이언트로 이더리움 네트워크의 노드를 구성하는데 사용합니다.
$ sudo apt update
$ sudo apt install golang -y
$ sudo apt install -y libgmp3-dev tree make build-essential
$ git clone https://github.com/ethereum/go-ethereum.git
$ cd go-ethereum
$ make all
$ 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
를 어떤 위치에서도 사용할 수 있도록 환경변수를 설정해줍니다.
$ 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
eth-netstats
은 이더리움 네트워크 상태 모니터링하는 비주얼 인터페이스입니다.
$ git clone https://github.com/cubedro/eth-netstats
$ cd eth-netstats
$ npm install
$ sudo npm install -g grunt-cli
$ grunt
$ mkdir POA
$ cd POA
$ mkdir node1 node2 node3
$ 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
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
는geth
에서 제공하는 특정 네트워크에 참여하고자 하는 노드들을 서로 연결시켜주는 프로그램입니다.
부트노드 키를 생성하여
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
옵션에 이 주소를 추가하면 됩니다. 부트 노드가 여러개일 경우네는,
로 구분합니다.
init
명령어를 통해Geth
를 초기화 합니다.--datadirdms Geth
가 구동되는directory
를 지정하는 명령어입니다.
$ geth --datadir node1/ init genesis.json
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 백그라운드로 실행
--ethstats
부분은 실행시킬node 디렉토리명:WS_SECRET@eth-netstat url
형식으로 작성하는데 저는WS_SECRET
을Hello
로 넣고 실행해보도록 하겠습니다.테스트하실 분들은
--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 &
$ 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 &
$ 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 &
리눅스 명령어를 사용하여 실행중인 노드들을 확인해봅시다.
$ ps -ef | grep geth
ps
=> 현재 실행중인 프로세스 목록을 보여주는 명령어
-e
=> 모든 프로세스 출력
-f
=> 풀 포멧으로 출력 ( UID, PID 등... )
grep
=> 특정 문자열을 찾는 명령어 ex) grep (찾을 단어)
|
=> ps -ef | grep geth 가운데 파이프 라인은, 파이프 라인을 기준으로 명령어1|명령어2 이런식으로 구분하고 명령어1의 처리결과를 명령어2로 전달합니다.
노드를 실행할 때 넣어주었던
Hello
키워드로 실행하면 됩니다.
$ cd eth-stats
$ WS_SECRET=Hello npm start
각 노드들이 연결되었는지 확인하고, genesis 파일을 생성할 때 세팅했던대로 5초마다 블록이 생성되는지 확인합니다.
$ geth attach [ IP 주소 ] = geth attach http://127.0.0.1:8500
$ ps -ef | grep geth
$ kill -9 ( processID )