이 장에서는 truffle을 이용하여 스마트 컨트랙트를 작성하고 배포하는 방법에 대하여 설명합니다.
스마트 컨트랙트 작성
Truffle을 사용하여 스마트 컨트랙트의 작성과 배포를 하는 방법에 대해서 설명합니다.
Truffle 사용 방법
1. 설치
Node package manager인 npm 사용하여 truffle을 설치할 수 있습니다. npm 설치 방법은 다음 링크를 참조하세요. https://www.npmjs.com/
$ npm install --g truffle
2. 초기화
$ truffle init
truffle init을 수행하면 Truffle project가 생성됩니다. 생성된 truffle project는 build/contracts, contracts, migrations, test, truffle-config.js 로 구성되어 있습니다.
build/contracts : solidity로 작성한 contract가 compile된 결과(abi, bytecode)가 저장
contract : smart contract solidity files
migrations : deploy code(js format)
test : test code(js format)
truffle-config.js : solidity compiler version 설정, network 설정 등의 configuration
truffle init을 수행하면 contract 폴더 안에 Migrations.sol 이라는 예제 solidity 코드가 아래와 같이 생성되어 있는 것을 확인 할 수 있습니다. 작성된 스마트 컨트랙트를 배포하기 위해 사용자는 작성한 스마트 컨트랙트를 먼저 컴파일 해야합니다.
pragma solidity >=0.4.22 <0.9.0;
contract Migrations {
address public owner = msg.sender;
uint public last_completed_migration;
modifier restricted() {
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
}
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}
3. 설정
컴파일 및 배포를 위하여 truffle-config.js 파일을 수정하여야 합니다.
3.1 계정 설정
배포를 위해 사용할 계정에 대한 설정을 위해 truffle-config.js 파일의 HDWalletProvider와 privKeys를 추가합니다. Private key는 Web Wallet (https://wallet.test.wemix.com)을 통해 계정을 생성한 후 가져올 수 있습니다.
const HDWalletProvider = require('@truffle/hdwallet-provider');
const privKeys = ["privatekey from Web Wallet"];
마지막으로 사용하고자 하는 Solidity 컴파일러 버전을 설정합니다. 현재 최신 버전은 0.8.x 이며 예제는 0.8.11 버전을 사용합니다. 컴파일러를 사용하는 운영체제에 바로 설치되어 있으면 초기 설정과 동일하게 docker 설정을 주석처리하면 되며, docker를 사용하여 설치하기 위해서는 아래와 같이 "docker: true"로 설정하고 docker가 설치되어 있어야 합니다. optimizer를 사용한다면 주석을 해제하고 적절한 설정을 해주면 됩니다.
compilers: {
solc: {
version: "0.8.11", // Fetch exact version from solc-bin (default: truffle's version)
docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,
// runs: 200
// },
// evmVersion: "byzantium"
}
}
4. Solidity 코드 작성
다음은 count 변수를 증가 또는 감소시키고 값을 조회하는 간단한 스마트 컨트랙트 예제입니다. Counter.sol로 저장합니다.
pragma solidity ^0.8.0;
contract Counter {
uint256 count;
constructor(uint256 _count) {
count = _count;
}
function get() public view returns (uint256) {
return count;
}
function inc() public {
count += 1;
}
function dec() public {
count -= 1;
}
}
5. Solidity 코드 컴파일
truffle compile <file name>을 truffle project 폴더에서 수행하면 대상으로 지정한 solidity 파일을 컴파일하게 됩니다. 컴파일된 solidity contract는 build/contracts 폴더에 <contract name>.json 포맷으로 저장됩니다.