본문 바로가기
시작/TIL(Today I Learned)

230817 - GETH를 이용한 Ethereum private network 구축하기(POA)

by 백씨네 2023. 8. 17.

Private Network

1. geth 설치하기

macOS 설치 방법

#brew 설치 확인하기
$ brew -v
$ brew tap ethereum/ethereum
$ brew install ethereum

# ethereum 업데이트하기
$ brew update
$ brew upgrade
$ brew reinstall ethereum

공식문서 : https://geth.ethereum.org/docs/getting-started/installing-geth

 

Installing Geth | go-ethereum

Guide to installing Geth

geth.ethereum.org

 

2. genesis.json 생성하기

{
    "config": {
        "chainId": 119, // 원하는 chainId를 지정한다.
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "clique": {
            "period": 5, //블록생성 주기
            "epoch": 30000 // 블록을 그룹화하는 단위 30000개 블록마다 스냅샷을 생성한다.
        } // POA 합의 알고리즘 사용을 위해서 clique 속성을 이용한다.
    },
    "difficulty": "1",
    "gasLimit": "8000000",
    "extradata": "0x0000000000000000000000000000000000000000000000000000000000000000a22061Eb8c9702Cfac2d9d8ce6dfF9A195d05e810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", // extradata를 이용해서 초기 참여자를 지정할 수 있다.
    "alloc": {
        "a22061Eb8c9702Cfac2d9d8ce6dfF9A195d05e81": { "balance": "100000000000000000000" },
        "12ec9720a6Cc8e48aD745eadeB49f2C38eC5Ef59": { "balance": "400000" },
        "13169CD3EA4041A546F7c70906fFFAa26D939b87": { "balance": "100000000000000000000" }
    } // 노드를 실행할 때 최초에 넣어줄 잔액이다. wei단위로 1eth = 10^18 wei이다.
}

genesis.json에서 계정을 작성할 때는 '0x'를 제외하고 작성한다.
extradata에는 0의 개수 그대로 유지해서 작성해야 한다. 위의 예시에서는 a22~e81까지가 하나의 계정이다.

 

3. Keystore

geth account new --datadir $PWD

명령어를 실행하면 비밀번호를 생성하라는 문구가 나온다.

'Your new account is locked with a password. Please give a password. Do not forget this password.'

 

해당 비밀번호는 생성한 key를 unlock 할 때 사용한다.
계정이 잠금상태일 때는 트랜잭션에 서명을 할 수 없지만 비밀번호를 통해서 unlock을 한 후 트랜잭션 서명에 사용할 수 있다.

키는 여러 개를 사용할 수 있으며, 노드를 실행할 때 언락을 할 계정을 지정한다.


--unlock '0xKEY1,0xKEY2...'

key 생성

 

 

4. 비밀번호를 txt 파일로 만들기

노드를 실행할 때 unlock 플래그를 이용해서 키를 잠금 해제하고 노드에서 사용하게 되는데 이를 쉽게 하기 위해서 txt파일로 지정해서 사용할 수 있게 한다.

 

Key가 여러 개인 경우에는 줄 바꿈을 통해서 각 키에 대한 비밀번호를 적어주면 된다.

줄바꿈을 이용해서 여러개의 비밀번호 지정하기

5. 제네시스 파일로 초기화

# 생성한 제네시스 블록을 이용해서 초기화하기
$ geth init --datadir $PWD genesis.json

위의 명령어를 이용해서 커스텀한 제네시스 블록으로 초기화할 수 있다.

 

6. 노드 실행 및 피어 맺기

노드를 실행하기 위해서 여러 명령어, 플래그를 이용한다.
명령어에 대한 자세한 설명은 'geth -h'를 이용하여 확인할 수 있다.
각 노드의 port는 겹치지 않도록 지정을 해야 한다.

node 1

geth \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8551 \
--datadir $PWD \
--syncmode 'full' \
--allow-insecure-unlock \
--networkid 119 \
--maxpeers 5 \
--http \
--http.port 8545 \
--http.addr "0.0.0.0" \
--http.corsdomain "\*" \
--http.api "admin,eth,debug,miner,net,txpool,personal,web3" \
--ws \
--ws.port 3335 \
--ws.api eth,net,web3 \
--port 30303 \
--nodiscover \
--unlock '0xa22061eb8c9702cfac2d9d8ce6dff9a195d05e81' \
--password $PWD/password.txt \
--miner.etherbase "0xa22061eb8c9702cfac2d9d8ce6dff9a195d05e81" \
console

node 2

geth \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8552 \
--datadir $PWD \
--syncmode 'full' \
--allow-insecure-unlock \
--networkid 119 \
--maxpeers 5 \
--http \
--http.port 8546 \
--http.addr "0.0.0.0" \
--http.corsdomain "\*" \
--http.api "admin,eth,debug,miner,net,txpool,personal,web3" \
--ws \
--ws.port 3334 \
--ws.api eth,net,web3 \
--port 30304 \
--unlock '0x13169CD3EA4041A546F7c70906fFFAa26D939b87' \
--bootnodes "enode://2549091a058dc0f3312654556bca621a84226b6e45270b838572b68ebdb1a7e8d9438ea9575dac31a8859b83b453a177eb58ac50a2940bab7a53bea69688ef56@127.0.0.1:30303" \
--password $PWD/password.txt \
console

두 노드를 실행할 때 명령어의 차이점이 있는데 --miner.etherbase, --nodiscover, --bootnodes 각각이 있거나 없을 수 있다.
(위의 모든 명령어는 필요한 것을 사용하면 된다.)

  • --miner.etherbase : 채굴 시 보상을 위해서 계정을 지정하는 것인데, POA에서는 채굴에 대한 보상이 없기 때문에 실질적으로 리워드가 주어지진 않지만, 계정을 지정해 주어야 마이닝을 실행할 수 있다.
    • 노드 실행 후 콘솔에서 miner.setEtherbase("0x를 포함한 계정")을 이용해서 설정 가능하다.
  • --nodiscover : 노드가 다른 노드를 자동으로 찾지 못하게 한다. 특정 피어와만 연결하려면 이 옵션을 사용하고 --bootnodes 옵션으로 연결하려는 피어를 지정한다.
  • --bootnodes : 노드가 다른 노드와 연결할 때 사용한다. 실행 중인 'enode' URL을 지정해주어야 한다.
    • 노드 실행 후 콘솔에서 admin.addPeer("enode URL")을 이용해서 설정 가능하다.

이렇게 해서 노드를 실행하고 피어를 맺을 수 있다. console 명령어를 이용해서 JS console을 열었고 지정했던 api를 사용할 수 있다.

 

위 : enode 아래 : 잠금 해제된 key

7. 블록생성하기

제네시스 블록으로 참여자를 1번 노드의 계정만 했기 때문에 해당 블록만 mining을 진행할 수 있다.
그러므로 1번 노드에서 miner.start()를 이용해서 블록을 생성할 수 있다.

 

위에서 --miner.etherbase 명령어를 안 쓰게 되면 Etherbase 관련 에러가 발생한다.
Etherbase 관련 에러가 발생하면 miner.setEtherbase("0x를 포함한 계정")를 이용해서 지정해 주고 miner.start 할 수 있다.

최초에 실행할 때 참여자를 1명만 지정했기 때문에 혼자서 mining이 가능하지만 2~3명 이상이 되면
Block sealing failed, err="signed recently, must wait for others" 에러가 발생한다.

 

참여자가 여럿일 때 혼자서 계속 블록을 생성할 수 있는 것이 아닌 다른 참여자도 miner.start를 지정해주어야 한다.
모두 마이닝을 시작하게 되면 2개 이상의 노드에서 번갈아가며 블록을 생성한다.

댓글