Truffle framework는 솔리디티로 스마트 컨트랙트 개발시 배포/테스트 환경을 제공합니다. node.js 위에서 작동하며 NPM으로 설치합니다. Truffle을 사용하기 위해서는 NodeJS Version 5.0이상이 필요하며, JSON RPC API를 지원하는 이더리움 클라이언트가 필요합니다.
Truffle 설치방법
Truffle은 npm으로 설치합니다. 전역으로 설치해줍니다.
$ npm install -g truffle
Truffle 프로젝트 생성하기
먼저 Simple Project를 생성합니다. truffle init은 프로젝트 기본 틀을 구성합니다.
$ mkdir simple
$ cd simple
$ truffle init
- contracts : 솔리디티로 개발된 스마트 컨트랙트 소스 파일입니다.
- contracts/Migrations.sol : 배포를 지원하는 Soliditiy 파일입니다.
- migrations : 컨트랙트 배포를 위한 스크립트 파일을 담은 디렉토리입니다.
- migrations/1_initial_migrations.js : Migrations.sol을 배포하는 스크립트 파일입니다.
- test : 개발 진행중인 컨트랙트를 테스트하기 위한 폴더입니다.
- truffle-config.js : truffle 설정 파일입니다.
Truffle Develop
Truffle Develop은 truffle에서 제공하는 이더리움 클라이언트입니다. Truffle Develop을 실행합니다. 아래 명령어는 root 디렉토리에서 실행합니다. 실행 후 10개의 가상 계정이 생성되고 JSON-RPC 용 서비스가 console 모드로 실행됩니다.
$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/
Accounts:
(0) 0x7c21d996e69207a08a581911b7bb4df2870144d0
(1) 0xe4d2f38f58e34f6a0990491281fc1ba858289141
(2) 0x7d4319324e5a2e81ecd76e08fa0a180739de7f38
(3) 0x4632fc6f990fdebd63b61b18cdcd46314414a31f
(4) 0x780a75460f4eec3df35642420053a2c462ca0eb8
(5) 0xec44a30707bd60df81432924c6f7d76104b78d64
(6) 0x49c667c33b5d310bb3492c330ad1c9ef8c971528
(7) 0x879eb2c9156fb514c4415b10c1d4e588b69d733d
(8) 0x8e45cdbcd513b520c611b9ec55983b59c34ec2cf
(9) 0x0892a362c4767945fb8f3c486612b4e90d0d0daa
Private Keys:
(0) 2144a6bbda660667fd703c96424bbf0b7475b57d9944225a382750eeb98a1b12
(1) 30024471ed3ccf78957a5baed6e72cab7b7d8416ead21be4ca860c905fa424c4
(2) 86516d48e1ec7fd44db0528300040b6c4b6ea52964737f1ebf818ea3b95babba
(3) c273b56234fd8ed1bd6ff7ff9eccdb30d47ee5f7962f765d5fb628a6089c24ce
(4) f6a3c090a6a86c3760cacc4e725b7dc42eb53f347a020b113fde0dbddd448600
(5) b905d8d4e338d41fd1cf7a5829387c78b0b6672015a24d9d6f6b672ac78979c4
(6) b0332eab7c07e760c28923a4ba3d62483d0a9339099a53eeaa647204633c63f7
(7) f94011001096af21f4fb5e44758777f57bcbe1cbbd25780254abe3afd49e35e0
(8) 5158099b8d7f192e0ab3f10861b573097a3244bb22d9951b00d2b9e57d515e34
(9) 4c75a71928957fd02f051fbebed7c772756344cdd3186f1e5ccb9c40e87416e8
Mnemonic: aisle taxi happy tattoo ten tail behind pluck universe tongue group olive
⚠️ Important ⚠️ : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.
truffle(develop)>
Truffle Develop이 실행되면 MetaMask에 해당 클리언트를 추가합니다. Truffle Develop Network를 추가하는 과정은 Ganache 네트워크를 추가하는 과정과 동일합니다.
Truffle Develop 개발 / 배포 / 테스트 진행
① 스마트 컨트랙트 작성
간단한 스마트 컨트랙트 코드를 작성합니다. contracts/Simpole.sol 파일을 생성하고 아래 코드를 작성합니다.
pragma solidity ^0.8.10;
contract SimpleStorage{
uint val;
function set(uint x) public{
val = x;
}
function get() public view returns(uint){
return val;
}
}
② 배포 스크립트 작성
migrations/2_deploy_simple.js 파일을 생성하고 아래 코드를 작성합니다. 주의할 점은 컨트랙트를 호출할 때 파일명으로 불러오는 것이 아닌 컨트랙트명으로 불러오게 됩니다. 배포시 migrations 디렉토리의 모든 파일이 실행되므로, 우선순위를 결정하기 위해 파일명 앞에 숫자를 부여합니다.
var SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function(deployer){
deployer.deploy(SimpleStorage);
}
③ 테스트 스크립트 작성
test/TestSimpleStorage.sol 파일을 생성하고 아래 코드를 작성합니다. test 디렉토리 내 sol 파일은 테스트 대상 컨트랙트 명에 Test를 붙인 이름을 지정합니다.
pragma solidity ^0.8.10;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Simple.sol";
contract TestSimpleStorage{
function testSimpleStorage() public {
SimpleStorage ss = new SimpleStorage();
uint expected = 4;
ss.set(expected);
Assert.equal(ss.get(), expected, "value equal test");
}
}
④ 스마트 컨트랙트 컴파일
스마트 컨트랙트를 컴파일 합니다. 컴파일 수행 시 ./build 디렉토리가 생성되며 SimpleStorage.json 파일이 생성됩니다. contracts/Simple.sol 에서 작성한 컨트랙트에 대한 정보를 담고 있습니다.
truffle(develop) > compile
├── build
│ └── contracts
│ ├── Migrations.json
│ └── SimpleStorage.json
├── contracts
│ ├── Migrations.sol
│ └── Simple.sol
├── migrations
│ ├── 1_initial_migration.js
│ └── 2_deploy_simple.js
├── test
└── truffle-config.js
5 directories, 7 files
⑤ 컨트랙트 배포
스마트 컨트랙트를 배포합니다. ./build 디렉토리내 존재하는 json파일을 서버에 배포합니다.
truffle(develop)> compile
Compiling your contracts...
===========================
> Compiling ./contracts/Simple.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Simple.sol
> Artifacts written to /home/ys/project/BEB_05/21_Contract_Library/simple/build/contracts
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
truffle(develop)> migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'develop'
> Network id: 5777
> Block gas limit: 6721975 (0x6691b7)
2_deploy_simple.js
==================
Deploying 'SimpleStorage'
-------------------------
> transaction hash: 0x8ab0456691c3aa454af755ba2e83cd7134cefe7d2b7dc6a2c2d7403b3f1080a4
> Blocks: 0 Seconds: 0
> contract address: 0x7CF955c4eC02daE819abacEbBF8E5F5211B4ebAc
> block number: 5
> block timestamp: 1657868251
> account: 0x7C21d996E69207a08A581911B7BB4DF2870144d0
> balance: 99.997687799937050644
> gas used: 125653 (0x1ead5)
> gas price: 3.025920799 gwei
> value sent: 0 ETH
> total cost: 0.000380216026156747 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.000380216026156747 ETH
Summary
=======
> Total deployments: 1
> Final cost: 0.000380216026156747 ETH
⑥ 스마트 컨트랙트 테스트
스마트 컨트랙트 테스트를 진행합니다. ./test 디렉토리 내 존재하는 js파일과 sol 파일을 실행합니다. 솔리디티 파일로 테스 파일을 작성할 경우 파일명은 컨트랙트 명과 동일하게 작성되어야 합니다. 또한 contract name은 "Test"로 시작하고, 함수명도 "test"로 시작해야 합니다.
truffle(develop)> test
Using network 'develop'.
Compiling your contracts...
===========================
> Compiling ./test/TestSimpleStorage.sol
> Compilation warnings encountered:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Simple.sol
,Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/test/TestSimpleStorage.sol
> Artifacts written to /tmp/test--24214-Hi1sYUV6YOmy
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
TestSimpleStorage
✔ testSimpleStorage (1126ms)
1 passing (30s)
Truffle Ganache 연동하기
Truffle과 Ganache을 연동해 개발을 진행할 수 있습니다. Truffle 설정파일 truffle-config.js 파일을 수정합니다. networks.development 네트워크에 Ganache 네트워크 정보를 입력합니다.
module.exports = {
networks : {
development : {
host : "127.0.0.1",
port : 7545,
networkd_id : "5777",
}
}
}
Truffle Networks를 확인합니다. development 네트워크가 기본으로 등록되고 truffle develop으로 배포를 한경우 해당 네트워크가 출력됩니다.
truffle(develop)> truffle networks
Network: develop (id: 5777)
Migrations: 0xBc56585247A22f3E9de23b2b02aBFfB8F2C4f85E
SimpleStorage: 0xBE3eA2a78555dC4B72231d6ea878000659D68D05
Network: development (id: 5777)
No contracts deployed.
Ganache 네트워크는 development 네트워크에 연결되어 있으므로, 해당 네트워크에 작성된 컨트랙트를 배포합니다. 만약 migrate가 정상적으로 안되면 truffle develop을 재시작하면 됩니다.
truffle(develop)> truffle migrate --network development
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 5777
> Block gas limit: 6721975 (0x6691b7)
1_initial_migration.js
======================
Replacing 'Migrations'
----------------------
> transaction hash: 0x6798903d1e4c4fdc58bac037bc6212e608c9586efe79229ff5b5b6fdd650ddf5
> Blocks: 0 Seconds: 0
> contract address: 0xe559cA68317ca9F2b369C151Ebdf3C7F5cBe5f40
> block number: 1
> block timestamp: 1657869391
> account: 0xa88528DA35A07963F9C644F067a2b2F921190050
> balance: 99.99502292
> gas used: 248854 (0x3cc16)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00497708 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00497708 ETH
2_deploy_simple.js
==================
Replacing 'SimpleStorage'
-------------------------
> transaction hash: 0x6edca601db2143eeee97de70fbad8e049e2329bb488f23aecb48d9bb1d911a8a
> Blocks: 0 Seconds: 0
> contract address: 0x883e3fa049BB5548b69626B33dd423893591cA80
> block number: 3
> block timestamp: 1657869392
> account: 0xa88528DA35A07963F9C644F067a2b2F921190050
> balance: 99.9916596
> gas used: 125653 (0x1ead5)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00251306 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00251306 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.00749014 ETH
Ganache 네트워크에 컨트랙트 배포가 완료되었습니다. Ganache 네트워크에 새로운 블록이 생성된 것을 확인할 수 있습니다. 세부 트랜잭션들을 보면 truffle devleop 에서 출력한 Tx와 동일한 Tx가 출력되고 있음을 확인할 수 있습니다.
'Blockchain' 카테고리의 다른 글
[Blockchain] KIP-7 vs ERC-20 차이점? (0) | 2022.07.18 |
---|---|
[Blockchain] ERC-20 투표로 관리자 owner 설정 하는 방법 (0) | 2022.07.18 |
[Blockchain] 가나슈(Ganache) 로컬 테스트 환경 구축하기(설치방법 사용법 메타마스크 연동) (0) | 2022.07.15 |
[Blockchain] 이더리움 토큰 발행하기 (ERC-20 라이브러리 사용) (0) | 2022.07.14 |
[Blockchain] 이더리움 토큰 발행 ERC-20 이란? (0) | 2022.07.14 |
댓글