๐ŸŽฉ ํ•˜๋“œํ–‡์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”ํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฉ ํ•˜๋“œํ–‡์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”ํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ 'ํ•˜๋“œํ–‡์„ ์ด์šฉํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”'์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๊ธ€์„ ์ฝ๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ๋ถ„๋„ ์–ด๋Š์ƒˆ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ์˜ ๋‹ฌ์ธ์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Ž

๋จผ์ €, ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฐ ๋‚ด์šฉ์ด ์ข€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ธ์ •ํ•ด์•ผ ํ•ด์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๋งˆ์น˜ ์นœ๊ตฌ์™€ ์นดํ†ก์œผ๋กœ ์ˆ˜๋‹ค ๋– ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”. ใ…‹ใ…‹ใ…‹

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ ํ•˜๋“œํ–‡์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ์š”? ๐ŸŠโ€โ™‚๏ธ

๐ŸŽญ ํ•˜๋“œํ–‡์ด ๋ญ๊ธธ๋ž˜? ๐Ÿค”

์ž, ์—ฌ๋Ÿฌ๋ถ„! ํ•˜๋“œํ–‡์ด๋ผ๊ณ  ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์•„๋งˆ ๊ฑด์„ค ํ˜„์žฅ์—์„œ ์“ฐ๋Š” ๊ทธ ๋…ธ๋ž€ ๋ชจ์ž๋ฅผ ๋– ์˜ฌ๋ฆฌ์…จ์„ ์ˆ˜๋„ ์žˆ๊ฒ ์–ด์š”. ใ…‹ใ…‹ใ…‹ ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ์ด์•ผ๊ธฐํ•  ํ•˜๋“œํ–‡์€ ๊ทธ๊ฒŒ ์•„๋‹ˆ์—์š”!

ํ•˜๋“œํ–‡(Hardhat)์€ ์ด๋”๋ฆฌ์›€ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด์—์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋“ ๋“ ํ•œ ์นœ๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ . ๐Ÿ˜Š

ํ•˜๋“œํ–‡์˜ ์ฃผ์š” ํŠน์ง•:

  • ๋กœ์ปฌ ์ด๋”๋ฆฌ์›€ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
  • ์†”๋ฆฌ๋””ํ‹ฐ ์ปดํŒŒ์ผ ์ง€์›
  • ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ธฐ๋Šฅ
  • ๋””๋ฒ„๊น… ๋„๊ตฌ ์ œ๊ณต
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์œผ๋กœ ํ™•์žฅ์„ฑ ๋†’์Œ

ํ•˜๋“œํ–‡์€ ๋งˆ์น˜ ์Šค์œ„์Šค ๊ตฐ์šฉ ์นผ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์„œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐœ๋ฐœ์˜ ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ . ํŠนํžˆ ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘์ ์œผ๋กœ ๋ณผ 'ํ…Œ์ŠคํŠธ ์ž๋™ํ™”' ๊ธฐ๋Šฅ์€ ์ •๋ง ๋Œ€๋ฐ•์ด์—์š”! ๐Ÿ‘

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์—ฌ๋Ÿฌ๋ถ„. ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ์ด ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ ๊ด€๋ จ ์žฌ๋Šฅ๋„ ๊ฑฐ๋ž˜๋˜๊ณ  ์žˆ๋”๋ผ๊ณ ์š”. ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ๋ถ„์ด ํ•˜๋“œํ–‡ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๋ฉด ๊ฑฐ๊ธฐ์„œ ์žฌ๋Šฅ ๋‚˜๋ˆ”์„ ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ˜‰

ํ•˜๋“œํ–‡์˜ ์ฃผ์š” ๊ธฐ๋Šฅ Hardhat ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ปดํŒŒ์ผ ํ…Œ์ŠคํŠธ ๋””๋ฒ„๊น… ํ”Œ๋Ÿฌ๊ทธ์ธ

์ด์ œ ํ•˜๋“œํ–‡์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•˜๋“œํ–‡์„ ์ด์šฉํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ› ๏ธ ํ•˜๋“œํ–‡ ์„ค์น˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

์ž, ์ด์ œ ํ•˜๋“œํ–‡์„ ์„ค์น˜ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์–ด๋ ต์ง€ ์•Š์•„์š”! ๊ทธ๋ƒฅ ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์–ด๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋ผ์š”. ๋งˆ์น˜ ๊ฒŒ์ž„ ์น˜ํŠธํ‚ค ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ใ…‹ใ…‹ใ…‹

๋จผ์ €, Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ด์š”. ์—†๋‹ค๋ฉด Node.js ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋ฐ›์•„ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.

๊ทธ ๋‹ค์Œ, ํ„ฐ๋ฏธ๋„(๋งฅOS) ๋˜๋Š” ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(์œˆ๋„์šฐ)๋ฅผ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npm install --save-dev hardhat

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋“œํ–‡์ด ์„ค์น˜๋ผ์š”. ์‰ฝ์ฃ ? ๐Ÿ˜Ž

์ด์ œ ํ•˜๋“œํ–‡ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npx hardhat

๊ทธ๋Ÿฌ๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์ด ๋‚˜์˜ฌ ํ…๋ฐ, "Create a JavaScript project"๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ์งˆ๋ฌธ๋“ค์—๋Š” ๊ทธ๋ƒฅ ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ผ์š”.

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์ด์ œ ํ•˜๋“œํ–‡ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์–ด์š”!

ํ”„๋กœ์ ํŠธ ํด๋”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์ด ์ƒ๊ฒผ์„ ๊ฑฐ์˜ˆ์š”:

  • hardhat.config.js: ํ•˜๋“œํ–‡ ์„ค์ • ํŒŒ์ผ
  • contracts/: ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋  ํด๋”
  • scripts/: ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์ด ์ €์žฅ๋  ํด๋”
  • test/: ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋  ํด๋”

์ด์ œ ์šฐ๋ฆฌ๋Š” ํ•˜๋“œํ–‡์˜ ์„ธ๊ณ„์— ์ฒซ ๋ฐœ์„ ๋‚ด๋”›์—ˆ์–ด์š”! ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ์ด์ œ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์ด์—์š”. ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ •์„ ๋ฐฐ์›Œ๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿš€

ํ•˜๋“œํ–‡ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ Hardhat Project contracts/ scripts/ test/ hardhat.config.js

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ƒ

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ํ˜น์‹œ ์ด๋Ÿฐ ๊ฐœ๋ฐœ ์ง€์‹์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋‚˜๋ˆ„๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•˜๋“œํ–‡ ์ง€์‹์„ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ์ •๋ง ์†Œ์ค‘ํ•œ ์ •๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ก

๐Ÿ“ ์ฒซ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ž‘์„ฑํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์—„์ฒญ ๋ณต์žกํ•œ ๊ฑฐ ์•„๋‹ˆ์—์š”, ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ์ปจํŠธ๋ž™ํŠธ๋Š” ํ† ํฐ์„ ๋ฐœํ–‰ํ•˜๊ณ , ์ „์†กํ•˜๊ณ , ์ž”์•ก์„ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

๋จผ์ €, contracts ํด๋”์— SimpleToken.sol์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleToken {
    string public name;
    string public symbol;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;

    constructor(string memory _name, string memory _symbol, uint256 _totalSupply) {
        name = _name;
        symbol = _symbol;
        totalSupply = _totalSupply;
        balanceOf[msg.sender] = _totalSupply;
    }

    function transfer(address _to, uint256 _amount) public returns (bool success) {
        require(balanceOf[msg.sender] >= _amount, "Insufficient balance");
        balanceOf[msg.sender] -= _amount;
        balanceOf[_to] += _amount;
        return true;
    }
}

์šฐ์™€! ๐Ÿ˜ฒ ์ด๊ฒŒ ๋ญ”๊ฐ€ ์‹ถ์ฃ ? ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

SimpleToken ์ปจํŠธ๋ž™ํŠธ ์„ค๋ช…:

  • name: ํ† ํฐ์˜ ์ด๋ฆ„
  • symbol: ํ† ํฐ์˜ ์‹ฌ๋ณผ (์˜ˆ: BTC, ETH)
  • totalSupply: ์ด ๋ฐœํ–‰๋Ÿ‰
  • balanceOf: ๊ฐ ์ฃผ์†Œ์˜ ํ† ํฐ ์ž”์•ก์„ ์ €์žฅํ•˜๋Š” ๋งคํ•‘
  • constructor: ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ ์‹œ ์‹คํ–‰๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  • transfer: ํ† ํฐ์„ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ „์†กํ•˜๋Š” ํ•จ์ˆ˜

์ด ์ปจํŠธ๋ž™ํŠธ๋Š” ์ •๋ง ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ํ† ํฐ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ”๊ณ  ์žˆ์–ด์š”. ํ† ํฐ์˜ ์ด๋ฆ„๊ณผ ์‹ฌ๋ณผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๋ฐœํ–‰๋Ÿ‰์„ ์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ ์ „์†ก ๊ธฐ๋Šฅ๋„ ์žˆ์ฃ !

ํŠนํžˆ transfer ํ•จ์ˆ˜๋ฅผ ๋ณด์„ธ์š”. ์ด ํ•จ์ˆ˜๋Š” ํ† ํฐ์„ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•ด์š”. ๋จผ์ € ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ์˜ ์ž”์•ก์ด ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•˜๊ณ (require ๋ฌธ), ๊ทธ ๋‹ค์Œ์— ์ž”์•ก์„ ์ฐจ๊ฐํ•˜๊ณ  ๋ฐ›๋Š” ์‚ฌ๋žŒ์˜ ์ž”์•ก์„ ์ฆ๊ฐ€์‹œํ‚ค์ฃ . ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด์—์š”! ๐Ÿ‘

SimpleToken ์ปจํŠธ๋ž™ํŠธ ๊ตฌ์กฐ SimpleToken Contract name symbol totalSupply balanceOf constructor(name, symbol, totalSupply) transfer(to, amount)

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ์ด์ œ ์šฐ๋ฆฌ๋Š” ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”. ์ด ์ปจํŠธ๋ž™ํŠธ๋กœ ์šฐ๋ฆฌ๋งŒ์˜ ๊ฐ€์ƒํ™”ํ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹

ํ•˜์ง€๋งŒ ์ž ๊น! ๐Ÿค” ์ด ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ• ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ• ๊นŒ์š”? ์ด๋Ÿฐ ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ํ•˜๋“œํ–‡์˜ ์ง„๊ฐ€๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ฃ !

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด SimpleToken ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ํ•˜๋“œํ–‡์„ ์ด์šฉํ•ด์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ •๋ง ์‹ ๋‚˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๊ทธ๋ฆฌ๊ณ  ํ˜น์‹œ ์ด๋Ÿฐ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ ์žˆ๋Š” ์นœ๊ตฌ๋“ค ์žˆ๋‚˜์š”? ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹์„ ๋‚˜๋ˆ„๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ์ •๋ง ๊ฐ’์ง„ ์ •๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ก

๐Ÿงช ํ•˜๋“œํ–‡์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์ž, ์ด์ œ ์ง„์งœ ๊ฟ€์žผ ํŒŒํŠธ๊ฐ€ ์™”์–ด์š”! ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  SimpleToken ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ํ•˜๋“œํ–‡์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์ •๋ง ์‰ฌ์›Œ์š”. ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก ์กฐ๋ฆฝํ•˜๋“ฏ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ˜Ž

๋จผ์ €, test ํด๋”์— SimpleToken.test.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณผ๊ฒŒ์š”:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("SimpleToken", function () {
  let SimpleToken;
  let simpleToken;
  let owner;
  let addr1;
  let addr2;

  beforeEach(async function () {
    SimpleToken = await ethers.getContractFactory("SimpleToken");
    [owner, addr1, addr2] = await ethers.getSigners();
    simpleToken = await SimpleToken.deploy("Simple Token", "SIM", 1000000);
    await simpleToken.deployed();
  });

  it("Should set the right owner", async function () {
    expect(await simpleToken.owner()).to.equal(owner.address);
  });

  it("Should assign the total supply of tokens to the owner", async function () {
    const ownerBalance = await simpleToken.balanceOf(owner.address);
    expect(await simpleToken.totalSupply()).to.equal(ownerBalance);
  });

  it("Should transfer tokens between accounts", async function () {
    // Transfer 50 tokens from owner to addr1
    await simpleToken.transfer(addr1.address, 50);
    const addr1Balance = await simpleToken.balanceOf(addr1.address);
    expect(addr1Balance).to.equal(50);

    // Transfer 50 tokens from addr1 to addr2
    await simpleToken.connect(addr1).transfer(addr2.address, 50);
    const addr2Balance = await simpleToken.balanceOf(addr2.address);
    expect(addr2Balance).to.equal(50);
  });

  it("Should fail if sender doesn't have enough tokens", async function () {
    const initialOwnerBalance = await simpleToken.balanceOf(owner.address);

    // Try to send 1 token from addr1 (0 tokens) to owner (1000000 tokens).
    // `require` will evaluate false and revert the transaction.
    await expect(
      simpleToken.connect(addr1).transfer(owner.address, 1)
    ).to.be.revertedWith("Insufficient balance");

    // Owner balance shouldn't have changed.
    expect(await simpleToken.balanceOf(owner.address)).to.equal(
      initialOwnerBalance
    );
  });
});

์šฐ์™€! ์ด๊ฒŒ ๋ญ”๊ฐ€ ์‹ถ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๐Ÿ˜Š

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์„ค๋ช…:

  • describe: ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ์ •์˜ํ•ด์š”.
  • beforeEach: ๊ฐ ํ…Œ์ŠคํŠธ ์ „์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์˜ˆ์š”. ์—ฌ๊ธฐ์„œ๋Š” ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์žˆ์–ด์š”.
  • it: ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•ด์š”.
  • expect: ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์˜ˆ์š”.

์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ์˜ SimpleToken ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์–ด์š”. ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ ์‚ฌํ•ญ๋“ค์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์ฃ :

  1. ์ปจํŠธ๋ž™ํŠธ ์†Œ์œ ์ž๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€
  2. ์ด ๊ณต๊ธ‰๋Ÿ‰์ด ์†Œ์œ ์ž์—๊ฒŒ ํ• ๋‹น๋˜์—ˆ๋Š”์ง€
  3. ํ† ํฐ ์ „์†ก์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€
  4. ์ž”์•ก์ด ๋ถ€์กฑํ•  ๋•Œ ์ „์†ก์ด ์‹คํŒจํ•˜๋Š”์ง€

์ด์ œ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npx hardhat test

๊ทธ๋Ÿฌ๋ฉด ํ•˜๋“œํ–‡์ด ์šฐ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ๊ฑฐ์˜ˆ์š”. ๋งŒ์•ฝ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ–ˆ๋‹ค๋ฉด, ์ถ•ํ•˜ํ•ด์š”! ๐ŸŽ‰ ์šฐ๋ฆฌ์˜ SimpleToken ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋œป์ด์—์š”!

ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค Hardhat Test Process Write Test Run Test Analyze Results

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ์ด๋ ‡๊ฒŒ ํ•˜๋“œํ–‡์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ํ•„์š” ์—†์ด, ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์–ด๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ ํ•˜๋“œํ–‡์˜ ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด์—์š”! ๐Ÿ˜ƒ

์ด๋Ÿฐ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ •๋ง ์ค‘์š”ํ•ด์š”. ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์—ฌ์ „ํžˆ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์ด๋Š” ๋ฒ„๊ทธ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ์š”.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ด๋Ÿฐ ์ƒ๊ฐ ๋“ค์ง€ ์•Š๋‚˜์š”? "์™€, ์ด๋Ÿฐ ๊ฑธ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋„ ์•Œ๋ ค์ฃผ๊ณ  ์‹ถ๋‹ค!" ๊ทธ๋ ‡๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์„ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

๐Ÿš€ ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์˜ ์žฅ์ 

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํ•˜๋“œํ–‡์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์ค‘์š”ํ• ๊นŒ์š”? ํ•œ๋ฒˆ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿค”

ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์˜ ์ฃผ์š” ์žฅ์ :

  1. ์‹œ๊ฐ„ ์ ˆ์•ฝ: ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ๋Œ€๋น„ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„ ์ ˆ์•ฝ
  2. ์ผ๊ด€์„ฑ: ํ•ญ์ƒ ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  3. ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ฑ: ์–ธ์ œ๋“  ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ
  4. ์‹ ๋ขฐ์„ฑ: ์‚ฌ๋žŒ์˜ ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ์ œ๊ณต
  5. ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ: ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ฆ‰์‹œ ์˜ํ–ฅ ํ™•์ธ ๊ฐ€๋Šฅ

์ด๋Ÿฐ ์žฅ์ ๋“ค ๋•๋ถ„์— ํ•˜๋“œํ–‡์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋Š” ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜ ์š”์†Œ๊ฐ€ ๋˜์—ˆ์–ด์š”. ํŠนํžˆ ๋ธ”๋ก์ฒด์ธ์˜ ํŠน์„ฑ์ƒ ํ•œ๋ฒˆ ๋ฐฐํฌ๋œ ์ปจํŠธ๋ž™ํŠธ๋Š” ์ˆ˜์ •์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐํฌ ์ „ ์ฒ ์ €ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•˜์ฃ !

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  SimpleToken ์ปจํŠธ๋ž™ํŠธ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด๋ด์š”. ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ด์š”. ์—„์ฒญ ์‹œ๊ฐ„ ๋‚ญ๋น„์ฃ ! ๐Ÿ˜ซ

ํ•˜์ง€๋งŒ ํ•˜๋“œํ–‡์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ–ˆ๋‹ค๋ฉด? ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  npx hardhat test ๋ช…๋ น์–ด ํ•˜๋‚˜๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋! ๋ช‡ ์ดˆ ๋งŒ์— ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ๊ฐœ์ด๋“! ๐Ÿ‘

์ˆ˜๋™ ํ…Œ์ŠคํŠธ vs ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ์†Œ์š” ์ธ์  ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ ๋น ๋ฅธ ์‹คํ–‰ ๋†’์€ ์ •ํ™•๋„

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜! ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋Š” ํŒ€ ํ˜‘์—…์—๋„ ํฐ ๋„์›€์ด ๋ผ์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ, ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ๊ธฐ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์ด๋Ÿฐ ๊ฒŒ ๋ฐ”๋กœ "์•ˆ์ „๋ง" ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿ˜Ž

์ž, ์–ด๋– ์„ธ์š”? ํ•˜๋“œํ–‡์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์˜ ๋งค๋ ฅ์— ํ‘น ๋น ์ง€์…จ๋‚˜์š”? ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•˜๋“œํ–‡ ๋งˆ์Šคํ„ฐ์˜ ๊ธธ๋กœ ํ•œ ๋ฐœ์ง ๋‹ค๊ฐ€์„ฐ์–ด์š”! ๐Ÿ‘

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ด๋Ÿฐ ๋…ธํ•˜์šฐ๋Š” ์ •๋ง ๊ฐ’์ง„ ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ์ •๋ง ์†Œ์ค‘ํ•œ ์ •๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ก

๐ŸŽ“ ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์‹ฌํ™” ๊ณผ์ •

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํ•˜๋“œํ–‡์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ”๋ฉด ์•ˆ ๋ผ์š”! ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณผ๊นŒ์š”? ๐Ÿ˜ƒ

ํ•˜๋“œํ–‡์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์š”. ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”:

ํ•˜๋“œํ–‡์˜ ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ:

  1. ๊ฐ€์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
  2. ์‹œ๊ฐ„ ์กฐ์ž‘ (๋ธ”๋ก ํƒ€์ž„์Šคํƒฌํ”„ ๋ณ€๊ฒฝ)
  3. ๋„คํŠธ์›Œํฌ ํฌํฌ
  4. ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ถ„์„

์ด ์ค‘์—์„œ '๊ฐ€์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •'๊ณผ '์‹œ๊ฐ„ ์กฐ์ž‘'์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

1. ๊ฐ€์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •

์ด๋”๋ฆฌ์›€์—์„œ ๊ฐ€์Šค ๋น„์šฉ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”. ํ•˜๋“œํ–‡์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐ€์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ฃ :

it("Should use less than 50000 gas for transfer", async function () {
  const tx = await simpleToken.transfer(addr1.address, 50);
  const receipt = await tx.wait();
  expect(receipt.gasUsed).to.be.below(50000);
});

์ด ํ…Œ์ŠคํŠธ๋Š” transfer ํ•จ์ˆ˜๊ฐ€ 50,000 ๊ฐ€์Šค ์ดํ•˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด์š”. ๋งŒ์•ฝ ์ด ๊ฐ’์„ ๋„˜์–ด๊ฐ€๋ฉด ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์ฃ !

2. ์‹œ๊ฐ„ ์กฐ์ž‘

์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์—์„œ ์‹œ๊ฐ„์€ ์ค‘์š”ํ•œ ์š”์†Œ์˜ˆ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ† ํฐ ์ž ๊ธˆ ๊ธฐ๊ฐ„์ด๋‚˜ ์ด์ž ์ง€๊ธ‰ ์‹œ๊ธฐ ๋“ฑ์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์œ ์šฉํ•˜์ฃ . ํ•˜๋“œํ–‡์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”:

it("Should allow withdrawal after 1 week", async function () {
  await simpleToken.lock();
  await ethers.provider.send("evm_increaseTime", [7 * 24 * 60 * 60]); // 1์ฃผ์ผ ์ฆ๊ฐ€
  await ethers.provider.send("evm_mine"); // ์ƒˆ ๋ธ”๋ก ์ƒ์„ฑ
  await expect(simpleToken.unlock()).to.not.be.reverted;
});

์ด ํ…Œ์ŠคํŠธ๋Š” ํ† ํฐ ์ž ๊ธˆ ํ›„ 1์ฃผ์ผ์ด ์ง€๋‚˜๋ฉด ์ž ๊ธˆ ํ•ด์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด์š”. evm_increaseTime์œผ๋กœ ์‹œ๊ฐ„์„ ์•ž๋‹น๊ธฐ๊ณ , evm_mine์œผ๋กœ ์ƒˆ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋Š” ๊ฑฐ์ฃ .

ํ•˜๋“œํ–‡ ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ Hardhat Advanced Testing Gas Usage Measurement Time Manipulation Network Forking Code Coverage Analysis

์ด๋Ÿฐ ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋”์šฑ ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์ฃ . ์ด๋Š” ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ณ , ๋” ์•ˆ์ •์ ์ธ dApp์„ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ์š”.

์–ด๋– ์„ธ์š”? ํ•˜๋“œํ–‡์˜ ์„ธ๊ณ„๊ฐ€ ์ ์  ๋” ํฅ๋ฏธ์ง„์ง„ํ•ด์ง€๊ณ  ์žˆ์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฐ์šด ์ด ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ•๋“ค์€ ์ •๋ง ๊ฐ’์ง„ ์ง€์‹์ด์—์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์ด๋Ÿฐ ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜์ด ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์— ํฐ ํž˜์ด ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ’ช

๐Ÿ ๋งˆ๋ฌด๋ฆฌ: ํ•˜๋“œํ–‡์œผ๋กœ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ

์ž, ์—ฌ๋Ÿฌ๋ถ„! ์šฐ๋ฆฌ๋Š” ์ •๋ง ๋ฉ‹์ง„ ์—ฌ์ •์„ ํ•จ๊ป˜ ํ–ˆ์–ด์š”. ํ•˜๋“œํ–‡์„ ์ด์šฉํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์˜ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ–ˆ์ฃ . ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์›Œ ๋ณด์˜€์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋ฐฐ์›Œ๊ฐ€๋ฉด์„œ ์ ์  ๋” ์žฌ๋ฏธ์žˆ์–ด์กŒ์ฃ ? ๐Ÿ˜Š

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

ํ•˜๋“œํ–‡ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ •๋ฆฌ:

  1. ํ•˜๋“œํ–‡ ์„ค์น˜ ๋ฐ ํ”„๋กœ์ ํŠธ ์„ค์ •
  2. ๊ฐ„๋‹จํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ž‘์„ฑ
  3. ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  4. ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ
  5. ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ํ™œ์šฉ (๊ฐ€์Šค ์ธก์ •, ์‹œ๊ฐ„ ์กฐ์ž‘ ๋“ฑ)

์ด ๋ชจ๋“  ๊ณผ์ •์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋” ์•ˆ์ •์ ์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ด๋Š” ๊ณง ๋” ๋‚˜์€ dApp, ๋” ์•ˆ์ „ํ•œ ๋ธ”๋ก์ฒด์ธ ์ƒํƒœ๊ณ„๋กœ ์ด์–ด์ง€๋Š” ๊ฑฐ์ฃ !

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„, ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์—์š”. ๊ธฐ์ˆ ์˜ ์„ธ๊ณ„๋Š” ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”. ํ•˜๋“œํ–‡๋„ ๊ณ„์† ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์ฃ . ๊ทธ๋Ÿฌ๋‹ˆ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ์‹คํ—˜ํ•ด๋ณด๋Š” ์ž์„ธ๊ฐ€ ํ•„์š”ํ•ด์š”.

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฐ์šด ์ด ์ง€์‹๋“ค, ๊ฒฝํ—˜ํ•œ ์ด ๊ณผ์ •๋“ค์€ ์ •๋ง ์†Œ์ค‘ํ•ด์š”. ์ด๋ฅผ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ, ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋”์šฑ ํ’์š”๋กญ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธธ์ด์—์š”.

ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•˜๋“œํ–‡ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ์ •๋ง ๊ฐ’์ง„ ์ •๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘์€ ๋„์›€์ด ๋ˆ„๊ตฐ๊ฐ€์˜ ํฐ ๋„์•ฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ’ก

ํ•˜๋“œํ–‡ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๋Š” ๊ธธ Journey to Hardhat Mastery Learn Practice Share

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ํ•˜๋“œํ–‡ ๋งˆ์Šคํ„ฐ์˜ ๊ธธ์— ํ•œ ๋ฐœ์ง ๋” ๊ฐ€๊นŒ์›Œ์กŒ์–ด์š”. ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šฐ๊ณ , ์‹คํ—˜ํ•˜๊ณ , ๊ณต์œ ํ•˜๋ฉด์„œ ์„ฑ์žฅํ•ด ๋‚˜๊ฐ€์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฏธ๋ž˜๊ฐ€ ์ •๋ง ๊ธฐ๋Œ€๋ผ์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

๊ทธ๋Ÿผ ๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ๋งŒ๋‚˜์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์— ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธฐ๋ฅผ! ํ™”์ดํŒ…! ๐Ÿš€