don't stop believing

테스트 네트워크 만들어보기 (by admin.addPeer) 본문

Ethereum

테스트 네트워크 만들어보기 (by admin.addPeer)

Tongchun 2018. 9. 28. 00:06

로컬 테스트 넷을 만드는 두 번째 방법인 admin.addPeer() 명령을 사용한 구성입니다.

구성을 위해 4대의 PC를 준비했습니다.


첫 번째는 CentOS에 geth 버전은 1.8.17-unstable 입니다.

두 번째도 CentOS에 geth 버전은 1.8.17-unstable 입니다.

세 번째는 Ubuntu에 geth 버전은 1.8.16-stable 입니다.

네 번째는 MacOS에 geth 버전은 1.8.14-stable 입니다.


4개의 서버 모두 동일한 genesis.json 파일을 가지고 있습니다.

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

각 PC는 독립적으로 존재하며 구분상의 편의를 위해 geth 포트를 지정했습니다.


첫 번째 PC(CentOS)를 초기화 하고 geth를 실행 합니다. 실행 포트는 30331 입니다.


geth --datadir /home/ngle/data_nglenet init /home/ngle/data_nglenet/genesis.json


geth --networkid 12 --datadir /home/ngle/data_nglenet --port 30331 console 2>> /home/ngle/data_nglenet/geth.log


두 번째 PC(CentOS)를 초기화 하고 geth를 실행합니다. 실행 포트는 30332 입니다.


geth --datadir /home/ngle/data_nglenet init /home/ngle/data_nglenet/genesis.json


geth --networkid 12 --datadir /home/ngle/data_nglenet --port 30332 console 2>> /home/ngle/data_nglenet/geth.log


세 번째 PC(Ubuntu)를 초기화 하고 geth를 실행합니다. 실행 포트는 30333 입니다.


geth --datadir /home/ngle/data_nglenet/ init /home/ngle/data_nglenet/genesis.json


geth --networkid 12 --datadir /home/ngle/data_nglenet --port 30333 console 2>> /home/ngle/data_nglenet/geth.log


네 번재 PC(MacOS)를 초기화 하고 geth를 실행 합니다. 실행 포트는 30334 입니다.


geth --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_nglenet init /Users/tongchunkim/Documents/Test_Ethereum/data_nglenet/genesis.json


geth --networkid 12 --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_nglenet --port 30334 console 2>> /Users/tongchunkim/Documents/Test_Ethereum/data_nglenet/geth.log


이제 각 geth에서 admin.nodeInfo.enode 명령으로 enode URL을 확인합니다.


첫 번째 PC(CentOS)의 enode 입니다.


"enode://efac3e59b5ba6fa5c55a076af7e7b4731376e3242fe431b9a90639e17552c3ad126b22ad1f8eb60a566332eeb7f6e071305fc78cf2e8b793c6f7c431072f2daa@[::]:30331"


두 번째 PC(CentOS)의 enode 입니다.


"enode://49fe51815a561b6f2d706a81e2e4045b63a1cc1fe5dfb2da08307324718258f5c2459d3c3fe6bba4399de136db88e015f98b5b88fe316cc2addbd78160a43be8@[::]:30332"


세 번째 PC(Ubuntu)의 enode 입니다.


"enode://b2a60a589c9a79f8fbf16dfa1a7dfe7841b96675d4d9d9ef26d4a74d7e97416d9267cac468955cc9b0c33d314b9a61463c1cf38655df75868bcf9aaed7509b80@[::]:30333"


네 번째 PC(MacOS)의 enode 입니다.


"enode://d3bcccb52db594c4677550f4d30d2bb5eae5c074e6051034261dca61e0eba0e4c44477b81a181a1b4941e5f94a44178844d3df19a53937e1d77145f1502a6ba8@59.13.214.161:30334"


각 node에서 net.peerCount와 admin.peers 명령을 확인합니다. 4대 모두 동일하게 아래와 같습니다.

> net.peerCount
0
> admin.peers
[]

이제 네 번째 node(MacOS)에서 admin.addPeer 명령으로 3개의 node를 추가해 보겠습니다.

> admin.addPeer("enode://efac3e59b5ba6fa5c55a076af7e7b4731376e3242fe431b9a90639e17552c3ad126b22ad1f8eb60a566332eeb7f6e071305fc78cf2e8b793c6f7c431072f2daa@10.10.1.168:30331")
true
> admin.addPeer("enode://49fe51815a561b6f2d706a81e2e4045b63a1cc1fe5dfb2da08307324718258f5c2459d3c3fe6bba4399de136db88e015f98b5b88fe316cc2addbd78160a43be8@10.10.1.167:30332")
true
> admin.addPeer("enode://b2a60a589c9a79f8fbf16dfa1a7dfe7841b96675d4d9d9ef26d4a74d7e97416d9267cac468955cc9b0c33d314b9a61463c1cf38655df75868bcf9aaed7509b80@10.10.1.39:30333")
true

동일하게 추가 했습니다.

이제 다시 net.peerCount와 admin.peers를 확인해 보겠습니다.

테스트 도중 두 번쩨 서버에 방화벽이 실행 중이어서 addPeer로 node 추가가 안되는 경우가 있었습니다.

CentOS 방화벽을 아래와 같이 종료하고 다시 진행 했습니다.


$ systemctl disable firewalld

$ systemctl stop firewalld

$ systemctl status firewalld

> net.peerCount
3
> admin.peers
[{
    caps: ["eth/62", "eth/63"],
    id: "49fe51815a561b6f2d706a81e2e4045b63a1cc1fe5dfb2da08307324718258f5c2459d3c3fe6bba4399de136db88e015f98b5b88fe316cc2addbd78160a43be8",
    name: "Geth/v1.8.17-unstable-e39a9b34/linux-amd64/go1.9.4",
    network: {
      inbound: false,
      localAddress: "10.8.0.26:52122",
      remoteAddress: "10.10.1.167:30332",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 3291904,
        head: "0x16873df6835b9092550c0642acd183e9dbe6ae4f1ba1e2425a66ab6b42e9578d",
        version: 63
      }
    }
}, {
    caps: ["eth/63"],
    id: "b2a60a589c9a79f8fbf16dfa1a7dfe7841b96675d4d9d9ef26d4a74d7e97416d9267cac468955cc9b0c33d314b9a61463c1cf38655df75868bcf9aaed7509b80",
    name: "Geth/v1.8.16-stable-477eb093/linux-amd64/go1.10",
    network: {
      inbound: false,
      localAddress: "10.8.0.26:50945",
      remoteAddress: "10.10.1.39:30333",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
        version: 63
      }
    }
}, {
    caps: ["eth/62", "eth/63"],
    id: "efac3e59b5ba6fa5c55a076af7e7b4731376e3242fe431b9a90639e17552c3ad126b22ad1f8eb60a566332eeb7f6e071305fc78cf2e8b793c6f7c431072f2daa",
    name: "Geth/v1.8.17-unstable-d3441ebb/linux-amd64/go1.9.4",
    network: {
      inbound: false,
      localAddress: "10.8.0.26:52105",
      remoteAddress: "10.10.1.168:30331",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 3291904,
        head: "0x16873df6835b9092550c0642acd183e9dbe6ae4f1ba1e2425a66ab6b42e9578d",
        version: 63
      }
    }
}]
> 

다른 node에서 net.peerCount를 확인하면 1개만 나오게 됩니다. admin.peers로 확인하면 addPeer()로 연결된 네 번째 node만 보입니다.

> net.peerCount
1
> admin.peers
[{
    caps: ["eth/62", "eth/63"],
    id: "d3bcccb52db594c4677550f4d30d2bb5eae5c074e6051034261dca61e0eba0e4c44477b81a181a1b4941e5f94a44178844d3df19a53937e1d77145f1502a6ba8",
    name: "Geth/v1.8.14-stable/darwin-amd64/go1.10.3",
    network: {
      inbound: true,
      localAddress: "10.10.1.39:30333",
      remoteAddress: "10.10.0.242:50945",
      static: false,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 3291904,
        head: "0x16873df6835b9092550c0642acd183e9dbe6ae4f1ba1e2425a66ab6b42e9578d",
        version: 63
      }
    }
}]
>

네 번째 node가 나머지 3개의 node를 연결해 주고 있습니다.


이제 첫 번째 node에서 mining을 해보겠습니다. 그럼 네 번째 node가 자기 자신을 포함한 나머지 두 node에게 broadcasting을 하는지 확인하겠습니다.

첫 번째 node에서 마이닝을 시작 합니다. 그리고 잠시 후 blockNumber를 확인합니다.

> miner.start(1)
null
> eth.blockNumber
77

현재까지 77개의 block이 생성되었습니다.


다른 node에서도 blockNumber를 확인해 봅니다.

> eth.blockNumber
77

조금의 시간차이는 있지만 모두 77개로 확인되고 있습니다.


네 번째 node가 block을 broadcasting하고 있네요.

여기까지 addPeer() 명령을 이용한 네트워크 구성이었습니다.


하지만.... admin.addPeer() 명령은 불편한 점이 있습니다. geth를 종료하면 추가했던 node들은 사라지고 연결을 하려면 다시 addPeer() 명령을 다시 해줘야 합니다. geth가 실행되면 자동으로 node를 연결하려면 static-nodes.json를 작성해 적용해야 합니다.

다음은 static-nodes.json을 만들어 적용해 보겠습니다.


Comments