간단한 스마트 컨트랙트를 작성하고 Truffle을 사용하여 컴파일한 다음 Ropsten 네트워크에 배포하는 방법을 다뤄보겠습니다.
시작하기 앞서 3가지가 준비되어 있어야합니다.
트러플은 블록체인 네트워크를 위한 스마트 계약 개발 도구이자 테스트 프레임워크입니다.
Node.js 패키지 매니저를 사용하여 Truffle을 전역으로 설치합니다.
npm install -g truffle
배포를 위해서는 약간의 가스비가 필요합니다. 따라서 Ropsten 네트워크의 이더리움 계정에 테스트넷 ETH를 추가합니다.
https://faucet.dimensions.network
https://faucet.egorfine.com
프로젝트의 폴더를 생성합니다. 다음의 명령어로 생성 할 수 있습니다.
mkdir truffleProject
생성한 폴더로 이동합니다.
cd truffleProject
.env
파일을 사용하여 로컬에서 환경변수를 설정하기 위해 설치해줍니다.
npm install dotenv
여기에서는
.env
파일을 이용하여 지갑의 니모닉과 Infura API URL을 저장할 예정입니다.
계약을 테스트하고 배포하는 데 필요한 디렉터리 구조가 잡혀있는 Truffle 프로젝트를 생성합니다.
truffle init
위의 명령어를 입력하게 되면 아래와 같은 폴더 구조를 가진 프로젝트가 생성됩니다.
hdwallet-package는 12단어 또는 24단어 니모닉에서 파생된 주소에 대한 트랜잭션을 서명할 수 있는 별도의 패키지입니다.
자세한 내용은 Truffle hdwallet-provider을 참조해주세요.
아래의 명령어로 hdwallet-provider를 설치합니다.
npm install @truffle/hdwallet-provider
프로젝트 폴더에 .env 파일을 생성하여 프로젝트 및 이더리움 계정의 세부 정보를 저장합니다.
여기에서는 MetaMask 비밀 복구 구문을 포함합니다. 비밀 복구 문구를 표시하는 방법은 MetaMask 지침을 참조해주세요.
INFURA_API_KEY = "https://ropsten.infura.io/v3/<Your-API-Key>"
MNEMONIC = "<Your-MetaMask-Secret-Recovery-Phrase>"
Your-API-Key
: Infura의 이더리움 프로젝트 API key.Your-MetaMask-Secret-Recovery-Phrase
: MetaMask 지갑의 니모닉. hdwallet-provider의 거래에 사용됩니다.비밀 복구 구문이 외부에 노출되지 않도록 주의해 주세요. 비밀 복구 구문이 노출되면 누구나 해당 지갑의 자산에 접근할 수 있습니다.
여기에서는 배포만을 위한 간단한 컨트랙트를 작성하겠습니다. contracts
폴더 안에 Demo.sol 파일을 생성해주세요.
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.8;
contract Demo {
event Echo(string message);
function echo(string calldata message) external {
emit Echo(message);
}
}
HDWalletProvider를 이용해 Ropsten 네트워크에 배포를 하기 위한 설정을 해주겠습니다.
truffle-config.js
파일에서 아래와 같이 설정을 해줍니다.
require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const { INFURA_API_KEY, MNEMONIC } = process.env;
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
},
ropsten: {
provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_KEY),
network_id: 3,
gas: 5500000
}
}
};
보다 자세한 설정을 위해서는 여기를 확인해주세요.
smart contract 컴파일을 위해서 아래의 명령어를 입력해주세요.
truffle compile
컴파일에 성공하게 되면 아래와 유사한 출력이 콘솔에 표시됩니다.
Compiling your contracts...
===========================
> Compiling ./contracts/Demo.sol
> Compiling ./contracts/Migrations.sol
> Artifacts written to /Users/user/truffleProject/build/contracts
> Compiled successfully using:
- solc: 0.5.16+commit.9c3226ce.Emscripten.clang
build/contracts/
폴더에 컴파일된 ABI가 json으로 저장됩니다.
배포를 위해서는 migrations/
폴더에서 스크립트를 생성해야합니다. migrations/
폴더에서는 번호가 매겨져있으며 migrations/
폴더에서 2_deploy_contract.js
와 같은 이름을 가진 파일을 생성합니다.
2_deploy_contract.js
파일에 다음과 같이 작성합니다.
const Demo_Contract = artifacts.require("Demo");
module.exports = function(deployer) {
deployer.deploy(Demo_Contract);
};
스마트 컨트랙트를 이더리움 네트워크에 배포하려면 마이그레이션 명령을 실행해야 합니다.
계약을 배포하려면 다음 명령을 실행합니다.
truffle migrate --network ropsten
배포에 성공하게 되면 아래와 유사한 출력이 콘솔에 표시됩니다.
Starting migrations...
======================
> Network name: 'ropsten'
> Network id: 3
> Block gas limit: 30000000 (0x1c9c380)
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0xd437e9d1595e31228dcead9397caa1526ebe5ae8f7ec06a176b7aeed53916202
> Blocks: 4 Seconds: 53
> contract address: 0xBe72Ed0EB8Af6d52c0Be64Ca908f81E0100390C2
> block number: 12818214
> block timestamp: 1660875012
> account: 0x5A2609D698DE041B1Ba77139A4229c8a161dDd9e
> balance: 19.999374644998249006
> gas used: 250142 (0x3d11e)
> gas price: 2.500000007 gwei
> value sent: 0 ETH
> total cost: 0.000625355001750994 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.000625355001750994 ETH
2_deploy_contract.js
====================
Deploying 'Demo'
----------------
> transaction hash: 0xbed1f55b5be802ac40e408d3ac517de67795afc1762aaa7450dd652921a557bd
> Blocks: 2 Seconds: 29
> contract address: 0xD06F174f4A41884AAf0958C72EEc49Ec386e03b3
> block number: 12818218
> block timestamp: 1660875060
> account: 0x5A2609D698DE041B1Ba77139A4229c8a161dDd9e
> balance: 19.998852204996786174
> gas used: 163063 (0x27cf7)
> gas price: 2.500000007 gwei
> value sent: 0 ETH
> total cost: 0.000407657501141441 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.000407657501141441 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.001033012502892435 ETH
Etherscan과 같은 블록 탐색기를 사용하여 트랜잭션 세부 정보를 볼 수 있습니다.
예를 들어 transaction hash
또는 contract address
를 사용하여 세부 정보를 볼 수 있습니다.