목차
- 트러플 설치 및, 설정
- 트러플 컨파일
- 트러플 배포
- 트러플 사용하기
이더리움 dapp을 작성하고 사용하려면 컴파일하고 네트워크에 배포하고 배포된 컨트랙트와 연결해야하는 과정을 거치게 된다. 대략 solc를 사용해서 컴파일, 컴파일 된 파일에서 ABI 정보를 가져와서 geth에서 배포하고, 후에 컨트랙트 주소를 저장해두고 후에 사용할 때 주소를 통해서 접근한다. 실제로 개발을 해보면 보통 복잡한 게 아니다. 그래서 이러한 걸 해결해주는 프레임워크가 있다. 바로 트러플[truffle]이다.
트러플은 컴파일, 배포, 디버그, 테스트 기능을 제공한다.
이제 사용법을 알아보자.
1. 트러플 설치 및 설정
npm install -g truffle
설치가 끝나면
truffle version
버전이 나오면 설치 제대로 된 것임.
example이라는 새 디렉토리를 만들고 거기서
npx truffle init
를 해주면,
4가지의 파일이 생길 것이다.
-contracts : 솔리디티 코드 넣는 공간
-migrations: deploy 배포
-test : 배포 된 애들을 실행시켜보는 테스트 공간
-truffle-config.js
contracts 디렉토리 안에 사용할 솔리디티 코드를 넣어준다.
migration 은 원래 있는 것이므로 그냥 냅둔다.
contracts/HelloWorld.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
contract HelloWorld {
string public value;
// public 일 때만 value라는 getter를 자동적으로 만들어준다.
constructor(){
value = "Hello World!";
}
function getValue() public view returns (string memory){
return value;
}
// 그말인 즉슨 위에거 생략가능하다는 말임!
function setValue(string memory _v) public{
value = _v;
}
}
truffle-config.js 파일을 열어,
network 안에 develop부분의 주석처리를 해제해준다.
그리고, geth를 실행한 포트번호를 적어준다.
/**
* Use this file to configure your truffle project. It's seeded with some
* common settings for different networks and features like migrations,
* compilation, and testing. Uncomment the ones you need or modify
* them to suit your project as necessary.
*
* More information about configuration can be found at:
*
* https://trufflesuite.com/docs/truffle/reference/configuration
*
* To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider)
* to sign your transactions before they're sent to a remote public node. Infura accounts
* are available for free at: infura.io/register.
*
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate
* public/private key pairs. If you're publishing your code to GitHub make sure you load this
* phrase from a file you've .gitignored so it doesn't accidentally become public.
*
*/
// const HDWalletProvider = require('@truffle/hdwallet-provider');
//
// const fs = require('fs');
// const mnemonic = fs.readFileSync(".secret").toString().trim();
module.exports = {
/**
* Networks define how you connect to your ethereum client and let you set the
* defaults web3 uses to send transactions. If you don't specify one truffle
* will spin up a development blockchain for you on port 9545 when you
* run `develop` or `test`. You can ask a truffle command to use a specific
* network from the command line, e.g
*
* $ truffle test --network <network-name>
*/
networks: {
// Useful for testing. The `development` name is special - truffle uses it by default
// if it's defined here and no other network is specified at the command line.
// You should run a client (like ganache, geth, or parity) in a separate terminal
// tab if you use this network and you must also set the `host`, `port` and `network_id`
// options below to some value.
//
development: {
host: '127.0.0.1', // Localhost (default: none)
port: 9000, // Standard Ethereum port (default: none)
network_id: '*', // Any network (default: none)
},
//
// An additional network, but with some advanced options…
// advanced: {
// port: 8777, // Custom port
// network_id: 1342, // Custom network
// gas: 8500000, // Gas sent with each transaction (default: ~6700000)
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei)
// from: <address>, // Account to send transactions from (default: accounts[0])
// websocket: true // Enable EventEmitter interface for web3 (default: false)
// },
//
// Useful for deploying to a public network.
// Note: It's important to wrap the provider as a function to ensure truffle uses a new provider every time.
// ropsten: {
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
// network_id: 3, // Ropsten's id
// gas: 5500000, // Ropsten has a lower block limit than mainnet
// confirmations: 2, // # of confirmations to wait between deployments. (default: 0)
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
// },
//
// Useful for private networks
// private: {
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
// network_id: 2111, // This network is yours, in the cloud.
// production: true // Treats this network as if it was a public net. (default: false)
// }
},
// Set default mocha options here, use special reporters, etc.
mocha: {
// timeout: 100000
},
// Configure your compilers
compilers: {
solc: {
version: '0.8.15', // 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"
// }
},
},
// Truffle DB is currently disabled by default; to enable it, change enabled:
// false to enabled: true. The default storage location can also be
// overridden by specifying the adapter settings, as shown in the commented code below.
//
// NOTE: It is not possible to migrate your contracts to truffle DB and you should
// make a backup of your artifacts to a safe location before enabling this feature.
//
// After you backed up your artifacts you can utilize db by running migrate as follows:
// $ truffle migrate --reset --compile-all
//
// db: {
// enabled: false,
// host: "127.0.0.1",
// adapter: {
// name: "sqlite",
// settings: {
// directory: ".db"
// }
// }
// }
};
2. 컨트랙트 컨파일
npx truffle compile
해보면, contracts디렉토리 안에 있는 모든 파일이 컴파일된다.
build 디렉토리가 생성되었고, 그 안에 HelloWorld.json 파일이 생성됨을 확인 할 수 있을 것이다.
3. 컨트랙트 배포하기
truffle init을 했을 때, migrations 디렉토리가 생성되었다. 거기 안에 1_initial_migration.js 파일이 있을 것이다.
우리는 HelloWorld.sol 파일에 대한 배포 파일을 만들어야하기에 migrations 디렉토리 안에
2_deploy_HelloWorld.js 파일을 하나 추가해준다.
example/migrations/2_HelloWorld_migration.js
const helloworld = artifacts.require('HelloWorld');
//build안 json 파일 불러오는 것
module.exports = function (deployer) {
deployer.deploy(helloworld);
};
위처럼 작성한다.
마이닝을 실행시켜주고.
truffle migration
를 터미널에 쳤을 때
Running Migration........... 긴 문구들이 뜨면 성공이다.
4. 컨트랙트 사용하기
truffle console
을 입력하여 트러플 콘솔로 들어간다.
들어갔으면
HelloWorld
HelloWorld.address
HelloWorld.deployed().then(instance => hello = instance)
가 잘 나오는지 차례로 쳐본다.
hello.
엔터말고 tab키 두번 누르면 배포한 컨트랙트가 나온다.
hello setValue('바꿀값')
value값도 바꿀 수 있다. setValue를 할 때는 코드가 변하므로 트랜잭션이 실행되기 때문에
꼭 마이닝을 해줘야한다.
재배포 명령도 있다.
npx truffle migration --reset
'블록체인 > 스마트 컨트랙트' 카테고리의 다른 글
[스마트 컨트랙트] 투표 dApp 만들어 보기 (0) | 2022.07.18 |
---|---|
[truffle, 스마트 컨트랙트] 토큰 생성해보기 (0) | 2022.07.15 |
[ truffle, 스마트 컨트랙트 ] 솔리디티 event 사용해서 dApp 간단하게 구현해보기 (0) | 2022.07.14 |
[truffle, 스마트 컨트랙트] d App 간단하게 만들어보기 (0) | 2022.07.13 |
[이더리움] 스마트 컨트랙트 구현해보기 (0) | 2022.07.11 |