2 분 소요

Geth


실행 환경 : Docker Ubuntu

Geth Version : 1.10.24 - stable

Docker로 Ubuntu Geth 실행

이더리움 Geth 1 : 로컬 테스트넷에서 계정 생성, 트랜잭션 및 채굴

로컬에서 두 노드 연결

ubuntu 접속 및 노드 생성


ubuntu 접속

먼저 앞서 생성한 container를 확인하고, container를 실행 및 접속 한다. 이 때, 두 개의 노드를 연결해 줄 것임으로 두 개의 터미널에서 접속한다.

$ docker ps -a
$ docker start con_ubuntu
$ docker exec -it con_ubuntu bash

1

노드 생성

go-ethereum 아래 각 노드의 폴더를 생성한다.

2

이후 geth 노드를 생성하기 위해 genesis 파일을 생성한다. 이 때, 같은 블록체인 네트워크 상에 존재하려면 같은 genesis 파일을 가지고 있어야 한다.(GenesisBlock 생성)

3

4

5

위 과정으로 같은 genesis 파일을 가지고 노드를 생성한다. 이 때는 블록체인 데이터를 저장할 디렉토리만 다르다.

# 터미널 1
$ geth --datadir test_node1 init test_node1/genesis.json
# 터미널 2
$ geth --datadir test_node2 init test_node2/genesis.json

6

두 개의 노드 연결


먼저 두 노드 모두 geth에 접속한다. 이 때, 두 노드는 같은 PC에 있기 때문에 포트와 디렉토리만 다르고 나머지는 같다.(Geth 실행)

# 터미널 1
$ geth --networkid 1007 --datadir test_node1 --nodiscover --port 30303 --allow-insecure-unlock --authrpc.port “8547” --http --http.port “8548" --http.addr “0.0.0.0” --http.corsdomain “*” --http.api “eth, net, web3, miner, debug, personal, rpc” console
# 터미널 2
$ geth --networkid 1007 --datadir test_node2 --nodiscover --port 30304 --allow-insecure-unlock --authrpc.port “8549" --http --http.port “8550” --http.addr “0.0.0.0" --http.corsdomain “*” --http.api “eth, net, web3, miner, debug, personal, rpc” console
  • authrpc.port : 인증된 API를 수신할 포트로 노드간의 연결을 위해 필요하다.

7

위와 같이 두 노드 모두 geth에 접속이 완료되면, 노드 2에서 노드 1으로 연결할 것이기 때문에 노드 1의 enode URL을 확인한다.

# 터미널 1
> admin.nodeInfo.enode

8

위와 같이 노드 연결을 위한 enode URL이 확인되면, 노드 2에서 enode URL을 통해 연결을 진행하고 연결된 피어 정보를 확인한다.

# 터미널 2
> admin.addPeer("노드 1 enode URL") # 노드 1과 연결
> admin.peers # 연결된 노드(피어) 확인

9

채굴


노드 간 네트워킹이 정상적으로 이루어졌는지 확인하기 위해 채굴을 통해 블록 정보가 동기화 되는지 확인한다.

먼저, 노드 1에서 채굴을 진행한다.

# 터미널 1
> personal.newAccount() # 계정 생성 -> 채굴자는 0번 계정이기 때문에 따로 지정 X
> miner.start(1) # 채굴 시작

10

채굴을 진행하면 연결된 노드간의 블록 Sync가 이루어지는 것을 확인할 수 있다.

또한, 블록 숫자를 확인하면 보다 명확하게 확인할 수 있다.

> eth.blockNumber

11

트랜잭션 생성


앞서 두 개의 노드가 같은 블록체인 네트워크상에 존재하는 것을 확인했다. 따라서 두 노드간의 송금 또한 가능하다.

먼저 앞서 채굴한 계정의 잔액을 확인한다.

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

12

이후 노드 2에서 Eth를 받을 계정을 생성하고 노드 1에서 노드2 계정으로 송금을 한다.

# 터미널 2
> personal.newAccount()

# 터미널 1
> personal.unlockAccount(eth.coinbase) # 송금을 위한 계정 잠금 해제
> eth.sendTransaction({from: eth.coinbase, to: "노드2 계정 주소", value: web3.toWei(2,'ether')}) # 송금

13

위와 같이 송금이 완료되면 블록에 트랜잭션을 담는 채굴자가 없기 때문에 해당 트랜잭션 pending될 것이다.

14

따라서 채굴을 진행하고 트랜잭션을 블록에 올린 후, 노드 2의 계정 잔액을 확인한다.

> miner.start(1) # 채굴 시작
> eth.pendingTransactions # pendingTransaction 확인, 없을 경우 트랜잭션 처리
> miner.stop() # 채굴 종료

# 터미널 2
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether') # 노드 2 계정 잔액 확인

15

본 포스팅은 코드스테이츠 BEB 과정을 수강하며 작성한 글입니다.

카테고리:

업데이트: