본문 바로가기
경일/Block-chain

[Block-chain / 블록체인] Geth 이용해서 Private Network 만들기

by dev_kong 2022. 6. 30.
728x90
728x90

0. 목차

1. 개요

2. Geth 톺아보기

3. IPC 통신

4. Private Network

 

 

1. 개요

저번 포스팅에서 Geth란 Go 언어로 빌드된 ethereum 클라이언트를 뜻한다고 했었다.

 

ehtereum 클라이언트는 여러가지 언어로 빌드가 되어있는데

그중 go 언어로 빌드 된, 즉 Geth 가 근본이라 할수 있다.

 

오늘은 이걸 가지고 Private Network 생성을 해보려고한다.

2. Geth 톺아보기

우선 geth에 대해 좀더 알아본 뒤에
private network를 구현해보려한다.

 

geth의 설치와 환경변수 설정은 이전의 포스팅에서 다뤄본 적이 있다.

geth를 실행시키면 현재 이더리움 메인넷의 데이터를 가져온다.

 

m1 mac 기준으로 가져온 데이터들은

~/Library/Ethereum 디렉토리에 저장된다.

 

이 디렉토리안에는 gethkeystore 디렉토리가 있는데

geth는 이더리움 클라이언트를 저장하는 공간이고

 

keystore는 예~전의 포스팅 에서 privateKey를 컴퓨터에 저장하는 걸 해본적있는데, 방식이 동일한지는 모르겟지만,

privateKey를 저장하는 공간이다.

 

2-1. geth 명령어

geth

저번 포스팅에서 환경변수를 설정해놔서 geth 명령어만 실행시키면 메인넷의 내용을 가져온다.

그런데 여기에 여러가지 옵션이 있는데,

  • full sync : 모든 블록받기
  • fast sync : latest tx - 1024
  • light sycn : 블록헤더 정보와 latest snap shot을 받는다.

옵션 없이 geth 명령어를 실행시키면 default는 fast sync이다.

우리가 사용 할것은 light sync를 사용할 것이다.

 

geth --syncmode light

 

어느정도 시간이 지나고 나면,

 

INFO [06-30|10:04:12.627] Imported new block headers               count=1    elapsed=7.470ms   number=15,047,842 hash=5108e7..028e1d

 

이 문구가 하나씩 하나씩 천천히 뜬다.

이 내용은 기존의 블록들은 이미 다 다운을 받았고,

새로 생긴 블록이 추가 되는 거다.

 

etherscan.io 에 들어가서 최신 블록의 해시값을 비교해보자.

 

내 터미널에 찍힌 hash 와 etherscan의 최신 블록의 hash값이 일치한다면,

설치는 끝난거다.

 

3. IPC 통신

IPC 통신이란?

 

IPC는 Inter Process Communication 의 약자로써,
한 컴퓨터 내에서 서로 다른 프로세스 끼리 통신을 하는것이다.

 

예를들어, 브라우저로 유튜브를 재생시켜놓고,
VS Code로 코딩을 한다고 치면,
브라우저와 VS Code는 서로 다른 프로세스로 처리되고 있는 것이다.


그런데 이 두개의 다른 프로세스 끼리 통신하는 것을 IPC 통신이라고 한다.

 

 

이제,

터미널을 새로 열어서(geth가 돌아가고 있는 프로세스는 종료하면 안된다.)

명령어를 하나 실행해보자

 

source ~/.bash_profile
geth attach ~/Library/Ethereum/geth.ipc

 

geth가 돌아가고 있는 프로세스와
방금 새로 실행한 프로세스는 서로 다른 프로세스이다.


그러니 IPC 통신을 이용하는 것이다.

 

기존의 환경변수를 설정해줬지만 전역환경변수가 아닌 지역 환경변수로 설정을 했기때문에,

source 명령어를 한번더 입력해준 뒤 실행을 해야 된다.

 

위 명령어를 실행하면

이런 화면이 나온다면 성공이다.

 

현재 이 프로세스에서 이전의 포스팅에서 다뤘던 web3 메소드들이 대부분 사용가능하다.

 

간단하게 몇개 명령어를 입력해보자

 

> web3.eth.syncing
# false

 

위 명령어를 입력했을때 false가 나온다면 sync가 완료 됐다는 것이다.

 

admin

 

이걸 입력하면 어마어마한 객체가 하나 튀어나온다.

 

아 그냥 이런게 있구나...

 

정도만 보면 된다.

중요한 건 아래의 명령어이다.

 

 

> admin.nodeInfo.enode

 

위명령어를 입력하면 url 주소 같은 것이 출력되는데,

해당 주소가 내가 현재 실행중인 노드의 주소로 사용된다.

 

이전의 포스팅에서 addToPeer 를 할때 IP 주소를 이용했었는데

IP 대신 위에서 출력된 내용을 이용할 수 있다.

 

> personal

 

입력하면 객체가 하나 나오는데,

 

 

메서드 들이 많이 있다.

 

여기서 우리가 한번 사용해볼것은

newAccount이다.

 

 

> personal.newAccount()

 

위 명령어를 입력하면 비밀번호를 생성하라고 나온다.

각자 까먹지 않을 비밀 번호를 설정해주면 된다.

 

두번의 비밀번호를 입력하고 나면,

account(계정)이 출력된다.

 

그리고 아까 말했던 keyStrore 디렉토리 (~/Library/Ethereum/keystore)를 확인해보면

파일이 추가된걸 확인해볼 수 있다.

 

해당 계정을 metamask에 추가해보자.

 

브라우저를 켜서 metamask를 실행시키고 계정 추가를 눌렀을때 옵션이 나오는데

그걸 JSON 파일로 바꾼뒤 파일을 드래그 해주면,

계정이 추가가 된다.(시간 좀 걸림)

 

mining에 대한 명령어도 실행시켜 보고 싶지만,

geth를 light sync 로 연결했기때문에 안타깝게도, 마이닝에 대한 모듈이 존재하지 않는다.

 

4. Private Network

Private Network를 위한 디렉토리를 생성해주고,

그안에 genesis.json 파일을 만들어주자.

 

{
  "config": {
    "chainId": 7722,
    "homesteadBlock": 0
  },
  "difficulty": "200000",
  "gasLimit": "3100000",
  "alloc": {}
}

 

genesis.json이다.

 

geth --datadir node init genesis.json

 

파일 생성 후 위의 명령어를 실행하면

위에서 생성한 gensis.json을 바탕으로 node라는 디렉토리를 구성해준다.

 

프라이빗 네트워크를 위한 디렉토리를 구성해준것이다.

 

geth --datadir node --nodiscover

 

네트워크를 실행해주는데,

자동으로 peer가 연결되지 않게끔 --nodiscover설정을 추가해주었다.

 

geth attach [geth.ipc 경로]

 

그러고 나서 터미널을 새로 하나 열고

위 명령어를 실행해주면 이전에 봤던 화면과 똑같은 화면이 나온다.

 

현재는 light sync가 아니라 fast sync 이기 때문에 마이닝 기능이 가능하다!

 

그런데 마이닝을 해보기 전에 설정을 해줘야 하는데

그게 바로 coin base 이다.

 

그런데 coin base 설정을 위해선 계정이 필요하다

명령어를 통해 계정을 생성해주자

 

> personal.newAccount()

 

비밀번호를 설정하고,

 

> eth.coinbase

 

를 입력해보면 새로생긴 계정으로 자동으로 연결되어있는걸 볼수 있다.

만약 연결된 계정을 바꾸고 싶다면,

 

> miner.setEtherbase(eth.accounts[1])

를 해주면 된다.

 

변경전에 당연히 계정을 새로 추가를 하고 해야한다.

 

이제 마이닝을 해보자

 

> miner.start(1)

 

위 명령어를 입력하고, geth를 확인해보면

 

 

이런게 계속 뜬다

이거 멈추고 싶으면

 

> miner.stop()

 

그리고 balance를 확인해보자.

 

 

> web3.fromWei(eth.getBalance(eth.coinbase),'ether')

 

getBalace를 인자로 eth.coinbase를 입력해준값을 ether로 변경해서 출력해준다.

원래는 연결까지 해보려했지만 어떤이유에서 인지 되질 않는다.


해결을 해보고 다음포스팅에 올리겠음

728x90
728x90

댓글