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
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...'
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를 사용할 수 있다.
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개 이상의 노드에서 번갈아가며 블록을 생성한다.
'시작 > TIL(Today I Learned)' 카테고리의 다른 글
230823 - 알고리즘 적용하는 위치에 따른 방법 3가지 (SHA-256) (0) | 2023.08.24 |
---|---|
230821 - 빅오 표기법 ( Big O natation) (0) | 2023.08.22 |
230814 - Electron 구조 (0) | 2023.08.14 |
230811 - Electron.js 기초 (0) | 2023.08.11 |
230728 - Hardhat (0) | 2023.07.28 |
댓글