[패캠강의] 2주차 - 멀티 Geth 실습

이제 Geth 를 한대 설치하고 트랜잭션도 처리해 보았으니 Geth를 두 대를 띄어 서로 연결한 후 실제 퍼블릭 블록체인의 P2P 네트워크를 간소하게나마 이해해 보도록 하겠습니다.

우선 Geth 한대는 실습을 해봤습니다. 두 번째 노드를 위해 아래와 같이 test_data2라는 폴더를 만들고 genesis.json 을 노드 1과 똑같이 설정해 주어야 합니다.

$ mkdir ~/ethereum/test_data2

test_data 폴더 안에 노드1과 똑같은 genesis.json을 복사하세요.

$ cp test_data/genesis.json test_data2

노드 2의 제네시스 블록을 생성해 봅니다.

$ geth --datadir test_data2 init test_data2/genesis.json
노드2의 제네시스 블록 성공 메시지

위의 성공 메시지가 나오게 된다면 제네시스 블록이 생성 된 것이고 노드1과 노드2를 차례차례 실행해보도록하겠다. 조건 3가지가 일단 옵션으로 다른 설정을 줘야하는데…

  1. — datadir 옵션에서 폴더의 위치를 각각 test_data, test_data2 설정해야함
  2. — port 옵션에서 Default IPC Port를 Node1:30303, Node2:30304 로 설정함
  3. — rpcport 옵션에서 Default RPC Port Node1:8545, Node2:8545 로 설정함

같은 서버안에서 노드를 연결하는 것이기 때문에 서비스 포트 번호를 달리 해야하는 것에 주의한다.

따라서 노드 1의 옵션과 노드2의 옵션은 다음과 같이 달리 줄 수 있다/

Node1 Geth 실행

$ nohup geth --networkid 8484 --datadir test_data --port 30303 --rpc --rpcport 8545 --rpcaddr 0.0.0.0 --rpccorsdomain "*" --rpcapi "admin,net,miner,eth,personal,rpc,web3" 2>> test_data/geth.log &

Node2 Geth 실행

$ nohup geth --networkid 8484 --datadir test_data2 --port 30304 --rpc --rpcport 8546 --rpcaddr 0.0.0.0 --rpccorsdomain "*" --rpcapi "admin,net,miner,eth,personal,rpc,web3" 2>> test_data2/geth.log &

독립적으로 Geth의 두 대가 올라갔다. 이제 Node1 콘솔모드에 접근해보자

$ geth attach http://localhost:8545

admin 모듈에서 현재 노드의 정보를 알수가 있는데 이 enode 정보를 복사하도록 하자

Node1의 enode 정보는 아래와 같다. 클립보드에 복사해두자. (주의 : 아래껄 복사하면 안된다. 본인의 PC에서 띄운 Geth의 enode 정보를 복사해야한다. 각 노드마다 값이 다르니 주의하자)

enode://f72e33239cb4a5e7b648fbbb3df078d298ee358a9b24a5eefe56561d8d84e0159119adefa7a4cf24d00d84f9dbbb6a56d645804509d8b553032cfedf64d59c46@127.0.0.1:8545

복사후 본인 서버의 주소로 위의 보드체처럼 수정한다

먼저, Node1에 연결된 피어가 존재하는지를 확인해보자

> admin.peers

빈 배열값이 출력된다. 연결된 피어가 없다는 뜻이다.net.peerCount 를 통해서도 몇개가 연결이 되었는지도 확인가능하다.

이제 geth console을 exit로 빠져나간 후 노드 2번에 콘솔모드로 전환한다.

$ geth attach http://localhost:8546

그리고 복사한 노드1의 enode 값을 아래와 같이 addPeer 함수의 인자로 넣어주자.

$ admin.addPeer('enode://f72e33239cb4a5e7b648fbbb3df078d298ee358a9b24a5eefe56561d8d84e0159119adefa7a4cf24d00d84f9dbbb6a56d645804509d8b553032cfedf64d59c46@10.0.2.15:30303')

그리고 잠시 후에 admin.peers 명령어를 실행하면

다음과 같이 배열 첫번째 Object에 remoteAddress 로 또다른 Geth 가 localhost 30304포트로 연결된 것을 볼 수 있다.

( Q. 그렇다면 2번째 Object로 연결된 피어는 무엇일까? )

이제 block이 syncing이 되었는지 노드 2번에서 확인해보자.

일단 실제로 한번에 연결되진 않았다. 어떠한 사유때문인지는 모르겠으나 Block을 가져와서 Syncing할 때 문제가 있어서 다시 chaindata를 지웠다가 다시 해보니 연결이 되었다.

이 상태에서 실습 트랜잭션에서 다뤘던 내용을 반복해서 한쪽에서 스마트 컨트랙트를 디플로이해보고 다른 한쪽에서 확인해보는 과정들을 실습해보고 Ether 송금도 Node1의 계정에서 Node2의 계정으로 송금도 해보는 실습을 해보았으면 좋겠다.

  • 저는 블록체인 개발사 (주)34일에서 블록체인 엔지니어로 일하고 있습니다.
  • 880만 팔로워 전세계 1위 한류 미디어 케이스타라이브(KStarLive)와 함께 만든 한류 플랫폼에서 사용되는 케이스타코인(KStarCoin) 프로젝트를 진행 중입니다. 팬 커뮤니티 활동을 하면서 코인을 얻을 수 있으며, 한류 콘텐츠 구매, 공연 예매, 한국 관광 상품 구매, 기부 및 팬클럽 활동 등에 사용 될 계획입니다.