포스팅 주제
- 하나의 노드가 아닌 여러 개의 노드를 동작시켜 프라이빗 블록체인을 구성하는 방법을 설명한다.
- 하나의 노드만으로 프라이빗 블록체인을 구성하고 싶다면 전에 있던 게시물을 참조하도록 한다.
> 나만의 프라이빗 블록체인 구축하기: Ethereum01-01
준비물:
- 윈도우 및 우분투가 설치되어 있는 컴퓨터 혹은 VirtualMachine
절차 설명:
<1>
이전 게시물 Ethereum01-01을 참조하여 메인 노드역할을 하는 컴퓨터에 geth를 실행할 수 있는 환경을 조성한다. 필자의 경우 MAC 데스크톱에 실행환경을 조성했다. 단, 전 게시물을 참고할 때 댓글란을 꼭 보도록 하자. 잘못된 내용에 대해 수정한 사안이 있기 때문이다.
이때 중요한 건, genesis.json 파일이다. genesis.json 파일 안에 있는 정보 중, "chainId": 52687550 필드값이 가장 중요했다. chainId 로 분기되어 있는 이더리움의 수많은 체인 중 자신의 체인을 유일하게 식별할 수 있는 값이기 때문이다.
> 만약 유일한 값을 할당하기 어렵다면, 기존에 존재하는 체인 아이디 (0, 1, 2, ...)를 할당하고 geth를 실행할 때 --nodiscover옵션을 주면 된다. 이 옵션을 할당하면, 기존에 존재했던 체인들과 체인 아이디가 같아도 별도의 체인으로 구축할 수 있다. 프라이빗일 경우에만 해당이 된다.
메인 노드의 geth를 실행시켰다면, console 명령으로 admin.nodeInfo.enode 명령어로 enode 값을 확인하도록 한다.
> 참고로 명령어를 입력할 때, tab 기능을 활용한다면 일일이 타이핑을 하지 않아도 된다.
[IMAGE: https://cdn.steemitimages.com/DQmeXAynGoHShoWQMpMnY7X3EisibRaapP2HcfvKTrCqVne/image.png]
결과로 출력되는 enode의 값을 따로 클립보드 혹은 메모장에 복사해둔 후에 다음 절차를 진행하도록 하자.
<2>
이제는 메인 노드의 역할을 하는 컴퓨터와 동일한 환경으로 여러 대의 컴퓨터를 준비할 차례다. 본 포스팅에서는 편의상 Ubuntu 16.04 LTS 운영체제를 설치한 가상머신만을 이용해서 메인 노드와 연결 해보도록 하겠다. 아래 내용은 geth를 이미 설치했다는 가정 하에 진행된다.
먼저 홈 디렉토리에 genesis.json 파일을 위치시켜준다. 물론, genesis.json 파일은 메인 노드를 초기화할 때 사용했던 파일과 정확히 일치해야 한다.
홈 디렉토리에 임의의 폴더를 생성한다. 필자의 경우 waca-private 라는 폴더를 생성했다. 이 디렉토리에는 앞으로 실행할 블록체인에 대한 정보들이 기록이 될 것이다. geth를 실행하기 전 환경 구축을 먼저 하는 과정이라고 생각하면 된다.
[IMAGE: https://cdn.steemitimages.com/DQmfFdejaQpqDobt1r9aJgmHJHt2yUwUwERYbnVy1YoK27f/image.png]
자, 이제 명령어를 입력하도록 하자.
geth --datadir waca-private init genesis.json 명령으로 해당 디렉토리를 초기화 시켜준다.
[IMAGE: https://cdn.steemitimages.com/DQmYXdBEd5zH1ztnzVeiaYYfAS54s3xquPCb6bYur1H7Znq/image.png]
이렇게 해당 디렉토리를 초기화 해준 후에, geth --datadir waca-private --networkid 52687550 console 명령어로 geth를 실행시켜 준다. --networkid 52687550 파트는 정확하게 genesis.json 파일 안의 chainId: 52687550 필드 값과 일치해야 한다.
[IMAGE: https://cdn.steemitimages.com/DQmZGmoCB8HW9qfjA3XwozBaEmXGzYJaBF4SZJAm9guL5Dd/image.png]
<1>번 과정에서 메인 노드의 geth console에서 우리는 메인 노드의 enode 값을 따로 저장해뒀다. 지금부터, 메인 노드와 연결을 시도해보도록 하자.
admin.addPeer("enode://d5d94092e79de457b540fcfd5f309ed877cdc6b9ee1e51c2ca32d0de684ecc29a35cc250a3be6db7e94bf238c9a35563013126db70b7a34494645e0ecbc97823@182.172.130.70:30303" 과 같이 명령어를 입력하도록 하자. 여기서의 enode 값은 실습할 때마다 바뀔 것이다.
이렇게 연결을 시도하면, 두 대의 서로다른 머신이 동기화를 시도할 것이다.
[IMAGE: https://cdn.steemitimages.com/DQmNwBCohwNs7uH9QRLAkxu8xiZtxoMDo16QXENkjnyNrFb/image.png]
만약 제대로 동기화가 이루어지지 않거나 아무 로그도 출력되지 않는다면 반대로 연결을 시도해본다. 즉, 메인 노드에서 다른 노드의 enode 정보를 알아낸 후 추가하는 방법을 사용하도록 해보자. 아래의 사진은, MAC에서 우분투 머신에서 동작 중인 enode 정보를 알아낸 후에 연결을 시도한 화면이다.
[IMAGE: https://cdn.steemitimages.com/DQmf1EW4qZzFG6tgAFQFiDYwB3kHu9yfSg7YL2g67KGpeX6/image.png]
위와 같이 연결을 시도한 후에, admin.peers 명령어를 실행하면 위의 사진의 출력과 같이 연결된 머신에 대한 정보를 출력해줄 것이다. 성공적으로 연결이 된 것이다.
곧 있으면 체인 싱크가 일어날 것이다. ChainId가 겹치지 않는다면 싱크가 성공적으로 될 것이다. 만약 제대로 되지 않는다면, --nodiscover 옵션을 추가하여 geth를 실행하거나 더 유니크한 체인 아이디를 할당해준 후에 다시 실습해보도록 하자.