부트노트란 지난번처럼 docker로 노드1과 노드2를 운용할때 노드2에 노드1의 enode를 직접 admin.addPair로 추가해줘야했다. 만약 노드수가 많아진다면 일일이 이렇게 추가해주는것이 힘들고 그런 경우를 위해 부트노드를 운영하여 부트노드에 모든 기존노드와 새노드를 연결하면 부트노드가 중개자 역할을 하여 기존의 노드가 가진 데이터를 부트노드에 연결한 새 노드들에게 전달하고 동기화 할 수 있게 해준다.
2. 부트노드 구성 하기
apt-get install bootnode
부트노드 패키지를 설치한다. 노드 1과 노드2를 각각 연결하기 위해 지난번 노드1,2 연결하기 처럼 docker의 exec를 이용해 우선 노드1부터 docker로 접근한다.
# 실행중인 container list 확인
docker ps -a
# container 실행; 여기서는 'con_ubuntu'
docker start con_ubuntu
# container 이름에 따라 일부 수정하여, 다음 명령어로 도커에 접속 실행
docker exec -it con_ubuntu bash
docker에 들어 간뒤 키를 bootnode 키를 생성해야한다. 부트노드 키를 생성하여 boot.key라는 파일에 저장한다.
# test_node1로 이동하여 bootnode key를 생성합니다.
cd go-ethereum/test_node1
bootnode -genkey boot.key
cat boot.key
cat boot.key로 문자열키가 나타나게 된다. 해당 키로 bootnode를 실행해보자.
bootnode -nodekey boot.key -verbosity 9
명령어를 test_node1 디렉토리에서 실행한다.
enode://로 시작하는 부분이 이 노드의 이더리움 주소이다. 우리는 로컬에서 환경을 열었으므로 127.0.0.1이 된다. 이제 이 enode가 부트노드의 enode로 여기 접근하는 노드들은 부트노드를 사용할 수있다. 부트노드 기본 포트는 30301이다. 포트는 -addr옵션으로 -addr :30310 을 사용하여 바꿀 수 있으며 verbosity 9 은 개별노드와 정보를 핑퐁하는 로그를 확인하는 것이다. bootnode를 사용하려면 bootnode를 실행한 상태로 두어야한다.
이제 부트노드가 구성됐고 다른 노드를 구성해서 부트노드에 연결해보자.
2.1 도커를 이용하여 새로운 컨테이너를 만들자
docker create -it --name con_ubuntu3 ubuntu
docker start con_ubuntu3
docker ps -a
docker exec -it con_ubuntu3 bash
새 컨테이너를 만들었으면 exec로 접근하여 go-etherum과 geth를 설치하자. 이는 이전 포스팅을 그대로 따라하면된다.
$ apt update -y && apt install -y software-properties-common
=> 지역 아시아 6 엔터 => 수도 서울 69 엔터
add-apt-repository ppa:ethereum/ethereum 엔터
$ apt-get install vim -y
$ apt update -y && apt install geth
$ apt-get install git -y
$ cd ~
$ git clone https://github.com/ethereum/go-ethereum
$ apt-get install -y build-essential golang
go-ethereum과 geth가 설치하고 나면 go-ethereum 안에 test_node1 디렉토리를 생성하고 그안에 genesis.json 파일을 생성하자. 그 후에 geth를 아래 명령어를 통해 초기화한다.
[genesis.json]
{ "config": { "chainId": 1007, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "0x20000", "gasLimit": "0x2fefd8", "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "extraData": "", "nonce": "0x0000000000000000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00" }
[geth 초기화]
geth --datadir test_node1 init test_node1/genesis.json
초기화가 끝난뒤 etherbase 즉 채굴에 사용할 계정을 생성합니다.
geth --datadir test_node1 account new
계정 생성후 부트노드의 엔노드를 활용해 접속하자!
geth --datadir test_node2 \
--syncmode 'full' --port 30312 \
--bootnodes 'enode:// 아까 생성한 엔노드' \
--networkid 1007 --miner.gasprice '1' console
아까 부트노드에서 엔노드를 입력하고 실행한다. 이로써 부트노드에 노드1이 연결됐고 이후로 노드2를 새로만들어 연걸해보자. 노드1 컨테이너를 만들때 처럼 똑같이 만든뒤 위 geth 접속만 다르게한다.
--bootnodes에서 엔노드뒤 ip주소를 로컬인 127.0.0.1이 아닌 첫번째 노드의 아이피 주소를 활용해 적는다.
여러개의 도커가 실행되고 있다면 서로다른 도커가 다른 도커에 접근하기 위해 각 도커의 네트워크 정보를 알아야한다.
노드1에서 docker network inspect bridge를 실행한뒤
IPv4어드레스에 적힌 주소를 사용하여 geth 에 접속하자.
'개발 학습 > 블록체인' 카테고리의 다른 글
클레이튼 트랜잭션 처리시 "invalid unit price" (0) | 2022.04.02 |
---|---|
지속 연결 네트워크를 위한 static.nodes.json (0) | 2022.02.21 |
Docker로 노드 운영 (4) : 두 개의 노드 연결하기 (0) | 2022.02.19 |
Docker로 노드 운영 (3) : Geth로 채굴, 트랜잭션 생성 (0) | 2022.02.19 |
Docker로 노드 운영 (2) : 계정 및 제네시스 블록 생성 (0) | 2022.02.19 |
댓글