본문 바로가기
블록체인/이더리움

[이더리움]Geth를 이용해 multi node Private network 구성하기

by dev_mac-_- 2018. 12. 9.

Ethereum Multi node Private network 구성하기

Ethereum을 이용해 dApp을 만들어 배포하기 전에 Ethereum Client의 Private Network를 만들어서 테스트 한 후 배포를 해야 불필요한 비용을 줄일 수 있다. 

해당 Tutorial에서는 3가지의 방법을 설명한다.

  • Multi node를 가지고 있는 block Chain망 구성하기
  • 어떻게 마이닝 노드 구성하는지
  • 어떻게 Multi node들간 BlockChain 통신하는지


Geth 설치방법과 기본적인 동작은 생략한다.


1. Genesis Block 생성하기

/* genesis.json */

{"config": {"chainId": 1004,"homesteadBlock": 0,"eip150Block": 0,"eip155Block": 0,"eip158Block": 0},"difficulty": "0x20000","gasLimit": "0x2fefd8","alloc": {},"coinbase": "0x0000000000000000000000000000000000000000","extraData": "","nonce": "0x0000000000000000","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp": "0x00"}

 (자세한 내용은 Genesis json이 무엇인가 해당 게시물을 참조하면 된다.)


2. 첫 번째 Node 생성

genesis.json파일을 생성했다면 이제 geth를 이용해 genesis block을 생성할 차례이다.

$ geth --datadir test1 init genesis.json

--datadir : 해당 폴더에 Blockchain의 노드정보를 저장한다.

해당 화면이 보인다면 genesis block 생성이 완료된다.

그 다음으로 첫번째 노드의 block chain network로 접속한다.

$ geth --datadir test1 --nodiscover --networkid 1004 console

--nodiscover : peer을 찾는 기능을 사용하지 않는다. 수동으로 추가한다.

--networkid : Ethereum Network의 id값이다. 다른 노드들과 같은 Network를 구성하기 위해 같은 id값으로 설정해주어야 한다.


3. 두 번째 Node 생성

두 번째 노드를 생성하는 과정도 첫 번째 노드생성과 비슷하다.

$ geth --datadir test2 init genesis.json

해당 화면이 보인다면 두 번째 노드 역시 성공이다.


4. 두 노드 연결작업

이제 두 노드간 연결작업을 할 차례이다.

먼저 터미널에 첫 번째 노드에 연결한다.


첫 번째 노드 터미널

$ geth --networkid 1004 --datadir test1 --nodiscover --port 30303 --rpc --rpcport "8545" --rpcaddr "0.0.0.0" --rpccorsdomain "*" --rpcapi "eth, net, web3, miner, debug, personal, rpc" console

--rpc : rpc통신을 사용한다.

--rpcport : rpc 통신을 위한 port를 8545로 설정한다.

--rpcaddr : rpc 통신에 모든 접근을 허용한다.

--rpccorsdomain : CORS 모두 허용 (와일드카드 *)

--rpcapi : rpc 해당 api를 사용 

이제 두 번째 노드에 연결할 차례이다. 새 터미널을 실행시킨다. 


두 번째 노드 터미널

$ geth --networkid 1004 --datadir test2 --nodiscover --port 30304 --rpc --rpcport "8546" --rpcaddr "0.0.0.0" --rpccorsdomain "*" --rpcapi"eth, net, web3, miner, debug, personal, rpc" console

이번에는 첫 번째 노드와는 달리 포트번호를 다르게 설정한다.


첫 번째 노드 터미널

> admin.nodeInfo.enode

"enode://8e55cf8b3a522817a312fd239c6b310a20af27dc031ae2f959a3ea73e2668121bbe505951422593448059e02970d0355e27da2a3969cb03e522261add183fbd6@127.0.0.1:30303?discport=0"

해당 명령어는 첫 번째 노드의 주소값을 얻는것이다. "enode://"와 같은 결과값을 출력한다.


두 번째 노드 터미널

>  admin.addPeer("첫 번째 노드 enode 주소")

true

그 다음 아래 명령어를 이용해 정상적으로 정상적으로 peer가 추가됬는지 확인한다.

> admin.peers

위와 같은 화면이 나온다면 정상적으로 추가가 된 것이다.

똑같은 방법으로 첫번째 노드의 터미널에도 추가 시켜준다.


5. 마이닝 작업

이제 정상적으로 두 노드간 Network가 정상적으로 연결되었다.

테스트에 앞서서 마이닝 작업으로 정상적으로 구성이 됬는지 테스트할 수 있다.

첫 번째 노드의 터미널 혹은 두 번째 노드의 터미널 (아무상관없다)

personal.newAccount("eth")        // 계정 생성

$ miner.start()        // 마이닝 시작

마이닝 명령어를 시작한다. 

두 사진과 같이 첫 번째 노드의 터미널에서 miner.start()를 시작했다고 한다면 두 번째 노드의 터미널에도 마찬가지로 정보가 뜨게된다. 

댓글