이더리움 노드 구성 및 실행 방법
이더리움 블록체인은 수많은 노드들로 구성되어있다. 이 글에서는 내 PC에서 그 노드 중 하나를 구성하는 방법을 설명하고, 계정생성, 채굴 같은 해당 노드의 인스턴스를 컨트롤 할 수 있는 클라이언트의 구성방식을 설명하고자 한다.
1.먼저 구글에 geth download 검색을 통해 geth를 설치하자. geth는 이더리움재단에서 제공하는 클라이언트 이자, 노드실행을 위한 명령 CLI(명령도구) 라고 보면 된다. 설치된 geth경로를 환경변수에서 잡아주고, cmd창을 켜 geth라고 쳐보자. geth를 실행시킴과 동시에 노드가 생성되고, 블록동기화가 시작된다. 이더리움의 수많은 노드들이 공유하고 있는 블록데이터들을 내려받기 시작하는 것이다. geth 실행과 동시에 내 PC에 이더리움 노드가 만들어진 것이다.(모든 데이터를 내려받는 full노드는 왠만한 PC 스펙으로는 받을 수 없을테니, geth --syncmode "light" 이 명령어를 통해 lighsyn로 변경해 놓으면 금방 sync될것이다.)
2.노드가 생성되었고, 이 노드가 이더리움 네트워크 중 일부라고 한다면, 이 노드와 통신할 수 있는 방법이 필요하다. 즉, 노드가 서버라 하면 노드를 컨트롤하는 프로토콜이 필요하다. geth는 javascript json RPC라는 프로토콜을 통해 노드인스턴스를 조작할 수 있는 방법을 제공한다. RPC 프로토콜을 이용하는 방법은 2가지가 있다. 첫째는 default로 제공하는 IPC 파이프라인을 통하는 것이다. 두번째는 HTTP 통신을 통해 가능하다.
1)geth를 최초 실행시, cmd창의 로그 중 IPC endpoint opened라고 나온 부분 오른쪽에 ipc파일의 경로가 나온다. geth노드 실행함과 동시에 ipc라는 파일을 로컬 특정경로에 생성을 하는데, 이 파일을 통해서 geth노드와 양방향 통신이 가능하도록 한다. 이 경로의 파일을 통해 ipc파이프라인에 붙을 수가 있고, 앞서 말한 RPC프로토콜을 이용할수 있다. (앞서 geth cmd창 이외에 다른 cmd창을 켜서 뒤의 명령어 실행 geth attach ipc://./pipe/geth.ipc ). 이 파이프라인에 붙은 이후에 사용할 수 있는 여러가지 명령어는 밑에 참고사항에 정리해두겠다.
2)IPC파이프라인을 통해서가 아닌, HTTP 통신을 통해 geth노드인스턴스에 붙어 노드인스턴스와 통신하는 방법도 있다. 방법을 간단히 말하자면, 로컬환경에 http server 하나를 띄우고, 해당 서버에서 web3.js라는 자바스크립트 라이브러리를 통해 RPC 프로토콜을 이용하는 것이다. 방법은 아래와 같다.
-cmd창에서 npm install web3 명령어를 통해 web3 라이브러리를 다운받는다.(node.js, npm패키지가 설치된경우)
-다운받아진 폴더에서 npm install -g http-server 명령어를 통해 http-server를 설치.
-cmd창에 http-server 를 치면 http서버가 기동.
-cmd창을 하나 새로 열어 geth --http --http.api "db, eth, web3" 를 실행하면 http api를 사용한다는 옵션과 함께 geth가 다시 기동된다.
>> 정리하자면, http서버를 하나 띄운뒤에 geth노드에 http옵션을 주고 노드를 실행하면 http서버를 통해 geth노드와 통신이 가능하게 되고, http서버에는 web3라이브러리를 활용하여 컨텐츠를 만들어 이더리움 네트워크와 필요한 통신을 진행하게 된다.
<참고>
1.ipc파이프라인 명령어
-geth attach ipc://./pipe/geth.ipc : geth노드에 ipc파이프라인연결
-admin.nodeInfo : 실행된 geth노드의 정보 >> chainId가 2이면 메인네트워크
-admin.datadir : sync된 블록의 data가 저장되는 로컬폴더위치
-personal.newAccount(); : 계정생성
-personal.listAccounts : 생성된 계정목록보기 ( eth.accounts : 계정목록보기)
-miner.setEtherbase(eth.accounts[0]); >> 생성된 목록중 첫번째 account를 coinbase에 등록(채굴시 보상으로 주어지는 이더를 저장할 account지정)
-miner.start(1); >> 스레드 1개로 채굴시작
-web3.eth.getBalance(eth.accounts[0]); >> 채굴후 해당 계정에 수익금확인
2.프라이빗 블록체인 구축 명령어
:Real 네트워크인 Mainnet이 아니라, 로컬 환경을 구성하여 여러가지 테스트를 진행해보고 싶은 경우 아래의 명령어를 따라 실행하면, 프라이빗 블록체인이 구성된다.
-genesis 블록을 만들기 위한 genesis.json 파일생성 (구글링에 genesis.json 파일이라 검색하여 최신의 파일 하나 다운로드)
-geth init .\genesis.json --datadir private_chaindata : genesis.json 파일을 이용해 private_chaindata 이라는 이름의 폴더를 만드는 명령어.
-geth --datadir .\private_chaindata\ : 생성한 프라이빗 블록체인 폴더를 root로 하여 geth노드 기동
-geth --datadir .\private_chaindata\ --nodiscover : 다른노드와 sync없이 구동 (보통의 genesis.json파일에는 메인넷(ChainId=1)과는 상관없는, chainId 15로 되어있고 체인ID가 15인 노드들끼리 sync가 되는 것이 default이다. 그런데 위의 nodiscover 옵션을 주면 체인ID 15인 노드들과도 통신하지 않는다는 설정이 된다.)