Cute Bow Tie Hearts Blinking Pink Pointer

블록체인/스마트 컨트랙트

[truffle] 트러플 사용 방법 알아보기.

청포도 에이드 2022. 7. 12. 17:09
728x90
목차

 

- 트러플 설치 및, 설정

- 트러플 컨파일

- 트러플 배포

- 트러플 사용하기

 

이더리움 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
728x90