Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

go-ethereum

왠지 이더리움은 go언어를 제대로 지원하고 있다. Go Ethereum은 이더리움 프로토콜의 공식 go언어 구현체다.

설치

설치 환경은 다음과 같다.
  • go1.8.1
  • 우분투리눅스 17.04
리눅스에서 설치는 간단하다.
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
설치 후 사용 할 수 있는 개발툴들이다.
  • geth : 이더리움 CLI 클라이언트 프로그램. 이 프로그램을 이용해서 이더리움의 주요 네트워크(main-, test-, private-네트워크)에 접속 할 수 있다.
  • abigen : 이더리움의 contract 정의를 (사용하고 이해하기 쉬운) Go 패키지로 변환하는 소스코드 생성기다. 이더리움 contract ABIs에서도 작동을 하지만 그냥 Solidity 코드를 사용하는 추세다.
  • bootnode : 가벼운 부트스트랩 노드로 사설 네트워크에서 피어를 찾는데 사용한다.
  • evm : EVM(Ethereum Virtual Machine)의 개발자 유틸리티다. 코드의 실행 및 디버깅을 할 수 있다.
  • swarm : 스웜네트워크에 진입 할 수 있다.
  • puppeth : 이더리움 네트워크를 만들기 위한 CLI 툴

geth

이더리움 네트워크에 진입하기 위한 핵심 애플리케이션이다. JSON-RPC 서버와 대화형 콘솔(interactive console) 인터페이스를 사용 할 수 있다. geth console 명령을 이용해서 콘솔모드로 진입한다. geth가 시작되면 ">" 프롬프트가 뜬다. 프롬프트에서 exit를 입력하고 엔터키를 누르면 콘솔을 빠져나갈 수 있다.
$ geth console
그런데, 이렇게 실행을 하면 온갖 에러 메시지(디버깅 메시지에 가깝다) 때문에 작업이 불가능 하다. 표준에러를 따로 파일로 보내버리자.
$ geth console 2>> get.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.6.7-stable-ab5646c5/linux-amd64/go1.8.1
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> 
tail 명령으로 geth의 메시지들을 확인 할 수 있다.
$ tail -f get.log
....
INFO [08-18|00:08:43] Imported new state entries   count=384  flushed=433 elapsed=61.973ms  processed=202310 pending=14244 retry=0    duplicate=0 unexpected=0
INFO [08-18|00:08:43] Imported new block receipts  count=2048 elapsed=940.576ms number=3137657 hash=a4ba97…e7a0db ignored=0
....
geth는 데이터를 저장하기 위한 데이터 디렉토리를 만든다. 리눅스의 경우 ~/.ethereum 디렉토리에 데이터를 저장한다. 어카운트(account) 정보는 keystore 디렉토리 밑에 저장된다. 디렉토리의 구성을 보자.
.
├── geth
│   ├── chaindata
│   ├── ethash
│   └── nodes
└── keystore

chaindata : 블럭체인 데이터가 쌓인다. 만약 아무 옵션 없이 콘솔모드에 진입했다면 모든 블럭체인 데이터를 저장하려 할 것이다. (2017년 8월 현재) 100G 이상의 데이터가 쌓인다고 한다. --fast명령으로 크게 줄일 수 있다.

ethash : Ethash 는 DAG(Dagger Hashimoto)라고 하는 노력증명(PoW)시스템에서 사용한다. 약 1GB 정도의 데이터가 필요하다.

keystore : 어카운트 정보는 keystore디렉토리에 저장된다.

네트워크 연결

geth 콘솔을 실행하면 네트워크에 연결이 된다. 몇 가지 명령들을 이용해서 네트워크 상태를 검사할 수 있다.
> net.listening
true
> net.peerCount
20
> 
P2P 네트워크에 연결됐으며, 20개의 peer node를 확인했다. admin 어브젝트가 제공하는 peers() 함수를 이용하면, 각 피어에 대한 상세 정보를 얻을 수 있다.
> admin.peers
[{
    caps: ["eth/62", "eth/63", "par/1", "par/2"],
    id: "1c2667c69e95fe28c05cd781f30890fe844f45d21925f1288fb4f2c426cbee3f8349309dd6656e4d68e2e9ee9023ef407ad0673df24ab1442432b5a3a03e8ded",
    name: "Parity/v1.6.8-beta-c396229-20170608/x86_64-linux-gnu/rustc1.17.0",
    network: {
      localAddress: "192.168.35.215:30303",
      remoteAddress: "40.71.26.108:53642"
    },
    protocols: {
      eth: {
        difficulty: 710532293327912000000,
        head: "0x12a57d58b878e5a44469c11e8d46659a07f6375e703d6b83682a1fddc784c6da",
        version: 63
      }
    }
}, {
    caps: ["eth/62", "eth/63", "par/1", "par/2"],
    id: "1f1c1bf6a600f72296043d87f7211053cd4e0fab9add232c5ad02917bdf4991588010ccf75c0792c8477663b6e5e235089272a03926febd63acd8962b47b1ab4",
    name: "Parity/v1.6.6-beta-8c6e3f3-20170411/x86_64-linux-gnu/rustc1.16.0",
    network: {
      localAddress: "192.168.35.215:30303",
      remoteAddress: "103.73.206.19:27254"
    },
    protocols: {
      eth: {
        difficulty: 710553530446838400000,
        head: "0x8234c7f6c3f6082ccfed7e5b7717280aa3ce71637e18452509df18a72623d15e",
        version: 63
      }
    }
}, {