여는글
목차
- 컨트랙 개발
- 컨트랙 컴파일
- 컨트랙 배포
- 컨트랙 사용
컨트랙 개발 - 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 코드 수준에서 작동하는 인터페이스라고 생각하면 됩니다.
컨트랙 배포 - ganache, web3, node.js
ganache로 돌아가고있는 블록체인 사설망에 web3로 접근하여 컨트랙을 배포해보겠습니다.
먼저, 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
- 상명대학교 임좌상 교수님 블록체인프로그래밍
'컴퓨터과학 > 블록체인' 카테고리의 다른 글
[블록체인] geth 기본 명령어 모음 (0) | 2021.04.11 |
---|---|
[블록체인] geth 사설망(private network) 구축하기 (0) | 2021.04.03 |
댓글