이더리움 Dapp만들기 5. 스마트 컨트랙트 배포하고 사용하기(solc 컴파일 이용)

in #kr7 years ago

private network에 solidity 언어로 스마트컨트랙트를 만들고 solc 를 이용해서 컴파일 한 후, geth 콘솔에서 배포하고 사용하는 방법에 대해서 알아보겠습니다.

solc 설치하기

solidity 컴파일러를 우분투에 설치합니다.

sudo apt-get install solc

제대로 설치됐는지 solc 버전을 확인해보겠습니다

solc --version

01.png

solc에서 사용할 수 있는 옵션을 보려면 solc --help를 사용하면 됩니다

스마트 컨트랙트 작성하고 compile 하기

스마트 컨트랙트는 프로그램을 작성할 수 있는 아무거나 사용하시면 됩니다. 저는 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 옵션은 컨트랙트의 바이너리 정보를 결과로 보여줍니다.

02.png

스마트 컨트랙트 배포하기

ABI 설정

이제 컴파일도 끝났으니 배포를 해보도록 하겠습니다. geth를 실행합니다. 아래와 같이 simpleAbi라는 변수를 선언하고 컴파일해서 얻은 결과를 할당합니다. 데이터를 집어넣고 simpleAbi를 입력해보면 잘 입력됐는지 확인할 수 있습니다.

03.png

Binarycode 설정하기

simpleBin 변수를 생성해서 --bin으로 나온 결과값을 할당합니다. 다만 유의할 점은 앞에 “0x”+를 해줘서 16진수임을 표시해줘야합니다.

04.png

컨트랙트 배포하기

abi와 bin 정보를 저장했으니 두 개의 정보를 바탕으로 컨트랙트를 만들어보겠습니다.
컨트랙트를 생성할 때, 제일 먼저 eth.contract()를 이용해서 abi를 설정해줘야 합니다. simpleContract 변수에 abi를 설정해줍니다.

var simpleContract = eth.contract(simpleAbi)

abi 설정이 끝났으면 컨트랙트를 배포할 때는 컨트랙트를 배포하는 계좌가 누구인지, 얼마만큼의 가스를 소비할 것 인지, 그리고 배포할 컨트랙트의 데이터가 무엇인지를 명시해줘야 합니다.

var simpleTransferObject = {from: eth.accounts[0], data: simpleBin, gas: 2000000};

05.png

자, 그럼 배포를 해보기 전에!!!!!!!!! 첫 번째 계좌에서 가스를 소비해야 하니 락을 풀어줘야 합니다.!!!!!!!!!!!!

personal.unlockAccount(eth.accounts[0]);

자! 이제 배포할 준비가 다 끝났습니다. simpleContract.new(simpleTransferObject)를 입력하면 배포가 시작됩니다.

var contractObj = simpleContract.new(simpleTransferObject);

06.png

배포가 시작되면 contractObj 객체를 통해서 컨트랙트 정보를 얻을 수 있습니다. contractObj를 입력해보면 관련된 정보들이 쭉~ 출력됩니다.

07.png

출력된 정보를 보면 address란이 undefined로 있는 걸 확인할 수 있습니다. 채굴이 아직 안되서 address가 결정이 안되어 있는겁니다. miner.start()를 입력해서 채굴을 합니다.

miner.start()

채굴이 되면 address가 할당되어 있는 걸 볼 수 있습니다.

08.png

컨트랙트를 사용해보겠습니다. set함수를 이용해서 숫자를 변경하고 get함수를 이용해서 제대로 저장이 됐는지 출력해봅니다.

contractObj.set(1000, {from:eth.account[0], gas:1000000})

09.png

배포된 컨트랙트 사용하기

배포된 컨트랙트를 사용하기 위해서는 컨트랙트의 abi와 주소 값이 필요합니다. eth.contract 함수에 abi값을 인자로 넘겨줍니다.

10.png

사용할 컨트랙트를 가져옵니다. at함수에 컨트랙트의 주소를 설정하면 됩니다. 잘 연결이 됐는지 확인하기 위해서 get함수 값을 확인해보겠습니다. 위에서 설정한 1000 값이 잘 출력되네요!

11.png

이더리움의 스마트 컨트랙트에서 많이 혼동되는 지점 중 하나가 배포하는 부분입니다. 컨트랙트를 배포하기 위해서 필요한 정보는** 1. 컨트랙트의 abi정보 2. 컨트랙트 binary code** 라는 점.

그리고 배포된 컨트랙트를 사용하기 위해서는 **1.컨트랙트의 abi 정보와 2. 배포된 컨트랙트 주소 **입니다.

이렇게 solc를 이용해서 배포하다보면 엄~~~~~~~~~~청 불편합니다. 그래서 REMIX를 사용하기도 합니다. 하지만 web3를 이용해서 dapp을 개발하려고 하면 또.. 그래서 결국에는 truffle을 사용하게 되더라구요. ㅎㅎㅎ

다음 편은 배포된 컨트랙트와 web3 라이브러리를 이용해서 간단한 dapp을 만들어보겠습니다.