Blockchain

#19 geth

Sila 2022. 6. 30. 19:29

본격적으로 이더리움 테스트넷을 구동해 작업을 시도하기 전에

 

저번에 간략하게 소개한 geth의 몇 가지 기능들을 사용하는 법을 알아보자.

 

1. 블록 동기화

테스트용 네트워크를 구동하는 기능과 더불어 실제 이더리움의 메인 네트워크와 동기화하는 기능도

 

geth는 가지고 있다.

 

동기화에는 3가지 유형이 있는데

 

i) full sync : 모든 블록과 tx 데이터를 가져온다.

 

ii) fast sync : 최근 1024개 블록의 블록 헤드만을 가져온다.

 

iii) light sync : 현재의 상태만을 가져온다. 검증하기 위해서는 다른 full sync 노드들의 도움이 필요하다. 

 

(채굴 기능을 사용할 수 없다.)

 

light sync 기능을 사용해 이더리움 네트워크와 동기화해보자.

 

geth --syncmode light

 

 

이런 저런 정보가 출력이 된 후, 동기화를 시작할텐데, 이 중 IPC endpoint에 대한 값은 기억해두자.

 

IPC는 inter process communication ( process간 상호작용) 으로 내 컴퓨터에서 돌아가는 프로세스 간의 통신을 의미한다.

 

잠시 기다림녀 동기화가 다 끝나고 새로 생성되는 블록도 받아오는 것을 확인할 수 있다.

 

받아오는 블록헤더가 정말 이더리움 네트워크의 블록이 맞는지 확인하기 위해서는 etherscan.io 에 들어가

 

블록의 해시값을 비교해보면 된다.

 

네트워크에 새 블록이 추가된 후 웹 사이트가 업데이트 되기 까지는 약간의 딜레이가 존재하므로 그걸 감안해

 

etherscan의 최근 블록 해시와 내 터미널에서 최근 업데이트된 몇개의 해시를 비교해보면 된다.

 

 

이제 이 블록체인에 대해 뭔가 작업을 하고 싶다면 다른 터미널을 열어 이 geth와 상호작용을 해야한다.

 

아까 기억해둔 IPC endpoint url을 이때 사용한다.

 

geth가 잘 실행되었다면 이제 동기화된 체인에 대해 몇 가지 작업을 수행할 수 있다.

 

> web3.eth.syncing
false

// 현재 동기화 진행중인가?
// 동기화가 다 되었거나 하지 않았다면 false,

> web3.eth.accounts
[]
// 현재 생성한 account들 (아직 지갑을 생성하지 않았다면 빈 배열을 준다)

> personal.newAccount()
Passphrase: (비밀 번호 - 알아서 정하면 된다)
// 입력하면 새로운 지갑과 개인키를 만들어준다

 

2. 테스트용 네트워크 구동

우선 제네시스 블록을 만들고, 새로 구동할 네트워크가 이 제네시스 블록을 사용하도록 지정해줘야 한다.

 

/*  genesis.json  */

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

 

이 제네시스 블록의 데이터를 기반으로 블록체인 네트워크를 만들어 준다.

 

geth --datadir node init genesis.json

 

 

node라는 폴더를 생성하고, 그 안에 genesis.json을 이용해 네트워크에 필요한 요소들을 만들겠다는 것을 의미한다.

 

geth --datadir node --ipcpath "~/.Ethereum/geth.ipc"

 

위와 같이 ipcpath를 지정한 후 네트워크를 구동한다.

 

geth attach /home/sila/.Ethereum/geth.ipc

 

다른 터미널에서 ipc 루트 (절대경로)와 함께 입력해 geth attach를 실행할 수 있다.

 

(네트워크 구동시에도 IPC endpoint URL을 주므로 이를 입력하면 된다)

 

> admin.nodeInfo.ports.discovery
62985

// 현재 내가 사용하는 포트를 확인한다.
// 다른 사람들이 이 포트를 이용해 나와 연결 할 수 있다.

 

혹시 체인 id, 제네시스 블록이 모두 동일할 경우에도 enode가 이 port를 통해 식별을 할 수 있다.

 

다른 사람과 연결을 막고 싶다면 네트워크를 껏다가 다시 실행을 할 때 --nodiscover 플래그를 붙어주면 된다.

 

geth --datadir node --nodiscover --ipcpath "~/.Ethereum/geth.ipc"

 

> web3.eth.chainId()
"0x1e2a"

// 현재 네트워크의 chainId를 16진수로 알려준다

 

3. 계정 생성, 채굴

> personal.newAccount()
// 아까 정한 비밀번호를 입력하면 지갑을 하나 생성해준다. 이를 두 번 반복한다.
// 0x91b640e72aa978a42bfd5d5070d22caad80b45eb
// 0x93c47456a73cc76172875e6327b714bc54f7d8db"

 

다시 한 번 전체 지갑 목록을 불러오면 두 개 원소를 가진 배열을 돌려준다.

 

> eth.accounts
["0x91b640e72aa978a42bfd5d5070d22caad80b45eb", "0x93c47456a73cc76172875e6327b714bc54f7d8db"]

 

코인 베이스 계정을 확인하고 ( 처음 생성한 계정이 코인 베이스 계정이 된다. )

 

이를 다른 계정으로 교체해보자.

 

eth.coinbase
// 0x91b640e72aa978a42bfd5d5070d22caad80b45eb

miner.setEtherbase(eth.accounts[1])
// true

eth.coinbase
// 0x93c47456a73cc76172875e6327b714bc54f7d8db

 

채굴을 시작하면 이 코인베이스 계정으로 보상이 들어올 것이다.

 

miner.start(1)
// null (채굴 시작)

 

그럼 geth 네트워크가 구동되는 터미널에서 곡괭이 모양이 나오는데, 채굴이 진행되고 있다는 의미이다.

 

시간이 좀 지난 후 채굴을 멈추고 잔액을 확인해보자.

 

miner.stop()
// null

eth.getBalance(eth.coinbase)
// 180000000000000000000

 web3.fromWei(eth.getBalance(eth.coinbase), 'ether')
 // 180 - 단위를 ether로 변경해주는 web3의 기능을 사용한다.

 

 

'Blockchain' 카테고리의 다른 글

#21 smart contract  (0) 2022.07.11
#20 개인 네트워크 만들기 (geth)  (0) 2022.07.03
#18 metamask 활용  (0) 2022.06.29
#17 ethereum  (0) 2022.06.29
#16 transaction ch.6 - tx pool  (0) 2022.06.27