이더리움이란?
이더리움은 2015년 출시된 차세대 스마트 계약 분산 응용 프로그램 기술로 Ethereum Foundation에서 개발이 진행되고 있는 오픈 소스 프로젝트입니다.
이더리움 클라이언트는 C++, Go, 파이썬 등 많은 언어로 구현돼 있지만 Go 언어판이 가장 활발하게 개발되고 있습니다.
이더리움 가이드인 Ethereum Homestead Documentation에도 다양한 Ethereum Clients를 소개하고 있는데, 여기서도 go-ethereum과 Parity가 가장 활발하게 개발중인 것으로 설명하고 있습니다.
- Ethereum Client
Ethereum 설치
책에서는 우분투 환경에서 이더리움 설치를 설명하고 있으나, 저는 Macbook을 사용 중이므로 Mac OS 환경에서 설치해 보도록 하겠습니다.
Homebrew로 설치하기
Mac에서는 Homebrew를 통해 편리하게 패키지들을 설치할 수 있습니다.
먼저, ethereum 패키지를 저장할 새로운 저장소를 생성합니다.
brew tap ethereum/ethereum
저는
ethereum/ethereum
저장소가 이미 있기 때문에 brew만 최신 버전으로 업데이트됐습니다. 저장소가 존재하면 아래와 같이 아무런 메세지도 표시되지 않습니다.
ethereum 패키지를 다운받습니다.
brew install ethereum
저는 예전에 설치를 했기 때문에 최신 버전으로 업데이트(
brew upgrade ethereum
)를 했습니다.
--devl
옵션을 주면 develop 브랜치를 설치할 수 있습니다.
brew install ethereum --devl
잘 설치됐는지 확인해 봅니다.
geth version
Source로 빌드하기
먼저 geth 소스 코드를 다운로드 받습니다.
git clone https://github.com/ethereum/go-ethereum
참고로, 저의 이더리움 workplace는
/Users/blackbean/ws.blockchain/ws.ethereum
이곳입니다. 아래 보시면 다운받은 go-ethereum 디렉토리도 보입니다.
geth 빌드를 위해서는 추가로 아래 라이브러리가 필요합니다.
brew install gmp go
gmp와 go도 예전에 설치했기 때문에 추가로 최신 버전으로 업데이트를 했습니다.
이제, geth를 빌드하면 됩니다.
cd go-ethereum
make geth
(...생략...)
Homebrew에서와 동일하게 잘 설치가 됐는지 버전을 확인해 봅니다.
이것으로 2가지 방법으로 geth 설치가 끝났습니다~^^;;
아래에 geth 설치 관련해서 참고할 만한 자료를 링크해 두겠습니다. 시간 나실때 한 번씩 살펴 보시기 바랍니다.
- Mac installation options 또는
- Installation Instructions for Mac
- 다른 플랫폼에서는 Building Ethereum Installation 참고
- homebrew-ethereum
- Homebrew 설치
테스트 네트워크 구축
이제 geth를 실제로 구동시켜 볼 차례입니다.
이더리움을 로컬 환경에서 돌려볼 수 있는 테스트용 블록체인을 기동 시킵니다.
geth --networkid "123" --datadir "eth_testdata" --testnet console
책에서는
--olympic
옵션이 주었는데, 현재 지원하지 않는 옵션이므로--testnet
옵션으로 변경했습니다.
콘솔 모드에서 기동한 경우 프로프트(>
)가 표시되므로, 이후 명령은 geth의 콘솔에서 입력합니다.
계좌 생성
Ether(ETH)를 송금하거나 계약을 실행할 수 있는데, 생성한 계좌는 geth 내부에 보관되기 때문에 다른 노드에서는 사용할 수 없습니다.
계좌 생성
personal.newAccount("testuser1")
결과에 표시된 문자열이 만들어진 계좌의 주소이며 송금 시에는 이 주소를 지정해야 합니다.
다음으로 송금받기 위한 다른 계좌를 추가로 생성합니다.
다른 계좌 생성
personal.newAccount("testuser2")
계좌 확인
eth.accounts
생성한 계좌를 지정할 경우
eth.accounts[0]
,eth.accounts[1]
이라고 입력합니다.
앞에서 생성한 2개의 계좌 주소가 표시되었습니다.
잔고 확인
생성한 계좌의 잔고를 확인합니다. 새로 만든 계좌는 보유 Ether가 0으로 표시됩니다.
지정 계좌의 잔고 확인
eth.getBalance(eth.accounts[0])
블록 수 확인
이번엔 블록체인의 블록 수를 확인해봅니다. 이더리움에서 블록은 채굴을 통해 생성되므로 처음 기동한 직후에는 0입니다.
eth.blockNumber
송금
앞에서 생성한 두 계좌를 사용해 실제 송금을 해봅니다.
그런데 현재 Ether는 0이므로 채굴을 통해 Ether를 획득해야 합니다.
miner.start()
처음 채굴을 시작하면 초기화 처리 때문에 시간이 좀 걸립니다. 다행히 테스트 네트워크이기 때문에 실제 이더리움 메인 네트워크 보다 빠르게 채굴이 됩니다.
블록이 생성되는게 보이시죠?! 이더리움은 트랜잭션이 없어도 수십 초 간격으로 블록을 생성하고 그 보상으로 Ether를 받을 수 있습니다.
채굴을 정지하고 위에서 확인했던 계좌의 잔고를 확인해 봅니다.
miner.stop()
음... 채굴을 정지했는데도 멈추지 않네요.
일단, exit
명령으로 구동을 멈추고 다시 진입해서 잔고를 확인합니다.
다시 잔고 확인
eth.getBalance(eth.accounts[0])
보이시나요?! 250 Ether가 생겼습니다. 이게 진짜 ETH였으면 좋겠네요~^^! (잔고는 Wei로 표시되기 때문에 1/10^18로 계산한 결과가 Ether입니다.)
Ether도 생겼으니, 실제 송금을 진행해 봅니다.
eth.sendTransaction({from: '0x938b987ebb7652556f3e014549e48a29183abea9', to: '0x054985548923a7cf5fcab94ebbffbdf31a7d1a19', value: web3.toWei(1, "ether")})
~이게 뭐지?!~하고 살짝 당황했지만, 구글링을 통해
unlockAccount
찾았습니다.
다시 송금 트랜잭션을 실행하면 아래와 같이 정상적으로 처리되는 것을 확인할 수 있습니다.
결과로 표시되는 것은 트랜잭션 식별번호(txid)입니다. 비트코인과 마찬가지로 트랜잭션을 발행한 것만으로는 확인할 수 없습니다.
미확정 트랜잭션을 확인해 봅니다.
eth.pendingTransactions
앞에서 발행한 트랜잭션을 확인할 수 있습니다.
이제 채굴을 통해 블록을 만들고 미확정 트랜잭션을 확정시켜봅니다.
다시 eth.pendingTransactions
을 실행해보면 미확정 트랜잭션이 사라진(null) 것을 확인할 수 있습니다.
송금 확인
채굴을 수행해 송금이 확정된 것을 확인해보겠습니다.
지정 계좌의 잔고 확인
eth.getBalance(eth.accounts[1])
받은 계과의 잔고가 1 Ether로 늘어난 것을 확인할 수 있습니다.
geth 정지
채굴중이면 채굴을 정지 시키고
miner.stop()
geth를 정지 시킵니다.
exit
지금까지 go-ethereum를 설치하고 테스트넷 위에서 계정 생성부터 채굴 및 송금까지 진행해 봤습니다. 진행에는 크게 어려움이 없었으나 15년 넘게 개발을 하고 있는 저도 command line interface는 불편하고 손이 많이 가는 작업입니다.
아무래도 프로그램 경험이 없으신 분들은 다소 어려움을 느낄 수도 있었으리라 생각합니다. 다음편에서는 이번처럼 콘솔창만 가지고 진행하는 것이 아니라, 간단한 Smart contract를 만들어 보고 dApp을 통해서 계약을 실행해 볼 수 있는 내용을 다뤄볼까 합니다.
Truffle 같은 개발 프레임웍을 이용한다면, 직접 테스트 네트워크를 구동하지 않아도 빠르게 이더리움 네트워크 환경에서 원하는 작업을 할 수 있습니다. Truffle를 이용한 개발 내용도 짬을 내서 올려 보겠습니다.