이 번에는 private network를 rpc옵션을 사용해서 클라이언트 앱과 연동하는 법을 알아보도록 하겠습니다. 연동할 앱은 remix입니다. remix는 이더리움 스마트 컨트랙트를 만들 때 사용하는 언어인 solidity ide 툴입니다. remix에서 스마트 컨트랙트 컴파일과 배포, 사용까지 할 수 있어서 많이 사용합니다.
remix 설치하고 실행하기
https://github.com/ethereum/remix-ide/tree/gh-pages 링크에 접속해서 다운로드 받은 후 압축을 풀어도 되고 git 명령어로 다운로드 해도 됩니다. 압축을 푼 폴더로 이동하면 index.html 파일이 있습니다. 해당 파일을 브라우저로 실행시킵니다. 아래와 같은 화면이 보이면 성공적으로 실행된겁니다.
스마트 컨트랙트 작성하기
ballot.sol을 지우고 Simple.sol 파일을 새로 만들어서 간단하게 data에 숫자를 입력하고 불러오는 스마트 컨트랙트를 작성해보겠습니다. 좌측 상단 ‘+’을 클릭하면 새로운 파일을 만들 수 있습니다. 파일 이름으로 Simple.sol을 입력하고 넘어갑니다.
아래와 같이 스마트 컨트랙트를 작성합니다. data라는 변수에 숫자를 set 함수를 통해서 변경하고 get 함수를 통해서 불러오는 간단한 프로그램입니다. 가장 상단의 pragma solidity $0.4.11 부분은 솔리디티 버전 0.4.11 을 사용해서 프로그래밍을 했다고 명시하는 것입니다. 솔리디티에 대한 문법 설명은 나중에 솔리디티 문법 부분에서 다루고 이 번에는 넘어가도록 하겠습니다.
pragma solidity ^0.4.11;
contract Simple{
uint256 data;
function get() constant public returns(uint256) {
return data;
}
function set (uint256 _data) public{
data= _data;
}
}
프로그램을 다 작성했으면 우측의 start to compile 버튼을 클릭합니다. 코드가 잘 작성됐다면 아래와 같이 녹색 바탕에 스마트 컨트랙트의 이름이 표시됩니다.
스마트 컨트랙트를 작성하고 컴파일 까지 끝냈습니다. 이제 스마트 컨트랙트를 배포하고 사용해 보겠습니다.
Remix을 이용한 스마트 컨트랙트 배포
javascript vm에서 배포와 사용
remix에서는 세 종류의 배포 방법을 제공합니다. run 패널로 이동을 해서 Environment를 클릭해보면 ‘javascript vm’, ‘injected Web3’, ‘Web3 Provider’가 있는 걸 볼 수 있습니다.
javascript vm을 선택하면 이더리움 노드 없이 가상으로 스마트 컨트랙을 배포하고 실행해볼 수 있습니다. 실제로 배포하기 전에 테스트용으로 사용하면 좋습니다. injected Web3는 MetaMask와 같은 브라우저 플러그인과 연동할 때 사용합니다. 다른 클라이언트 앱과 연동할 때 사용하는 걸로 생각하시면 됩니다. Web3 Provider는 private network와 연동할 때 사용하는 옵션입니다.
우선 javascript vm환경에서 제대로 실행되는 확인해보겠습니다.
Environment 를 javascript vm으로 선택합니다. 다른 설정은 건드리지 않겠습니다. Simple 컨트랙트 하단에 있는 create 버튼을 클릭해서 컨트랙트를 배포합니다.
배포가 완료되면 하단에 컨트랙트 배포와 관련된 로그 정보가 출력되고 우측 하단에 컨트랙트에서 작성한 get, set 함수가 나타납니다.
배포가 완료됐으니 사용을 해보겠습니다. set 함수 옆에 숫자 100을 입력하고 set을 클릭합니다. 그러면 transaction에 관련 로그가 나타납니다.
get을 클릭해서 설정된 값이 읽어오는 지 확인해보겠습니다. get을 클릭합니다. 아래 그림처럼 100이 나오면 성공입니다. !!!
가상환경에서 스마트 컨트랙트를 작성하고 배포하고 사용을 해봤습니다. 그럼 이제 private network와 연동해서 private network에 스마트 컨트랙트를 배포하고 사용해보겠습니다.
private network와 연결하고 스마트컨트랙트 배포하고 사용하기
remix를 private network와 연동하기 위해서는 network를 실행할 때 geth 에 rpc 옵션을 설정해줘야합니다. (Ethereum Wallet과는 ipc를 통해서 연결했었죠~)
사용할 rpc 옵션은 --rpc, --rpcaddr, --rpcport, --rpcapi, --rpccorsdomain 입니다.
--rpc 는 http-rpc 서버를 사용하게 하는 옵션입니다. --rpcaddr은 rpc로 사용하는 주소를 명시하는 옵션이고 기본은 localhost입니다. --rpcport 는 rpc로 사용하는 포트를 지정하는 옵션입니다. 기본은 8545 입니다. --rpcapi는 rpc로 접속한 앱에서 사용할 수 있는 api 종류를 지정하는 옵션입니다. --rpccorsdomain은 network에 접속할 도메인을 지정할 수 있는 옵션입니다.
rpcaadr, rpcport는 기본으로 주어지는 값을 사용하겠습니다. localhost:8545 를 사용하게 되겠네요. --rpcapi 는 ‘db, eth, net, web3’를 설정하겠습니다. db, eth, net, web3는 geth에서 제공하는 api종류들입니다. --rpccorsdomain은 “*”을 지정합니다. 테스트를 하기 위해서 rpccorsdomain의 값으로 *를 지정해서 모든 도메인에서 접근할 수 있도록 했습니다. 실제로 서비스할 때는 *를 사용하지 않는 게 좋습니다.
rpc 옵션에 관련한 자세한 내용은 https://github.com/ethereum/wiki/wiki/JSON-RPC
에서 확인하실 수 있습니다.
geth를 실행시킵니다.
geth --datadir “./data” --identity “MyNetwork” --networkid 1988 --nodiscover --rpc --rpcapi “db, eth,net, web3” --rpccorsdomain “*” console
geth를 실행시키고 remix 로 돌아옵니다. remix의 Environment를 ‘Web3 provider’로 변경합니다. Web3 Provider로 선택을 하면 ethereum node에 접속할 거냐고 묻는 경고창이 나옵니다. ok를 클릭해서 넘어갑니다
접속할 주소와 포트를 입력하는 창이 나오는 데 우리는 따로 설정을 해주지 않았으니 기본 값인 localhost:8545입니다. ok를 클릭해서 넘어갑니다.
접속이 잘 됐나 확인해보겠습니다. Environment 밑에 있는 Account를 클릭해보면 private network에서 생성한 계좌를 볼 수 있을겁니다. 잘 접속이 됐네요 :)
자, 이제 private network에 Simple을 배포하고 사용해보겠습니다. create버튼을 클릭해서 배포합니다. 어라.. 그런데 error를 출력합니다.
스마트 컨트랙트를 배포할 때는 gas를 사용하게 됩니다. 그래서 컨트랙트를 배포하는 계좌에서 gas를 소비할 수 있게 락을 풀어줘야 합니다. geth 콘솔창으로 이동 후에
personal.unlockAccount(eth.accounts[0])
를 입력해서 첫 번째 계좌(컨트랙트를 배포할)의 락을 풀어줍니다.
다시 Remix로 이동해서 create를 클릭합니다. 그러면 javascript vm환경에서 했던 것과는 다르게 바로바로 컨트랙트가 배포되지 않고 pending 단계로 빠지는 걸 볼 수 있습니다. 채굴을 해줘야 배포가 마무리 됩니다. geth 콘솔창으로 가서 miner.start()를 입력해서 채굴을 시작합니다.
채굴이 되면 아래와 같이 사용할 수 있는 컨트랙트가 우측에 나타납니다.
자, 그러면 set함수에 1000을 입력하고 채굴이 되면 get을 클릭해서 제대로 동작하는지 확인해보겠습니다. 1000이 나오면 성공입니다.
오늘은 rpc 옵션을 사용해서 클라이언트 앱과 연동하는 법을 알아봤습니다. web3를 이용해서 dapp을 개발할 때 rpc옵션을 이용하기 때문에 rpc관련 옵션을 한 번 쓱 보시는 걸 추천드립니다.
다음에는 콘솔에서 remix 사용하지 않고 스마트 컨트랙트를 작성하고 geth콘솔에서 배포하고 사용하는 방법에 대해서 알아보겠습니다.