private network에 solidity 언어로 스마트컨트랙트를 만들고 solc 를 이용해서 컴파일 한 후, geth 콘솔에서 배포하고 사용하는 방법에 대해서 알아보겠습니다.
solidity 컴파일러를 우분투에 설치합니다.
sudo apt-get install solc
제대로 설치됐는지 solc 버전을 확인해보겠습니다
solc --version
solc에서 사용할 수 있는 옵션을 보려면 solc --help를 사용하면 됩니다
스마트 컨트랙트는 프로그램을 작성할 수 있는 아무거나 사용하시면 됩니다. 저는 vim을 사용해서 작성했습니다. 아래와 같이 작성하고 파일 이름을 Simple.sol로 저장합니다.
pragma solidity ^0.4.11;
contract Simple{
uint256 data;
function get() constant public returns(uint256) {
return data;
}
function set (uint256 _data) public{
data= _data;
}
}
컨트랙트 작성이 완료되었으면 solc를 이용해서 컴파일을 합니다.
solc Simple.sol
에러가 없다면 아무런 결과도 나오지 않을겁니다. ^^;;; 컨트랙트를 배포할 때 필요한 옵션은 바로 --abi --bin 입니다. --abi는 스마트 컨트랙트의 인터페이스를 결과로 보여주고 --bin 옵션은 컨트랙트의 바이너리 정보를 결과로 보여줍니다.
이제 컴파일도 끝났으니 배포를 해보도록 하겠습니다. geth를 실행합니다. 아래와 같이 simpleAbi라는 변수를 선언하고 컴파일해서 얻은 결과를 할당합니다. 데이터를 집어넣고 simpleAbi를 입력해보면 잘 입력됐는지 확인할 수 있습니다.
simpleBin 변수를 생성해서 --bin으로 나온 결과값을 할당합니다. 다만 유의할 점은 앞에 “0x”+를 해줘서 16진수임을 표시해줘야합니다.
abi와 bin 정보를 저장했으니 두 개의 정보를 바탕으로 컨트랙트를 만들어보겠습니다.
컨트랙트를 생성할 때, 제일 먼저 eth.contract()를 이용해서 abi를 설정해줘야 합니다. simpleContract 변수에 abi를 설정해줍니다.
var simpleContract = eth.contract(simpleAbi)
abi 설정이 끝났으면 컨트랙트를 배포할 때는 컨트랙트를 배포하는 계좌가 누구인지, 얼마만큼의 가스를 소비할 것 인지, 그리고 배포할 컨트랙트의 데이터가 무엇인지를 명시해줘야 합니다.
var simpleTransferObject = {from: eth.accounts[0], data: simpleBin, gas: 2000000};
자, 그럼 배포를 해보기 전에!!!!!!!!! 첫 번째 계좌에서 가스를 소비해야 하니 락을 풀어줘야 합니다.!!!!!!!!!!!!
personal.unlockAccount(eth.accounts[0]);
자! 이제 배포할 준비가 다 끝났습니다. simpleContract.new(simpleTransferObject)를 입력하면 배포가 시작됩니다.
var contractObj = simpleContract.new(simpleTransferObject);
배포가 시작되면 contractObj 객체를 통해서 컨트랙트 정보를 얻을 수 있습니다. contractObj를 입력해보면 관련된 정보들이 쭉~ 출력됩니다.
출력된 정보를 보면 address란이 undefined로 있는 걸 확인할 수 있습니다. 채굴이 아직 안되서 address가 결정이 안되어 있는겁니다. miner.start()를 입력해서 채굴을 합니다.
miner.start()
채굴이 되면 address가 할당되어 있는 걸 볼 수 있습니다.
컨트랙트를 사용해보겠습니다. set함수를 이용해서 숫자를 변경하고 get함수를 이용해서 제대로 저장이 됐는지 출력해봅니다.
contractObj.set(1000, {from:eth.account[0], gas:1000000})
배포된 컨트랙트를 사용하기 위해서는 컨트랙트의 abi와 주소 값이 필요합니다. eth.contract 함수에 abi값을 인자로 넘겨줍니다.
사용할 컨트랙트를 가져옵니다. at함수에 컨트랙트의 주소를 설정하면 됩니다. 잘 연결이 됐는지 확인하기 위해서 get함수 값을 확인해보겠습니다. 위에서 설정한 1000 값이 잘 출력되네요!
이더리움의 스마트 컨트랙트에서 많이 혼동되는 지점 중 하나가 배포하는 부분입니다. 컨트랙트를 배포하기 위해서 필요한 정보는** 1. 컨트랙트의 abi정보 2. 컨트랙트 binary code** 라는 점.
그리고 배포된 컨트랙트를 사용하기 위해서는 **1.컨트랙트의 abi 정보와 2. 배포된 컨트랙트 주소 **입니다.
이렇게 solc를 이용해서 배포하다보면 엄~~~~~~~~~~청 불편합니다. 그래서 REMIX를 사용하기도 합니다. 하지만 web3를 이용해서 dapp을 개발하려고 하면 또.. 그래서 결국에는 truffle을 사용하게 되더라구요. ㅎㅎㅎ
다음 편은 배포된 컨트랙트와 web3 라이브러리를 이용해서 간단한 dapp을 만들어보겠습니다.