[연재] geth로 private network 구성하기 - rpc 서비스

geth로 rpc 서비스 제공


이번 글에서는 geth에서 rpc 서비스를 제공하기 위한 옵션들에 대해 알아보도록 하겠다.

먼저 geth 사이트에서 rpc 관련 옵셩을 살펴보자.

https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

API AND CONSOLE OPTIONS:
  --rpc                  Enable the HTTP-RPC server
  --rpcaddr value        HTTP-RPC server listening interface (default: "localhost")
  --rpcport value        HTTP-RPC server listening port (default: 8545)
  --rpcapi value         API's offered over the HTTP-RPC interface
  --rpccorsdomain value  Comma separated list of domains from which to accept cross origin requests (browser enforced)

--rpc 옵션만 주면 기본적으로 서비스를 제공하는데는 문제가 없다. 다만 제공하는 cors가 있다면 해당 도메인을 적어주면 되고, 모두에게 오픈한다고 하면 *를 주면 된다.

아울러 rpcapi로 어떤 모듈을 제공할 것인가를 미리 고민해야 한다. 여기서는 일단 테스트 위주로 작성하므로 일단 알려진 모듈은 다 넣도록 하자.

기본 rpc 서비스를 제공하기 위해서 보통 다음과 같이 geth를 실행한다.

#!/bin/bash

geth --datadir ./data \
     --networkid 88 \
     --rpc --rpcaddr "127.0.0.1" --rpccorsdomain "*" --rpcapi "admin,db,eth,net,web3,miner,personal" \
     --etherbase "0x99de12f3150b393c89ddccb384dd9cf8fa8414c0" \
     console

결과는 다음과 같다.


콘솔에 나오는 내용 중에서 rpc 관련해서는 다음 라인을 주목해야 한다.

 INFO [04-26|10:47:01] HTTP endpoint opened                     url=http://127.0.0.1:8545                                cors=* vhosts=localhost

rpc 제공하는 HTTP 연결에 관련하여 제공 url은 http://127.0.0.1:8545 이고 cors 는 모두 허용, vhosts는 localhost이다. 여기서 우리가 설정하지도 않은 vhosts 정보가 있는데 이는 아래에서 다루겠다. vhosts 관련 내용은 geth 버전이 1.8로 올라오면서 추가된 것으로 보인다. 이전 1.7 버전에서는 해당 정보가 콘솔에 나오지 않았다.

instance: Geth/v1.8.6-stable-12683fec/linux-amd64/go1.10


서비스가 제대로 올라왔는지 확인하려면 geth로 attach 해보면 된다.

geth attach http://localhost:8545


동일 서버에서는 이렇게 하면 된다. 자 외부에서 붙으려면 어떻게 해야 할까?


geth 외부에서 접속

공용 IP가 있는 서버에서 서비스를 띄우고 외부에서 접속해보자.

서버에 공용 IP가 있다면 rpcaddr에 해당 IP를 입력하면 된다.

#!/bin/bash

geth --datadir ./data \
     --networkid 88 \
     --rpc --rpcaddr "공용 IP" --rpccorsdomain "*" --rpcapi "admin,db,eth,net,web3,miner,personal" \
     --etherbase "0x99de12f3150b393c89ddccb384dd9cf8fa8414c0" \
     console


혹 나와 같이 가난하여 공용 IP를 가지고 있지 못하고, DDNS를 사용하여 포트 포워딩을 한다면 임시로 배정받은 공용 IP를 입력해서 서비스를 띄워 봐야  attach 시 다음과 같은 오류가 나며 연결이 되지 않는다.


이 문제는 DNS Rebind Protetion 관련된 오류로 이를 해결하기 위해서는 명시적으로 붙을 도메인을 다음과 같이 지정해서 서비스를 올려야 한다.


DNS Rebind Protection 회피하기

먼저 rpcaddr에 서비스할 주소를 All(0.0.0.0) 로 주고 외부에서 붙을 도메인에 대해 가상 호스트를 rpcvhosts 옵션에 주면 된다. 호스트가 여러 개일 때는 ','로 분리하여 작성하면 된다.

#!/bin/bash

geth --datadir ./data \
         --networkid 88 \
         --rpc --rpcaddr "0.0.0.0" --rpccorsdomain "*" --rpcapi "admin,db,eth,net,web3,miner,personal" \
         --rpcvhosts=blockchaindev.kr \
         --etherbase "0x99de12f3150b393c89ddccb384dd9cf8fa8414c0" \
         console

 위와 같이 실행하면


콘솔 출력을 보면 위와 다르게 vhosts에 localhost가 아닌  옵션에서 준 도메인 명이 나올 것이다.

만약 이 서버에 연결된 도메인이 여러개이라고 한다면, ','로 줘도 되지만,  --rpcvhosts='*' 로 주어 모든 도메인에 대해 허용해도 된다.

위의 rpc 서비스에 geth로 attach 하면 다음과 같이 잘 붙을 것이다.


오늘은 geth 를 이용한 rpc 서비스와 연결에 대해서 살펴보았다.