본문 바로가기
컴퓨터과학/블록체인

[블록체인] 컨트랙 개발부터 사용까지 - solc, node.js, ganache-cli

by 윤호 2021. 4. 16.

여는글

목차

  • 컨트랙 개발
  • 컨트랙 컴파일
  • 컨트랙 배포
  • 컨트랙 사용

컨트랙 개발 - solc

블록체인에서 컨트랙은 자바의 클래스와 비슷한 개념입니다.

 

src 디렉토리에 다음의 sol 파일을 생성합니다.

%%writefile src/HelloSnowman.sol

pragma solidity 0.6.4;

contract Hello {
    function sayHello() pure public returns(string memory) {
        return "Hello, Snowman";
    }
}

컨트랙 컴파일 - solc

명령창에서 개발한 sol 파일을 컴파일 해보겠습니다.

!solc --abi --bin --gas src/HelloSnowman.sol

ganache 배포시 ABI와 binary code가 필요하기 때문에 --abi, --bin 을 씁니다.

(--gas는 gas를 보기위한 옵션으로 과정에 필요는 없음)

 

ABI는 흔히 알고있는 API와 비슷한 개념인데, binary 코드 수준에서 작동하는 인터페이스라고 생각하면 됩니다.

 

컴파일 후 binary와 ABI가 출력된 화면

컨트랙 배포 - ganache, web3, node.js

ganache로 돌아가고있는 블록체인 사설망에 web3로 접근하여 컨트랙을 배포해보겠습니다.

 

먼저, ganache를 실행합니다.

더보기
ganache 실행 화면

 

 web3로 해당 블록체인 사설망에 접근해보겠습니다.

현재 제 PC에서 사설망을 돌리고, 사설망에 접근하기 때문에 localhost로 접속합니다.

%%writefile src/HelloSnowmanDeploy.js
var Web3=require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8345"));

 

다음의 코드로 사설망에 존재하는 계좌를 가져올 수 있습니다.

web3.eth.getAccounts(function(err, accounts) {
    console.log("accounts: " + accounts[0])
});

 

배포를 해보겠습니다. 앞서 구한 ABI와 binary를 eth.contrac의 인자로, shelloContract.deploy의 data로 각각 넣어줍니다.

%%writefile src/HelloSnowmanDeploy.js
var Web3=require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8345"));
var shelloContract = new web3.eth.Contract([{"inputs":[],"name":"sayHello","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]);


web3.eth.getAccounts(function(err, accounts) {
    console.log("accounts: " + accounts[0])
    
    shelloContract
    .deploy({
            data: '608060405234801561001057600080fd5b5061011e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ef5fb05b14602d575b600080fd5b603360ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101560715780820151818401526020810190506058565b50505050905090810190601f168015609d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60606040518060400160405280600e81526020017f48656c6c6f2c20536e6f776d616e00000000000000000000000000000000000081525090509056fea26469706673582212202283be703a4133402890b7227a1b831fc357bf83aad91b14398092a0ea5beb4a64736f6c63430006040033', 
    })
    .send({
     from: accounts[0],
     gas: '4700000'
    }, function (error, transactionHash){ 
            console.log(error, transactionHash); 
    })
    .then(function(newContractInstance){
        console.log(newContractInstance.options.address)
    });
    
});


실행된 모습

출력되는 것 중 세번째 줄의 0x~ 부분이 컨트랙 사용에서 사용됩니다.

컨트랙 사용

ABI와 앞서 배포에서 구한 0x~ 부분을 넣어주고 call로 실행합니다.

%%writefile src/HelloSnowmanUse.js
var Web3=require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8345"));
var shelloContract = new web3.eth.Contract([{"inputs":[],"name":"sayHello","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}],
                                      "0x61a32055B99AD2669073a073fa8b5896F175c145");
shelloContract.methods.sayHello().call().then(function(str) {console.log(str);});

 

컨트랙션 사용에는 앞에서 사용한 call() 함수와 sendTransaction() 함수가 있습니다.

call()은 단순히 불러오는 것이기 때문에 블록체인에 기록되지 않습니다.

sendTransaction()은 블록체인에 기록되어 마이닝이 필요합니다.

 

Reference

  • 상명대학교 임좌상 교수님 블록체인프로그래밍

댓글