이더리움 스마트 계약(1) — 개발환경구성

철학자(philosopher)
6 min readNov 24, 2016

--

개발 환경은 아마존 EC2인스턴스(Ubuntu Server 16.04 LTS)를 기초로 한다. 아마존 웹 서비스의 기초적인 사용법은 아래 배경지식의생활코딩 강좌 링크 참조.

일단 AWS인스턴스에 접속 한 후에 geth설치를 시작하자.

배경지식

geth(go-ethereum) 설치

install_geth.sh는 go-ethereum 클라이언트의 소스를 받아와 빌드한다.

  • 라인2 : 우분투 패키지업데이트 && 업그레이드
  • 라인3 : 깃헙에 go-ethereum소스를 현재 디렉토리로 클론. go-ethereum이라는 디렉토리가 생성
  • 라인4 : 코드 빌드에 필요한 go언어 및 빌드 패키지를 설치
  • 라인5~6 : 소스를 빌드

geth 노드 실행

아래의 쉘을 실행하면 geth가 실행된다.

  • 라인3 : 빌드 된 geth의 실행파일 경로
  • 라인4 : 데이터 디렉토리 경로; 향후에 개인키, 블록데이터 등이 담긴다. 꼭 이 위치가 아니어도 된다
  • 라인6~7 : 개발모드로 geth노드 실행하기. 여러가지 실행옵션이 있는데 각각의 내용은 다음과 같다.
  1. datadir : 데이터 렉토리 경로를 지정. 개인키와 블록데이터를 저장할 곳을 지정한다.
  2. dev : 개발옵션. 이 옵션을 지정할 경우 메인 네트워크가 아닌 독립적인 제네시스 블록을 생성하고, 채굴도 매우 빠르게 이뤄진다.
  3. rpc : 현재의 노드에 rpc 접속을 허용한다.
  4. rpcapi : rpc접속 후에 사용 가능한 geth의 api를 지정한다. 위 쉘에서는 “eth, web3, personal”를 허용하고 있다.
  5. rpccorsdomain : rpc접속시, corsdomain 문제를 해결한다. 개발 환경이기에 *로 지정했지만, 서비스 환경에는 머신의 실제 ip를 적어주는 것이 안전하다. 이 옵션을 주면 외부에서 해당 노드로 rpc접속 가능하다.

자세한 옵션 정보는 geth command line option 페이지 참조

geth콘솔 사용하기

앞서 실행된 geth 노드 자체만으로는 아무 것도 할 수 없고, 노드에 명령을 줄 수 있는 콘솔이 필요하다. 여러가지 방법이 있지만, 개인적으로 선호하는 방법은 SSH 접속을 하나 더 해서 터미널 세션을 한개 더 만든 후, 새로운 세션에서 기존 geth노드에 attach시키는 것이다.

새로운 세션 생성 후 아래의 스크립트를 실행하면 기존 노드에 attach된 콘솔이 실행된다.

  • 라인 7 : geth에 attach명령어가 붙었다. attach명령어는 기존에 동작하는 geth노드에 접속하는 명령이다. 상호간 통신 규약은 ipc를 사용하고, 데이터 디렉토리의 geth.ipc를 브릿지로 사용한다. 원격에서 접속할 때에는 rpc접속을 사용하는 것이 좋다. 자세한 사용법은 geth command line option 의 attach부분 참조

접속 후에 “>” 프롬프트가 나타나면 성공한 것이다. 이제 자바스크립트 명령을 노드1로 줄 수 있다. 노드1이 동작하는 세션으로 돌아가 표준 출력을 확인해 다음 메시지가 출력 되었는지 확인해보자.

IPC endpoint opened: /home/ubuntu/go-ethereum/build/bin/data/geth.ipc

위 메시지가 있으면 성공적으로 attach된 것이다.

solidity컴파일러 설치

solidity컴파일러 solc는 솔리디티 언어로 작성된 코드를 블록체인에 배포 가능한 바이트코드를 생성한다. 설치 방법은 3가지 정도가 있다.

  1. 브라우저 솔리디티 사용하기
  2. solc-js 사용하기
  3. 직접설치

간편하게 쓰기엔 1번이 좋고, 자바스크립트와 web3에 붙여서 작업하는데는 2번이 좋다. 3번은 개인적으로 잘 안쓴다. 1번은 그냥 접속해서 사용하면 된다(다음 포스트에서 자세히 설명). 아래의 스크립트는 2,3번을 진행한다.

  • 라인 4~7 : ethereum ppa를 등록하고 solc를 설치한다.
  • 라인 10 : node package manager(npm)을 설치한다.
  • 라인 11 : solc를 전역옵션(-g)을 통해 설치한다.

Web3.js 설치

Web3.js는 자바스크립트 기반의 프로그램이 이더리움 노드와 통신을 가능하도록 만들어주는 라이브러리다. npm(node package manager)을 통해 서버, bower를 통해 클라이언트단 모두에 설치할 수 있고, meteor에도 쓸 수 있다. 아래 스크립트는 npm을 기준으로 설치한다.

web3.js를 전역옵션(-g)을 주고 설치했다. 다른 설치방법은 아래 링크 참조

아톰(Atom) 에디터를 쓰고 있다면..

VIM으로 콘트렉트를 코딩하기는 조금 힘들 수 있다. 로컬 노트북과 리모트 EC2인스턴스를 FTP등을 이용해 연결해 놓고 아톰에서 코딩 후 우분투로 포워딩하면 편하다. 그렇지만 여기서 그 부분은 다루지 않는다. FTP서버 설정, 아톰을 이용한 원격 FTP연결 등은 검색 해보시길..

순정 아톰 IDE는 솔리디티 코드를 감지 못한다. 그래서 알록달록하게 나오거나(LINT), 자동 들여쓰기 등이 안되기에 개발 생산성이 떨어진다.

아래의 아톰 플러그인을 사용하면 조금 간편하게 솔리디티 코딩을 할 수 있다.

VIM덕후라면..

꼭 VIM을 써야겠다면, 아래의 VIM 솔리디티 플러그인을 사용해보자. 신텍스 하이라이팅, 오토 인덴트 등등 여러모로 편리하다.

개발루틴

위에서 구축된 환경에서 기본적인 개발루틴은 다음과 같다.

  1. execute_geth.sh로 1번 노드 실행
  2. attach_geth.sh로 2번 콘솔 노드 실행
  3. 솔리디티 코딩 & 컴파일 (browser solidity 혹은 solc 컴파일러 이용)
  4. 배포(web3.js혹은 2번 콘솔노드를 이용)
  5. 채굴
  6. 테스트 ( 오류 발생시 다시 3번부터 반복)

3~5과정은 자바스크립트를 이용해 스크립트로 만들어 놓으면 빠르게 작업할 수 있다.

truffle

https://github.com/ConsenSys/truffle 이더리움 개발 프레임워크

--

--