우리는 Docker에서 한 노드를 로컬에서 운영했다. 노드를 하나 돌리면 인접 노드가 참여하게 되면 인접노드는 기존노드와 연결되어 기존의 데이터를 가져와서 서로 동기화하는 작업을 하게된다. 이것을 Docker안에서 구현해보자.
우선 터미널을 두개 작동시켜야하는데 도커CLI에서 기존의 attach를 사용하면 서로 다른 터미널로 접속하더라도 하나의 도커터미널에 연결되므로 각각 서로 다른 화면이 되도록 해야한다.
실행중인 Docker 컨테이너를 확인하고 컨테이너 이름을 체크한 뒤 exec명령어 하나의 도커에서 여러 활동을 할 수 있게 한다.
1. Docker 터미널 2개 열기
# 실행중인 container list 확인
docker ps -a
# container 실행; 여기서는 'con_ubuntu'
docker start con_ubuntu
# container 이름에 따라 일부 수정하여, 다음 명령어로 도커에 접속 실행
docker exec -it con_ubuntu bash
이렇게 2개의 터미널로 각각 접속한뒤 go-etherum 디렉토리로 이동한다. ls를 찍어보면 아래 경로가 나오는데 cd ~를 통해 뒤로 이동하게되면 아까 생성한 go-ethereum 디렉토리가 나타나고 cd 해 go-ethereum으로 접근한다.
이 후 해당 폴더에서 2개의 디렉토리를 생성한다. 노드1번과 노드2번을 작동시킬 폴더로 서로 연결하기 위함이다.
mkdir test_node1 test_node2
생성한 디렉토리 안에 각각 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"
}
이번 alloc에는 저번과는 다르게 초기지갑주소가 없다!!!! 잘 확인하자. tree명령어로 생성한 구조를 확인해보자
2. Node 1 ,2 생성 및 연결
geth --datadir test_node1 init test_node1/genesis.json
test_node1 안에있는 제네시스를 먼저 생성한다.
이전과 같이 Successfully가 나오면 성공!!! 같은 방식으로 test_node2의 제네시스도 생성해준다. 이때 해당 명령어의 디렉토리명을 test_node2로 바꾸어주자
이제 터미널1에서 첫번째 노드를 연결해야한다.
터미널 1에서 명령어 실행
geth --networkid 1007 --datadir test_node1 --nodiscover --port 30303 --allow-insecure-unlock --http --http.port "8545" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console
터미널 2에서 명령어 실행
geth --networkid 1007 --datadir test_node1 --nodiscover --port 30303 --allow-insecure-unlock --http --http.port "8545" --http.addr "0.0.0.0" --http.corsdomain "*" --http.api "eth, net, web3, miner, debug, personal, rpc" console
여기서 주의할 점은 터미널1과 터미널2에서 사용하는 포트가 달라야한다. 그래서 위 명령어는 8545-30303, 아래명령어는 8546-30304을 사용한다. 또 명령어를 실행하는 터미널 위치가 go-ethereum이어야한다 필히 확인 하자!!!
각 터미널이 연결하면 터미널마다 >이 나타나며 터미널 1번에 아래명령어를 입력해 enode:// 를 불러러와서 복사한다.
그런다음 터미널 2번으로 이동하여
admin.addPeer("첫번째 노드의 enode 주소")
위에서 복사한 enode를 변수로 넣어 명령어를 실행한다.
노드가 잘 들어갔다면 admin.peers를 찍어보자.
처음 했을때는 peer카운터가 올라갔다가 내려갔다가 하는 연결이 안되는 증상이 있는데 우분투에서 방화벽을 끈뒤 재부팅을 하고 위에서 사용중인 포트를 정확히 노드1,노드2에 입력하니 해결되었다.
방화벽 끄기
$ sudo ufw enable
3. 연결 테스트
노드1에서 계정 하나를 만든위 채굴을 시작합니다.
personal.newAccount()
# Passphrase 입력
miner.start()
두개의 터미널에 동시에 출력이나온다.
잠시 뒤 채굴을 종료한뒤 블록숫자를 확인합니다.
노드 2번에서도 같은 블록 숫자가 나와야 동기화가 된 것을 확인할 수 있습니다.
'개발 학습 > 블록체인' 카테고리의 다른 글
지속 연결 네트워크를 위한 static.nodes.json (0) | 2022.02.21 |
---|---|
Docker로 노드 운영 (5) : 부트노드 운용 (0) | 2022.02.21 |
Docker로 노드 운영 (3) : Geth로 채굴, 트랜잭션 생성 (0) | 2022.02.19 |
Docker로 노드 운영 (2) : 계정 및 제네시스 블록 생성 (0) | 2022.02.19 |
Docker로 노드 운영 (1) : Docker와 Geth 설치 및 세팅 (0) | 2022.02.19 |
댓글