Truffle

Hongยท2022๋…„ 12์›” 4์ผ
0










๐Ÿ„ What is Truffle?

Truffle์€ ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ์— ์ž‘์„ฑํ•œ contract๋ฅผ ๋ฐฐํฌํ•ด์ฃผ๋Š” ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๋ฌผ๋ก  remix๋ฅผ ํ†ตํ•ด์„œ๋„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ truffle์€ ํ•„์š”๊ฐ€ ์—†๋‹ค.
ํ•˜์ง€๋งŒ ๋ฐฐํฌํ•  contract๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, ํ•œ ๋ฒˆ์— ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ truffle์ด ๋” ํŽธํ•˜๋‹ค.




๐Ÿ’ก Ready(์‚ฌ์ „์ž‘์—…)

Truffle ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ(truffle์ด npm์œผ๋กœ ์„ค์น˜๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.)
๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Truffle Sample Project๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

$ mkdir sample
$ cd sample
$ truffle init


๐Ÿ—‚๏ธ ํด๋”์„ค๋ช…

์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํด๋”๊ฐ€ ๋งŒ๋“ค์–ด์ง

  • contracts
    .sol ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ณณ์œผ๋กœ, solidity๋กœ ์ž‘์„ฑํ•œ codeํŒŒ์ผ์ด ๋“ค์–ด๊ฐ„๋‹ค.
  • migrations
    contracts์—์„œ ์ž‘์„ฑํ•œ solํŒŒ์ผ์„ js๋ชจ๋“ˆ๋กœ exportํ•ด์„œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ํด๋”๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ contractsํด๋”์˜ ํŒŒ์ผ๋“ค์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํด๋”๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • test
    ์ž‘์„ฑํ•œ contractsํด๋”์˜ ํŒŒ์ผ๋“ค์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ํด๋”๋‹ค.
    truffle-config.js
    ์ด ํŒŒ์ผ์—์„œ๋Š” ๋ฐฐํฌํ•  ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•œ๋‹ค.




๐Ÿค– Truffle Develop (Ethereum Server ์‹คํ–‰์‹œํ‚ค๊ธฐ)

์šฐ์„ , local์—์„œ ethereum blockchain network๋ฅผ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•œ๋‹ค.
Ganache์—์„œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.


$ truffle develop

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”(sample ํด๋”)์—์„œ ์‹คํ–‰ํ•˜๋ฉด 10๊ฐœ์˜ Accounts์™€ Private Keys ๊ฐ€ ๋ฆฌ์ŠคํŠธ์—… ๋˜๋ฉด์„œ truffle(develop)> ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.




๐ŸฆŠ Truffle๊ณผ Metamask ์—ฐ๋™(optional)

์œ„์˜ console์—์„œ ๋‚˜์˜ค๋Š” http://127.0.0.1:9545/์ฃผ์†Œ๋ฅผ ํ†ตํ•ด
Metamask์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜น์‹œ ๋ณธ์ธ ๋„คํŠธ์›Œํฌ์˜ networkID์™€ chainID๋ฅผ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด truffle console์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด๋ณด์ž

networkID

	await web3.eth.net.getId();

chainID

	await web3.eth.getChainId();



๐Ÿ’ช ์ง์ ‘ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‚ด์šฉ์„ ์ฑ„์›Œ๋ณด์ž

contracts/Sample.sol ์œ„์น˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑ

// SPDX-License-Identifier: GPL-3.0
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/1_deploy_sample.js ์œ„์น˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑ

var SimpleStorage = artifacts.require("SimpleStorage");

module.exports = function(deployer) {
  deployer.deploy(SimpleStorage);
};

migrationsํด๋”์— ํŒŒ์ผ ์ž‘์„ฑ์‹œ ์ฃผ์˜์‚ฌํ•ญ

์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํŒŒ์ผ๋ช…์ด ์•„๋‹Œ ์ปจํŠธ๋ž™ํŠธ๋ช…์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.(์œ„์—์„œ๋Š” SimpleStorage)
๋ฐฐํฌํŒŒ์ผ์„ ํ™•์ธํ•˜๋ฉด ํŒŒ์ผ๋ช… ์•ž์— ์ˆซ์ž๊ฐ€ ๋ถ™์–ด ์žˆ๋‹ค.
migrations ํด๋” ์•„๋ž˜์— ํฌํ•จ๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋ฐฐํฌ ์‹œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ์•ž์— ์ˆซ์ž๋ฅผ ๋ถ™์—ฌ ์ค€๋‹ค.




๐Ÿ“ƒ Test Contract ์ž‘์„ฑ

test/TestSimpleStorage.sol ์œ„์น˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑ

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Sample.sol";

contract TestSimpleStorage {
    function testSimpleStorage() public {
            SimpleStorage ss = new SimpleStorage();

            uint expected = 4;
            ss.set(expected);
            Assert.equal(ss.get(), expected, "value equal test");

    }
}

์ด์ œ ์ปดํŒŒ์ผ ํ›„ Ethereum Client(Truffle Develop)์— ๋ฐฐํฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊นŒ์ง€ ํ•ด๋ณด์ž.




๐Ÿ“ฆ Smart Contract Compile

truffle(develop)> compile

์œ„ ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”(์—ฌ๊ธฐ์„œ๋Š” sample์ด๋ผ๋Š” ์ด๋ฆ„)์— /build ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ contracts ํด๋” ์•„๋ž˜์— ์žˆ๋Š” solidity ํŒŒ์ผ์ด json ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ƒ์„ฑ๋œ๋‹ค.




โœˆ๏ธ Smart Contract Deploy

truffle(develop)> migrate

์œ„ ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ /build ํด๋”์— ์ƒ์„ฑ๋œ ํŒŒ์ผ(compile๋œ ํŒŒ์ผ๋“ค)์„ ์„œ๋ฒ„์— ๋ฐฐํฌ๊ฐ€ ๋œ๋‹ค.




๐Ÿงช Smart Contract Test

truffle(develop)> test

test๊ฐ€ ์ž˜ ์™„๋ฃŒ๋˜๋ฉด passing์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.




๐Ÿซ Ganache ์—ฐ๋™

truffle sample ํด๋”์˜ truffle-config.js์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ Ganache๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
truffle์—์„œ ์ž‘์„ฑํ•œ contract๋ฅผ Ganache ๋„คํŠธ์›Œํฌ์— ๋ฐฐํฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


truffle-config.js์˜ ํ•ด๋‹น๋ถ€๋ถ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค€๋‹ค.

module.exports = {
    networks: {
        development: {
            host: "127.0.0.1",
            port: 7545,
            network_id: "5777,
        },
    },
}

์ˆ˜์ • ํ›„ truffle networks์ ์–ด์คŒ์œผ๋กœ์จ network_id๊ฐ€ ์—ฐ๋™์ด ์ž˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
์•„์ด๋””๊ฐ€ ์œ„์—์„œ ์„ค์ •ํ•œ 5777์ด ๋‚˜์˜ค๋ฉด ์ •์ƒ์ด๋‹ค.

truffle(develop)> truffle networks

๋„คํŠธ์›Œํฌ๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋‹ˆ ๋‹ค์‹œ ๋ฐฐํฌํ•œ๋‹ค

truffle(develop)> truffle migrate

ํŠธ๋žœ์žญ์…˜์ด ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ์„ Ganache์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค







โ˜ ๏ธ
๊ธฐ๋ง.. ์ฃฝ์–ด๊ฐ„๋‹ค..

profile
Notorious

0๊ฐœ์˜ ๋Œ“๊ธ€