Ver3.0 ๐ฏ ERC-20 ํ์ค์ด๋ ๋ฌด์์ธ๊ฐ: ์ด๋๋ฆฌ์ ํ ํฐ์ ๊ณตํต ์ธ์ด๋ฅผ ํํค์ณ๋ณด์!

๐ฏ ERC-20 ํ์ค์ด๋ ๋ฌด์์ธ๊ฐ: ์ด๋๋ฆฌ์ ํ ํฐ์ ๊ณตํต ์ธ์ด๋ฅผ ํํค์ณ๋ณด์!
๋ธ๋ก์ฒด์ธ ์ธ๊ณ์ ํ์ค ํ๋กํ ์ฝ, ERC-20์ ๋ชจ๋ ๊ฒ
์๋
! ๐ ์ค๋์ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐ๋์ ์์์ผ ํ ERC-20 ํ์ค์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ ๊ฑฐ์ผ. ํน์ ์ํธํํ ๊ฑฐ๋์์์ ํ ํฐ์ ์ ์กํด๋ณธ ์ ์์ด? ๊ทธ๋ ์ฌ์ฉํ ํ ํฐ ๋๋ถ๋ถ์ด ๋ฐ๋ก ERC-20 ํ์ค์ ๋ฐ๋ฅด๊ณ ์์ ํ๋ฅ ์ด ๋์! ๐ช
์ด๋๋ฆฌ์ ์ํ๊ณ์์ ERC-20์ ๋ง์น USB ๊ท๊ฒฉ์ฒ๋ผ ๋ชจ๋ ํ ํฐ์ด ๋ฐ๋ผ์ผ ํ๋ ๊ณตํต ๊ท์น์ด์ผ. ์ด ํ์ค ๋๋ถ์ ์์ฒ ๊ฐ์ ํ ํฐ์ด ์ง๊ฐ, ๊ฑฐ๋์, DApp์์ ๋ฌธ์ ์์ด ์๋ํ ์ ์์ง. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ๋ธ๋ก์ฒด์ธ ๊ด๋ จ ์ฌ๋ฅ์ ๊ฑฐ๋ํ ๋ ์ด๋ฐ ๊ธฐ์ ์ ์ดํด๊ฐ ํฐ ๋์์ด ๋๊ณค ํด! ๐
๐ ERC-20, ๋๋์ฒด ๋ญ๊ธธ๋?
ERC-20์ "Ethereum Request for Comment 20"์ ์ฝ์์ผ. 2015๋
11์, ํ๋น์ ๋ณด๊ฒ์คํ
๋ฌ(Fabian Vogelsteller)๋ผ๋ ๊ฐ๋ฐ์๊ฐ ์ ์ํ ์ด๋๋ฆฌ์ ๊ฐ์ ์ ์์(EIP-20)์์ ์์๋์ด. ๐
์ฝ๊ฒ ๋งํ๋ฉด, ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ ์์์ ํ ํฐ์ ๋ง๋ค ๋ ์ง์ผ์ผ ํ ๊ณตํต ๊ท์น์ง์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ. ๋ง์น ๋ชจ๋ ์ค๋งํธํฐ ์ถฉ์ ๊ธฐ๊ฐ USB-C ๊ท๊ฒฉ์ ๋ฐ๋ฅด๋ฉด ์ด๋ค ๊ธฐ๊ธฐ๋ ์ถฉ์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ, ERC-20 ํ์ค์ ๋ฐ๋ฅด๋ฉด ๋ชจ๋ ์ด๋๋ฆฌ์ ์ง๊ฐ๊ณผ ๊ฑฐ๋์์์ ํ ํฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ง! ๐
๐ ์ ํ์ค์ด ํ์ํ์๊น?
์ด๊ธฐ ์ด๋๋ฆฌ์ ์ํ๊ณ์์๋ ๊ฐ ํ๋ก์ ํธ๊ฐ ์๊ธฐ๋ง์ ๋ฐฉ์์ผ๋ก ํ ํฐ์ ๋ง๋ค์์ด. ๊ทธ๋ฌ๋ค ๋ณด๋ ๋ฌธ์ ๊ฐ ์๊ฒผ์ง:
โข ์ง๊ฐ ๊ฐ๋ฐ์๋ค์ด ๊ฐ ํ ํฐ๋ง๋ค ๋ณ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ด ๐ฐ
โข ๊ฑฐ๋์์์ ์ ํ ํฐ์ ์์ฅํ ๋๋ง๋ค ํตํฉ ์์
์ด ๋ณต์กํ์ด
โข ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ ์ํธ์์ฉ์ด ์ด๋ ค์ ์ด
โข ๋ณด์ ์ทจ์ฝ์ ์ด ํ ํฐ๋ง๋ค ๋ฌ๋ผ์ ๊ฐ์ฌ๊ฐ ํ๋ค์์ด
ERC-20 ํ์ค์ด ๋ฑ์ฅํ๋ฉด์ ์ด ๋ชจ๋ ๋ฌธ์ ๊ฐ ํ ๋ฐฉ์ ํด๊ฒฐ๋์ด! ๐
๐ ERC-20์ ํต์ฌ ํจ์๋ค
ERC-20 ํ์ค์ ์ด 6๊ฐ์ ํ์ ํจ์์ 3๊ฐ์ ์ ํ์ ํจ์๋ก ๊ตฌ์ฑ๋์ด ์์ด. ๊ฐ๊ฐ์ ์ญํ ์ ์น๊ตฌ์๊ฒ ์ค๋ช ํ๋ฏ ์ฝ๊ฒ ํ์ด๋ณผ๊ฒ! ๐
๐ง ํ์ ํจ์ 6๊ฐ (Must-Have)
1๏ธโฃ totalSupply()
์ญํ : ํ ํฐ์ ์ด ๋ฐํ๋์ ์๋ ค์ค
์ด ํจ์๋ ํด๋น ํ ํฐ์ด ์ด ๋ช ๊ฐ๋ ์กด์ฌํ๋์ง ์๋ ค์ฃผ๋ ๊ฑฐ์ผ. ์๋ฅผ ๋ค์ด, ์ด๋ค ํ ํฐ์ ์ด ๋ฐํ๋์ด 1์ต ๊ฐ๋ผ๋ฉด ์ด ํจ์๋ฅผ ํธ์ถํ๋ฉด 100,000,000์ ๋ฐํํ์ง! ๐ฐ
function totalSupply() public view returns (uint256)
2๏ธโฃ balanceOf(address account)
์ญํ : ํน์ ์ฃผ์๊ฐ ๊ฐ์ง ํ ํฐ ์์ก์ ํ์ธํด
๋ด ์ง๊ฐ์ ํ ํฐ์ด ์ผ๋ง๋ ์๋์ง ๊ถ๊ธํ ๋ ์ฌ์ฉํ๋ ํจ์์ผ. ์ฃผ์๋ฅผ ์
๋ ฅํ๋ฉด ๊ทธ ์ฃผ์๊ฐ ๋ณด์ ํ ํ ํฐ ๊ฐ์๋ฅผ ์๋ ค์ค. ์ํ ๊ณ์ข ์์ก ์กฐํ์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ผ! ๐ฆ
function balanceOf(address account) public view returns (uint256)
3๏ธโฃ transfer(address recipient, uint256 amount)
์ญํ : ํ ํฐ์ ๋ค๋ฅธ ์ฃผ์๋ก ์ ์กํด
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ก๊ธ ๊ธฐ๋ฅ์ด์ผ! ์น๊ตฌ์๊ฒ ํ ํฐ์ ๋ณด๋ด๊ณ ์ถ์ ๋ ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ง. ๋ฐ๋ ์ฌ๋์ ์ฃผ์์ ๋ณด๋ผ ๊ธ์ก์ ์
๋ ฅํ๋ฉด ๋! ์ฑ๊ณตํ๋ฉด true๋ฅผ ๋ฐํํด. ๐ค
function transfer(address recipient, uint256 amount) public returns (bool)
4๏ธโฃ allowance(address owner, address spender)
์ญํ : ์น์ธ๋ ์ง์ถ ํ๋๋ฅผ ํ์ธํด
A๊ฐ B์๊ฒ ์์ ์ ํ ํฐ์ ๋์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฝํ ๊ธ์ก์ ํ์ธํ๋ ํจ์์ผ. ์๋ฅผ ๋ค์ด, ๋ด๊ฐ ๊ฑฐ๋์์ 100๊ฐ ํ ํฐ๊น์ง ์ฌ์ฉ ๊ถํ์ ์คฌ๋ค๋ฉด, ์ด ํจ์๋ก ๊ทธ ํ๋๋ฅผ ํ์ธํ ์ ์์ด. ๐
function allowance(address owner, address spender) public view returns (uint256)
5๏ธโฃ approve(address spender, uint256 amount)
์ญํ : ๋ค๋ฅธ ์ฃผ์์๊ฒ ํ ํฐ ์ฌ์ฉ ๊ถํ์ ๋ถ์ฌํด
์ด๊ฑด ์ข ํน๋ณํ ํจ์์ผ! ๋ค๋ฅธ ์ค๋งํธ ์ปจํธ๋ํธ๋ ์ฃผ์๊ฐ ๋ด ํ ํฐ์ ๋์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฝํ๋ ๊ฑฐ์ง. DeFi ํ๋กํ ์ฝ์ ์ฌ์ฉํ ๋ ์์ฃผ ๋ณด๊ฒ ๋ ๊ฑฐ์ผ. ์น์ธ ํ์๋ ๋ฐ๋์ Approval ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด! โ
function approve(address spender, uint256 amount) public returns (bool)
6๏ธโฃ transferFrom(address sender, address recipient, uint256 amount)
์ญํ : ์น์ธ๋ฐ์ ํ ํฐ์ ๋์ ์ ์กํด
approve๋ก ๊ถํ์ ๋ฐ์ ํ ์ฌ์ฉํ๋ ํจ์์ผ. A๊ฐ B์๊ฒ ๊ถํ์ ์คฌ๋ค๋ฉด, B๋ ์ด ํจ์๋ฅผ ์ฌ์ฉํด์ A์ ํ ํฐ์ C์๊ฒ ๋ณด๋ผ ์ ์์ด. DEX(ํ์ค์ํ ๊ฑฐ๋์)์์ ํ ํฐ ์ค์ํ ๋ ํต์ฌ์ ์ผ๋ก ์ฌ์ฉ๋์ง! ๐
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool)
๐จ ์ ํ์ ํจ์ 3๊ฐ (Nice-to-Have)
๐ก ์ฐธ๊ณ : ์ด ํจ์๋ค์ ํ์๋ ์๋์ง๋ง, ๋๋ถ๋ถ์ ERC-20 ํ ํฐ์ด ๊ตฌํํ๊ณ ์์ด. ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๊ฑฐ๋ !
๐ท๏ธ name()
ํ ํฐ์ ์ด๋ฆ์ ๋ฐํํด. ์: "Ethereum", "Chainlink" ๊ฐ์ ๊ฑฐ!
function name() public view returns (string)
๐ค symbol()
ํ ํฐ์ ์ฌ๋ณผ(ํฐ์ปค)์ ๋ฐํํด. ์: "ETH", "LINK" ๊ฐ์ ์งง์ ์ฝ์!
function symbol() public view returns (string)
๐ข decimals()
ํ ํฐ์ ์์์ ์๋ฆฟ์๋ฅผ ๋ฐํํด. ๋๋ถ๋ถ 18์ ์ฌ์ฉํ์ง๋ง, USDC๋ 6์ ์ฌ์ฉํด. ์ด๊ฑด ํ ํฐ์ ์ผ๋ง๋ ์๊ฒ ์ชผ๊ฐค ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฑฐ์ผ!
function decimals() public view returns (uint8)
๐ฏ ERC-20 ํ ํฐ์ ์๋ ์๋ฆฌ
์ด์ ERC-20 ํ ํฐ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ดํด๋ณผ๊ฒ! ๐ฌ
๐ ํ ํฐ ์์ก ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ
ERC-20 ํ ํฐ์ ๋งคํ(mapping)์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ ๊ฐ ์ฃผ์์ ์์ก์ ๊ด๋ฆฌํด. ์ฝ๊ฒ ๋งํ๋ฉด, ๊ฑฐ๋ํ ์ฅ๋ถ์ "์ด ์ฃผ์๋ 100๊ฐ, ์ ์ฃผ์๋ 50๊ฐ" ์ด๋ฐ ์์ผ๋ก ๊ธฐ๋กํ๋ ๊ฑฐ์ง! ๐
์ค์ ์ฝ๋๋ก ๋ณด๋ฉด ์ด๋ ๊ฒ ์๊ฒผ์ด:
mapping(address => uint256) private _balances;
์ด ํ ์ค์ด ๋ชจ๋ ์ฌ์ฉ์์ ํ ํฐ ์์ก์ ๊ด๋ฆฌํ๋ ํต์ฌ์ด์ผ! ๋ธ๋ก์ฒด์ธ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ ํจ๋ถ๋ก ๋ฐ๊ฟ ์ ์์ง. ๐
๐ ํ ํฐ ์ ์ก ํ๋ก์ธ์ค
ํ ํฐ์ ์ ์กํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๋ณผ๊น? ์๋ฅผ ๋ค์ด, Alice๊ฐ Bob์๊ฒ 100๊ฐ ํ ํฐ์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํด๋ณด์:
Step 1: Alice๊ฐ transfer ํจ์ ํธ์ถ ๐
token.transfer(bobAddress, 100)
Step 2: ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ Alice์ ์์ก ํ์ธ โ
โข Alice ์์ก์ด 100๊ฐ ์ด์์ธ๊ฐ? โ OK!
โข 100๊ฐ ๋ฏธ๋ง์ด๋ฉด? โ ํธ๋์ญ์
์คํจ! โ
Step 3: ์์ก ์
๋ฐ์ดํธ ๐ฑ
โข Alice ์์ก: 500 โ 400 (100 ์ฐจ๊ฐ)
โข Bob ์์ก: 200 โ 300 (100 ์ถ๊ฐ)
Step 4: Transfer ์ด๋ฒคํธ ๋ฐ์ ๐ข
emit Transfer(alice, bob, 100)
Step 5: ๋ธ๋ก์ฒด์ธ์ ์๊ตฌ ๊ธฐ๋ก โ๏ธ
๐ซ Approve & TransferFrom ํจํด
์ด๊ฑด ERC-20์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋์ผ! DeFi ์ํ๊ณ์ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์์ง. ์ค์ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ๋ณด์:
๐ ์ค์ ์์: Uniswap์์ ํ ํฐ ์ค์ํ๊ธฐ
์ํฉ: Alice๊ฐ Uniswap์์ 100 DAI๋ฅผ ETH๋ก ๊ตํํ๊ณ ์ถ์ด.
1๋จ๊ณ - Approve:
Alice๊ฐ ๋จผ์ DAI ์ปจํธ๋ํธ์ ์น์ธ์ ํด์ค์ผ ํด:
daiToken.approve(uniswapAddress, 100)
โ "Uniswap์, ๋ด DAI 100๊ฐ๊น์ง ์ฌ์ฉํด๋ ๋ผ!" ๐ค
2๋จ๊ณ - Swap ์คํ:
Alice๊ฐ Uniswap์ swap ํจ์๋ฅผ ํธ์ถํด:
uniswap.swap(daiAddress, ethAddress, 100)
3๋จ๊ณ - TransferFrom:
Uniswap ์ปจํธ๋ํธ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์คํ:
daiToken.transferFrom(alice, uniswapPool, 100)
โ Alice์ DAI๊ฐ Uniswap ํ๋ก ์ด๋! ๐ธ
4๋จ๊ณ - ETH ์ ์ก:
Uniswap์ด Alice์๊ฒ ํด๋นํ๋ ETH๋ฅผ ๋ณด๋ด์ค! ๐
โ ๏ธ ๋ณด์ ์ฃผ์์ฌํญ:
approve ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ์ ๋ขฐํ ์ ์๋ ์ปจํธ๋ํธ์๋ง ๊ถํ์ ์ค์ผ ํด! ์
์์ ์ธ ์ปจํธ๋ํธ์ approveํ๋ฉด ํ ํฐ์ ๋ชจ๋ ์์ ์ ์๊ฑฐ๋ . ์ฌ์ฉ ํ์๋ allowance๋ฅผ 0์ผ๋ก ์ฌ์ค์ ํ๋ ๊ฒ๋ ์ข์ ์ต๊ด์ด์ผ! ๐ก๏ธ
๐ป ์ค์ ERC-20 ์ค๋งํธ ์ปจํธ๋ํธ ์ฝ๋
์ด๋ก ๋ง ๋ฐฐ์ฐ๋ฉด ์ฌ๋ฏธ์์ง! ์ค์ ๋ก ERC-20 ํ ํฐ์ ๋ง๋๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์. Solidity๋ก ์์ฑ๋ ๊ธฐ๋ณธ์ ์ธ ERC-20 ์ปจํธ๋ํธ์ผ. ๐ ๏ธ
๐ ๊ธฐ๋ณธ ERC-20 ๊ตฌํ ์์
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MyToken {
// ํ ํฐ ๊ธฐ๋ณธ ์ ๋ณด
string public name = "My Awesome Token";
string public symbol = "MAT";
uint8 public decimals = 18;
uint256 private _totalSupply;
// ์์ก ์ ์ฅ ๋งคํ
mapping(address => uint256) private _balances;
// ์น์ธ ์ ์ฅ ๋งคํ (owner => spender => amount)
mapping(address => mapping(address => uint256)) private _allowances;
// ์ด๋ฒคํธ ์ ์
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
// ์์ฑ์: ์ด๊ธฐ ๊ณต๊ธ๋ ์ค์
constructor(uint256 initialSupply) {
_totalSupply = initialSupply * 10**decimals;
_balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
}
// ์ด ๊ณต๊ธ๋ ๋ฐํ
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
// ํน์ ์ฃผ์์ ์์ก ๋ฐํ
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
// ํ ํฐ ์ ์ก
function transfer(address recipient, uint256 amount) public returns (bool) {
require(recipient != address(0), "์ ์ก ๋ถ๊ฐ: 0 ์ฃผ์");
require(_balances[msg.sender] >= amount, "์์ก ๋ถ์กฑ");
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
// ์น์ธ๋ ๊ธ์ก ํ์ธ
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
// ์ง์ถ ์น์ธ
function approve(address spender, uint256 amount) public returns (bool) {
require(spender != address(0), "์น์ธ ๋ถ๊ฐ: 0 ์ฃผ์");
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
// ์น์ธ๋ ํ ํฐ ์ ์ก
function transferFrom(address sender, address recipient, uint256 amount)
public returns (bool) {
require(sender != address(0), "์ ์ก ๋ถ๊ฐ: 0 ์ฃผ์");
require(recipient != address(0), "์ ์ก ๋ถ๊ฐ: 0 ์ฃผ์");
require(_balances[sender] >= amount, "์์ก ๋ถ์กฑ");
require(_allowances[sender][msg.sender] >= amount, "์น์ธ ํ๋ ์ด๊ณผ");
_balances[sender] -= amount;
_balances[recipient] += amount;
_allowances[sender][msg.sender] -= amount;
emit Transfer(sender, recipient, amount);
return true;
}
}
๐ก ์ฝ๋ ์ค๋ช
:
โข ๋งคํ ๊ตฌ์กฐ: _balances๋ ๊ฐ ์ฃผ์์ ์์ก์, _allowances๋ ์น์ธ ๊ด๊ณ๋ฅผ ์ ์ฅํด
โข require ๋ฌธ: ์กฐ๊ฑด์ ๊ฒ์ฆํ๊ณ , ์คํจํ๋ฉด ํธ๋์ญ์
์ ๋๋๋ ค(revert)
โข ์ด๋ฒคํธ: Transfer์ Approval ์ด๋ฒคํธ๋ก ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํด
โข decimals: 18๋ก ์ค์ ํ๋ฉด 1 ํ ํฐ = 10^18 ์ต์ ๋จ์๊ฐ ๋ผ
๐ฅ OpenZeppelin์ ํ์ฉํ ์์ ํ ๊ตฌํ
์ค์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ง์ ๊ตฌํํ๊ธฐ๋ณด๋ค OpenZeppelin ๊ฐ์ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ํจ์ฌ ์์ ํด! ์ด๋ฏธ ์๋ง์ ๊ฐ์ฌ๋ฅผ ๊ฑฐ์ณค๊ณ , ๋ณด์ ์ทจ์ฝ์ ์ด ํจ์น๋์ด ์๊ฑฐ๋ . ๐ก๏ธ
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MySecureToken is ERC20, Ownable {
constructor(uint256 initialSupply) ERC20("My Secure Token", "MST") {
_mint(msg.sender, initialSupply * 10**decimals());
}
// ์์ ์๋ง ์ถ๊ฐ ๋ฐํ ๊ฐ๋ฅ
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
// ํ ํฐ ์๊ฐ ๊ธฐ๋ฅ
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
}
์ด๋ ๊ฒ ํ๋ฉด ๋จ ๋ช ์ค๋ก ์์ ํ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํ ERC-20 ํ ํฐ์ ๋ง๋ค ์ ์์ด! OpenZeppelin์ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ ์ ๊ณตํด:
โข Pausable: ๊ธด๊ธ ์ํฉ ์ ํ ํฐ ์ ์ก ์ผ์ ์ค์ง โธ๏ธ
โข Burnable: ํ ํฐ ์๊ฐ ๊ธฐ๋ฅ ๐ฅ
โข Snapshot: ํน์ ์์ ์ ์์ก ๊ธฐ๋ก ๐ธ
โข Permit: ๊ฐ์ค๋น ์๋ ์น์ธ(EIP-2612) โฝ
๐ ERC-20 ํ ํฐ์ ์ค์ ํ์ฉ ์ฌ๋ก
ERC-20 ํ์ค์ ๋จ์ํ ๊ธฐ์ ๋ช ์ธ๊ฐ ์๋์ผ. ์ค์ ๋ก ์์ญ์ต ๋ฌ๋ฌ ๊ท๋ชจ์ ์ํ๊ณ๋ฅผ ์งํฑํ๊ณ ์์ง! ๋ํ์ ์ธ ํ์ฉ ์ฌ๋ก๋ค์ ์ดํด๋ณด์. ๐
๐ฐ ์ฃผ์ ERC-20 ํ ํฐ๋ค
| ํ ํฐ | ์ฌ๋ณผ | ์ฉ๋ | ์๊ฐ์ด์ก ์์ |
|---|---|---|---|
| Tether | USDT | ์คํ ์ด๋ธ์ฝ์ธ (1 USDT = 1 USD) | Top 3 |
| USD Coin | USDC | ๊ท์ ์ค์ ์คํ ์ด๋ธ์ฝ์ธ | Top 10 |
| Chainlink | LINK | ์ค๋ผํด ๋คํธ์ํฌ ํ ํฐ | Top 20 |
| Uniswap | UNI | DEX ๊ฑฐ๋ฒ๋์ค ํ ํฐ | Top 30 |
| Shiba Inu | SHIB | ๋ฐ ์ฝ์ธ | Top 20 |
๐ฏ ์นดํ ๊ณ ๋ฆฌ๋ณ ํ์ฉ
1. ์คํ ์ด๋ธ์ฝ์ธ (Stablecoins) ๐ต
๊ฐ๊ฒฉ ๋ณ๋์ฑ์ ์ต์ํํ ํ ํฐ๋ค์ด์ผ. ๋ฒ์ ํํ๋ ์์ฐ์ ํ๊น
๋์ด ์์ด์ ๊ฒฐ์ ์๋จ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋ผ.
์์:
โข USDT, USDC: ๋ฌ๋ฌ ํ๊น
โข DAI: ์ํธํํ ๋ด๋ณด ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ ์คํ
์ด๋ธ์ฝ์ธ
โข PAXG: ๊ธ ๊ฐ๊ฒฉ์ ์ฐ๋
ํ์ฉ: ๊ตญ์ ์ก๊ธ, DeFi ๊ฑฐ๋, ๊ฐ์น ์ ์ฅ ๐ฐ
2. ๊ฑฐ๋ฒ๋์ค ํ ํฐ (Governance Tokens) ๐ณ๏ธ
ํ๋กํ ์ฝ์ ์์ฌ๊ฒฐ์ ์ ์ฐธ์ฌํ ์ ์๋ ํฌํ๊ถ์ ์ ๊ณตํ๋ ํ ํฐ์ด์ผ.
์์:
โข UNI (Uniswap): DEX ์์๋ฃ์จ, ์ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฑ ํฌํ
โข AAVE: ๋์ถ ํ๋กํ ์ฝ ํ๋ผ๋ฏธํฐ ์กฐ์
โข COMP (Compound): ์ด์์จ ๋ชจ๋ธ ๋ณ๊ฒฝ ๊ฒฐ์
ํ์ฉ: ํ์ค์ํ ์กฐ์ง(DAO) ์ด์, ํ๋กํ ์ฝ ์
๊ทธ๋ ์ด๋ ๊ฒฐ์ ๐๏ธ
3. ์ ํธ๋ฆฌํฐ ํ ํฐ (Utility Tokens) ๐ง
ํน์ ํ๋ซํผ์ด๋ ์๋น์ค ๋ด์์ ์ฌ์ฉ๋๋ ํ ํฐ์ด์ผ.
์์:
โข LINK: Chainlink ์ค๋ผํด ์๋น์ค ์ด์ฉ๋ฃ
โข BAT: Brave ๋ธ๋ผ์ฐ์ ๊ด๊ณ ๋ณด์
โข MANA: Decentraland ๊ฐ์์ธ๊ณ ๋ด ๊ฑฐ๋
ํ์ฉ: ์๋น์ค ์ด์ฉ๋ฃ ๊ฒฐ์ , ์ํ๊ณ ์ธ์ผํฐ๋ธ ๐ฎ
4. ์ฆ๊ถํ ํ ํฐ (Security Tokens) ๐
์ค์ ์์ฐ์ ์์ ๊ถ์ ๋ํ๋ด๋ ํ ํฐ์ด์ผ. ๊ท์ ๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
์์:
โข ๋ถ๋์ฐ ์ง๋ถ ํ ํฐํ
โข ๊ธฐ์
์ฃผ์ ํ ํฐ
โข ์ฑ๊ถ ํ ํฐ
ํ์ฉ: ์์ฐ์ ์ ๋์ฑ ์ฆ๊ฐ, ์์ก ํฌ์ ๊ฐ๋ฅ ๐ข
5. ๋ฆฌ์๋ ํ ํฐ (Reward Tokens) ๐
์ฌ์ฉ์ ํ๋์ ๋ํ ๋ณด์์ผ๋ก ์ง๊ธ๋๋ ํ ํฐ์ด์ผ.
์์:
โข ์ ๋์ฑ ๊ณต๊ธ ๋ณด์ (Liquidity Mining)
โข ์คํ
์ดํน ๋ณด์
โข ํ๋ ์ดํฌ์ธ(P2E) ๊ฒ์ ๋ณด์
ํ์ฉ: ์ฌ์ฉ์ ์ฐธ์ฌ ์ ๋, ๋คํธ์ํฌ ํจ๊ณผ ์ฆ๋ ๐
๐ฅ DeFi์์์ ERC-20 ํ์ฉ
์ค์ ์๋๋ฆฌ์ค: DeFi ์์ต ๋์ฌ(Yield Farming)
1๏ธโฃ ์ ๋์ฑ ๊ณต๊ธ:
Alice๊ฐ Uniswap์ ETH-USDC ํ์ด๋ก ์ ๋์ฑ์ ๊ณต๊ธํด. ์ด๋ ๋ ํ ํฐ ๋ชจ๋ ERC-20 ํ์ค์ ๋ฐ๋ผ์ approve โ transferFrom ํจํด์ผ๋ก ์ค๋งํธ ์ปจํธ๋ํธ์ ์์น๋ผ.
2๏ธโฃ LP ํ ํฐ ์๋ น:
์ ๋์ฑ ๊ณต๊ธ์ ์ฆ๊ฑฐ๋ก LP(Liquidity Provider) ํ ํฐ์ ๋ฐ์. ์ด๊ฒ๋ ERC-20์ด์ผ! ๋์ค์ ์ด ํ ํฐ์ ๋ฐํํ๋ฉด ์๊ธ๊ณผ ์์๋ฃ๋ฅผ ๋๋ ค๋ฐ์ ์ ์์ง.
3๏ธโฃ ์คํ
์ดํน:
๋ฐ์ LP ํ ํฐ์ ๋ค์ ๋ค๋ฅธ ํ๋กํ ์ฝ์ ์คํ
์ดํนํด์ ์ถ๊ฐ ๋ณด์์ ๋ฐ์. ์ด๊ฒ๋ ERC-20 approve ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด!
4๏ธโฃ ๋ณด์ ์๋ น:
๊ฑฐ๋ฒ๋์ค ํ ํฐ์ด๋ ๋ฆฌ์๋ ํ ํฐ์ ERC-20 ํํ๋ก ๋ฐ์. ์ด๊ฑธ ๋ค์ ์ค์ํ๊ฑฐ๋ ์ฌํฌ์ํ ์ ์์ด.
์ด ๋ชจ๋ ๊ณผ์ ์ด ERC-20 ํ์ค ๋๋ถ์ ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐ๋ผ! ๐ฏ
โ ๏ธ ERC-20์ ํ๊ณ์ ๋ฌธ์ ์
ERC-20์ด ์๋ฒฝํ ๊ฑด ์๋์ผ. ์ค์ ๋ก ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ด. ์ด๊ฑธ ์์์ผ ๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ง! ๐
๐จ ์ฃผ์ ๋ฌธ์ ์ ๋ค
1. ํ ํฐ ์์ค ๋ฌธ์ (Lost Tokens) ๐ธ
๋ฌธ์ ์ํฉ:
์ฌ์ฉ์๊ฐ ์ค์๋ก ํ ํฐ์ ์ค๋งํธ ์ปจํธ๋ํธ ์ฃผ์๋ก ์ง์ ์ ์กํ๋ฉด ์๊ตฌ์ ์ผ๋ก ์์ด๋ฒ๋ ค! ๐ฑ
์ ๋ฐ์ํ๋?
ERC-20์ transfer ํจ์๋ ๋ฐ๋ ์ฃผ์๊ฐ ์ปจํธ๋ํธ์ธ์ง ์ผ๋ฐ ์ฃผ์์ธ์ง ๊ตฌ๋ถํ์ง ๋ชปํด. ์ปจํธ๋ํธ๊ฐ ํ ํฐ์ ๋ฐ์ ์ค๋น๊ฐ ์ ๋์ด ์์ผ๋ฉด ๊ทธ๋ฅ ๊ฐํ๋ฒ๋ฆฌ๋ ๊ฑฐ์ง.
์ค์ ํผํด ๊ท๋ชจ:
์๋ฐฑ๋ง ๋ฌ๋ฌ ์๋น์ ํ ํฐ์ด ์ด๋ฐ ์์ผ๋ก ์์ค๋์ด. ํนํ ์ด๋ณด์๋ค์ด ๋ง์ด ๋นํ๋ ์ค์์ผ. ๐ข
ํด๊ฒฐ์ฑ
:
ERC-223, ERC-777 ๊ฐ์ ๊ฐ์ ๋ ํ์ค์ด ๋์์ง๋ง, ERC-20์ ๋คํธ์ํฌ ํจ๊ณผ ๋๋ฌธ์ ๋๋ฆฌ ์ฑํ๋์ง๋ ๋ชปํ์ด.
2. Approve ๊ณต๊ฒฉ ๋ฒกํฐ ๐ฏ
๋ฌธ์ ์ํฉ:
approve ํจ์์ ๋ณด์ ์ทจ์ฝ์ ์ด ์์ด. ํนํ ์น์ธ ๊ธ์ก์ ๋ณ๊ฒฝํ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด!
๊ณต๊ฒฉ ์๋๋ฆฌ์ค:
1. Alice๊ฐ Bob์๊ฒ 100 ํ ํฐ ์น์ธ
2. Alice๊ฐ ์น์ธ์ 50์ผ๋ก ์ค์ด๋ ค๊ณ ํธ๋์ญ์
์ ์ก
3. Bob์ด ์ด๊ฑธ ๊ฐ์งํ๊ณ ๋จผ์ 100 ํ ํฐ์ ์ฌ์ฉ
4. Alice์ ํธ๋์ญ์
์ด ์ฒ๋ฆฌ๋์ด ๋ค์ 50 ์น์ธ
5. Bob์ด ๋ 50 ํ ํฐ ์ฌ์ฉ โ ์ด 150 ํ ํฐ ์ฌ์ฉ! ๐
ํด๊ฒฐ์ฑ
:
โข ์น์ธ์ ๋ณ๊ฒฝํ ๋๋ ๋จผ์ 0์ผ๋ก ์ค์ ํ ํ ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
โข increaseAllowance, decreaseAllowance ํจ์ ์ฌ์ฉ (OpenZeppelin)
โข EIP-2612 (Permit) ์ฌ์ฉ
3. ๊ฐ์ค๋น ๋ฌธ์ โฝ
๋ฌธ์ ์ํฉ:
ํ ํฐ์ ์ฌ์ฉํ๋ ค๋ฉด ํญ์ ETH๊ฐ ํ์ํด. approve + transferFrom ํจํด์ ๋ ๋ฒ์ ํธ๋์ญ์
์ด ํ์ํด์ ๊ฐ์ค๋น๊ฐ ๋ ๋ฐฐ์ผ!
์ค์ ์ํฅ:
โข ๋คํธ์ํฌ ํผ์ก ์ ์์ญ ๋ฌ๋ฌ์ ๊ฐ์ค๋น
โข ์์ก ๊ฑฐ๋๊ฐ ๋น๊ฒฝ์ ์
โข ์ ๊ท ์ฌ์ฉ์ ์ง์
์ฅ๋ฒฝ
ํด๊ฒฐ์ฑ
:
โข Layer 2 ์๋ฃจ์
(Polygon, Arbitrum, Optimism)
โข ๊ฐ์ค ํ ํฐ ์ฌ์ฉ
โข ๋ฉํ ํธ๋์ญ์
(Gasless Transaction)
4. ์ด๋ฒคํธ ํ์คํ ๋ถ์กฑ ๐ข
๋ฌธ์ ์ํฉ:
Transfer์ Approval ์ด๋ฒคํธ๋ง ํ์คํ๋์ด ์๊ณ , ๋ค๋ฅธ ์ค์ํ ์ด๋ฒคํธ๋ค์ ๊ฐ์ ๊ตฌํํด์ผ ํด.
์ค์ ๋ฌธ์ :
โข Mint, Burn ์ด๋ฒคํธ๊ฐ ํ์คํ๋์ง ์์
โข ์คํ์ฒด์ธ ์ธ๋ฑ์ฑ์ด ์ด๋ ค์
โข ํ๋ก ํธ์๋ ํตํฉ ๋ณต์ก๋ ์ฆ๊ฐ
๐ก๏ธ ๋ณด์ ๋ฒ ์คํธ ํ๋ํฐ์ค
ERC-20 ํ ํฐ์ ์์ ํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ํ๋ค์ด์ผ! ๊ฐ๋ฐ์๋ ์ฌ์ฉ์๋ ๊ผญ ์์๋ฌ์ผ ํด. ๐ก
๊ฐ๋ฐ์๋ฅผ ์ํ ํ:
1๏ธโฃ OpenZeppelin ์ฌ์ฉ:
์ง์ ๊ตฌํํ์ง ๋ง๊ณ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด! ์๋ง์ ๊ฐ์ฌ๋ฅผ ๊ฑฐ์ณค๊ณ ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ๋ผ.
2๏ธโฃ SafeMath ์ฌ์ฉ:
Solidity 0.8.0 ์ด์ ๋ฒ์ ์์๋ ํ์! ์ค๋ฒํ๋ก์ฐ/์ธ๋ํ๋ก์ฐ ๋ฐฉ์ง.
3๏ธโฃ Reentrancy Guard:
์ธ๋ถ ํธ์ถ์ด ์๋ ํจ์์๋ ๋ฐ๋์ ์ฌ์ง์
๊ณต๊ฒฉ ๋ฐฉ์ด ์ฝ๋๋ฅผ ๋ฃ์ด.
4๏ธโฃ ์ ๋ฌธ ๊ฐ์ฌ ๋ฐ๊ธฐ:
๋ฉ์ธ๋ท ๋ฐฐํฌ ์ ์ CertiK, OpenZeppelin, Trail of Bits ๊ฐ์ ์ ๋ฌธ ์
์ฒด์ ๊ฐ์ฌ๋ฅผ ๋ฐ์.
5๏ธโฃ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 100%:
๋ชจ๋ ํจ์์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ํ
์คํธํด. Hardhat, Foundry ๊ฐ์ ํ๋ ์์ํฌ ํ์ฉ!
์ฌ์ฉ์๋ฅผ ์ํ ํ:
1๏ธโฃ ์ฃผ์ ํ์ธ:
ํ ํฐ ์ ์ก ์ ์ ๋ฐ๋ ์ฃผ์๋ฅผ ์ธ ๋ฒ ํ์ธํด! ๋ธ๋ก์ฒด์ธ์ ๋๋๋ฆด ์ ์์ด. โ ๏ธ
2๏ธโฃ Approve ์ต์ํ:
ํ์ํ ๋งํผ๋ง ์น์ธํ๊ณ , ์ฌ์ฉ ํ์๋ ์ทจ์ํด. ๋ฌดํ ์น์ธ์ ์ํํด!
3๏ธโฃ ํผ์ฑ ์ฃผ์:
๊ฐ์ง ํ ํฐ ์ปจํธ๋ํธ ์ฃผ์๋ฅผ ์กฐ์ฌํด. ๊ณต์ ์น์ฌ์ดํธ์์ ํ์ธํ๊ณ , Etherscan์์ ๊ฒ์ฆ๋ ์ปจํธ๋ํธ์ธ์ง ์ฒดํฌ!
4๏ธโฃ ํ๋์จ์ด ์ง๊ฐ ์ฌ์ฉ:
ํฐ ๊ธ์ก์ Ledger, Trezor ๊ฐ์ ํ๋์จ์ด ์ง๊ฐ์ ๋ณด๊ดํด. ๐
5๏ธโฃ ํ
์คํธ๋ท ๋จผ์ :
์๋ก์ด DApp์ ์ฌ์ฉํ ๋๋ ํ
์คํธ๋ท์์ ๋จผ์ ์๋ํด๋ด!
๐ ERC-20์ ๋ฐ์ : ๊ฐ์ ๋ ํ์ค๋ค
ERC-20์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ ๋ ํ์ค๋ค์ด ์ ์๋์ด. ๊ฐ๊ฐ์ ํน์ง์ ์ดํด๋ณด์! ๐ฌ
๐ ERC-20 vs ๊ฐ์ ํ์ค ๋น๊ต
| ํ์ค | ์ฃผ์ ๊ฐ์ ์ฌํญ | ์ฅ์ | ๋จ์ |
|---|---|---|---|
| ERC-223 | ์ปจํธ๋ํธ๋ก ์ ์ก ์ ํ ํฐ ์์ค ๋ฐฉ์ง | ์์ ํ ์ ์ก, ๊ฐ์ค๋น ์ ๊ฐ | ๋ฎ์ ์ฑํ๋ฅ , ํธํ์ฑ ๋ฌธ์ |
| ERC-777 | ํ (Hook) ๋ฉ์ปค๋์ฆ, ์คํผ๋ ์ดํฐ ๊ฐ๋ | ์ ์ฐ์ฑ ์ฆ๊ฐ, ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ | ๋ณต์ก๋ ์ฆ๊ฐ, ์ฌ์ง์ ๊ณต๊ฒฉ ์ํ |
| ERC-1155 | ๋ค์ค ํ ํฐ ํ์ค (FT + NFT) | ๊ฐ์ค ํจ์จ์ , ๋ฐฐ์น ์ ์ก | ์ฃผ๋ก ๊ฒ์/NFT์ฉ, ๋ณต์กํ ๊ตฌ์กฐ |
| EIP-2612 | Permit ํจ์ (๊ฐ์ค๋ฆฌ์ค ์น์ธ) | ๊ฐ์ค๋น ์ ๊ฐ, UX ๊ฐ์ | ์ถ๊ฐ ๊ตฌํ ํ์, ์๋ช ๋ณต์ก๋ |
๐ฎ ERC-777: ์ฐจ์ธ๋ ํ ํฐ ํ์ค
ERC-777์ ERC-20์ ์์ ํธํ ํ์ค์ด์ผ. ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ชจ๋ ํฌํจํ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง! ๐ฏ
ํต์ฌ ๊ธฐ๋ฅ:
1๏ธโฃ ํ
(Hook) ๋ฉ์ปค๋์ฆ:
ํ ํฐ์ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ ๋ ์๋์ผ๋ก ํน์ ํจ์๊ฐ ์คํ๋ผ. ์ด๋ฅผ ํตํด ํ ํฐ ์ ์ก ์ ์ถ๊ฐ ๋ก์ง์ ์คํํ ์ ์์ด!
2๏ธโฃ ์คํผ๋ ์ดํฐ(Operator):
approve/transferFrom ๋์ ๋ ์ ์ฐํ ๊ถํ ๊ด๋ฆฌ ์์คํ
. ์ฌ๋ฌ ์ฃผ์์ ๋์์ ๊ถํ์ ์ค ์ ์์ด.
3๏ธโฃ ํ ํฐ ์์ค ๋ฐฉ์ง:
์ปจํธ๋ํธ๊ฐ ํ ํฐ์ ๋ฐ์ ์ค๋น๊ฐ ์ ๋์ด ์์ผ๋ฉด ์ ์ก์ด ์คํจํด. ERC-20์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง!
4๏ธโฃ ํ์ ํธํ์ฑ:
ERC-20 ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ๊ตฌํํด์ ๊ธฐ์กด ์ธํ๋ผ์ ํธํ๋ผ.
// ERC-777 ํ
์์
function tokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
) external {
// ํ ํฐ์ ๋ฐ์์ ๋ ์๋์ผ๋ก ์คํ๋๋ ๋ก์ง
// ์: ์๋ ์คํ
์ดํน, ๋ฆฌ์๋ ๋ถ๋ฐฐ ๋ฑ
}
โ ๏ธ ์ฃผ์: ERC-777์ ๊ฐ๋ ฅํ์ง๋ง ์ฌ์ง์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ด. ํ ํจ์์์ ์ธ๋ถ ํธ์ถ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด์ผ. ๋ฐ๋์ Checks-Effects-Interactions ํจํด์ ๋ฐ๋ฅด๊ณ , ReentrancyGuard๋ฅผ ์ฌ์ฉํด์ผ ํด!
โก EIP-2612: Permit (๊ฐ์ค๋ฆฌ์ค ์น์ธ)
EIP-2612๋ ERC-20์ permit ํจ์๋ฅผ ์ถ๊ฐํ ํ์ฅ์ด์ผ. ์ด๊ฒ ์ ํ๋ช
์ ์ด๋๋ฉด... ๐
๊ธฐ์กด ๋ฐฉ์์ ๋ฌธ์ :
1. approve ํธ๋์ญ์
์ ์ก (๊ฐ์ค๋น ์ง๋ถ) ๐ธ
2. ์ค์ ์ฌ์ฉ ํธ๋์ญ์
์ ์ก (๊ฐ์ค๋น ๋ ์ง๋ถ) ๐ธ
โ ์ด 2๋ฒ์ ํธ๋์ญ์
, 2๋ฐฐ์ ๊ฐ์ค๋น!
Permit ๋ฐฉ์:
1. ์คํ์ฒด์ธ์์ ์๋ช
์์ฑ (๊ฐ์ค๋น 0์!) โจ
2. ์๋ช
๊ณผ ํจ๊ป ์ค์ ์ฌ์ฉ ํธ๋์ญ์
์ ์ก (๊ฐ์ค๋น 1๋ฒ๋ง!) ๐ธ
โ 1๋ฒ์ ํธ๋์ญ์
์ผ๋ก ๋!
์ค์ ์ฝ๋:
// Permit ํจ์ ์๊ทธ๋์ฒ
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
// ์ฌ์ฉ ์์ (JavaScript)
const signature = await signer._signTypedData(domain, types, value);
const { v, r, s } = ethers.utils.splitSignature(signature);
await token.permit(owner, spender, amount, deadline, v, r, s);
await dapp.doSomething(); // ์ด์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ!
์ฑํ ํํฉ:
โข USDC, DAI, USDT ๋ฑ ์ฃผ์ ์คํ
์ด๋ธ์ฝ์ธ์ด ์ง์
โข Uniswap V2/V3, Aave, Compound ๋ฑ DeFi ํ๋กํ ์ฝ ํตํฉ
โข ์ ๊ท ํ ํฐ๋ค์ ๋๋ถ๋ถ ๊ธฐ๋ณธ์ผ๋ก ํฌํจ
์ฌ๋ฅ๋ท์์ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ์ฌ๋ฅ์ ๊ฑฐ๋ํ ๋๋ ์ด๋ฐ ์ต์ ๊ธฐ์ ์ ์๋ ๊ฒ ํฐ ๊ฐ์ ์ด ๋ ๊ฑฐ์ผ! ๐ช
๐ ๏ธ ERC-20 ํ ํฐ ๊ฐ๋ฐ ์ค์ ๊ฐ์ด๋
์ด์ ์ง์ ERC-20 ํ ํฐ์ ๋ง๋ค์ด๋ณด์! ์ฒ์๋ถํฐ ๋๊น์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ ๊ฒ. ๐
๐ง ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
1๋จ๊ณ: ํ์ ๋๊ตฌ ์ค์น
# Node.js ์ค์น ํ์ธ
node --version # v16 ์ด์ ๊ถ์ฅ
# Hardhat ํ๋ก์ ํธ ์ด๊ธฐํ
mkdir my-token-project
cd my-token-project
npm init -y
npm install --save-dev hardhat
# Hardhat ์ด๊ธฐํ
npx hardhat
# OpenZeppelin ์ค์น
npm install @openzeppelin/contracts
# ๊ธฐํ ์ ์ฉํ ํจํค์ง
npm install --save-dev @nomiclabs/hardhat-ethers ethers
npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai
๐ก Tip: Hardhat ๋์ Foundry๋ฅผ ์ฌ์ฉํ ์๋ ์์ด. Foundry๋ Rust๋ก ์์ฑ๋์ด ํจ์ฌ ๋น ๋ฅด๊ณ , Solidity๋ก ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ด!
2๋จ๊ณ: ์ค๋งํธ ์ปจํธ๋ํธ ์์ฑ
contracts/MyToken.sol ํ์ผ์ ๋ง๋ค์ด๋ณด์:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyAwesomeToken is ERC20, ERC20Burnable, ERC20Permit, Ownable {
// ์ต๋ ๊ณต๊ธ๋ ์ค์ (1์ต ๊ฐ)
uint256 public constant MAX_SUPPLY = 100_000_000 * 10**18;
constructor()
ERC20("My Awesome Token", "MAT")
ERC20Permit("My Awesome Token")
{
// ์ด๊ธฐ ๊ณต๊ธ๋ 1์ฒ๋ง ๊ฐ๋ฅผ ๋ฐฐํฌ์์๊ฒ ๋ฏผํ
_mint(msg.sender, 10_000_000 * 10**decimals());
}
/**
* @dev ์์ ์๋ง ์ถ๊ฐ ๋ฐํ ๊ฐ๋ฅ (์ต๋ ๊ณต๊ธ๋๊น์ง)
*/
function mint(address to, uint256 amount) public onlyOwner {
require(totalSupply() + amount <= MAX_SUPPLY, "์ต๋ ๊ณต๊ธ๋ ์ด๊ณผ");
_mint(to, amount);
}
/**
* @dev ๊ธด๊ธ ์ํฉ ์ ํน์ ์ฃผ์์ ํ ํฐ ์๊ฐ (์์ ์๋ง)
*/
function burnFrom(address account, uint256 amount) public override onlyOwner {
_burn(account, amount);
}
/**
* @dev ์์ด๋๋ ๊ธฐ๋ฅ: ์ฌ๋ฌ ์ฃผ์์ ํ ๋ฒ์ ์ ์ก
*/
function airdrop(address[] calldata recipients, uint256[] calldata amounts)
external onlyOwner {
require(recipients.length == amounts.length, "๋ฐฐ์ด ๊ธธ์ด ๋ถ์ผ์น");
for (uint256 i = 0; i < recipients.length; i++) {
_transfer(msg.sender, recipients[i], amounts[i]);
}
}
}
์ฝ๋ ์ค๋ช
:
โข ERC20Burnable: ํ ํฐ ์๊ฐ ๊ธฐ๋ฅ
โข ERC20Permit: ๊ฐ์ค๋ฆฌ์ค ์น์ธ ๊ธฐ๋ฅ
โข Ownable: ์์ ์ ๊ถํ ๊ด๋ฆฌ
โข MAX_SUPPLY: ์ธํ๋ ์ด์
๋ฐฉ์ง๋ฅผ ์ํ ์ต๋ ๊ณต๊ธ๋
โข airdrop: ๋ง์ผํ
์ฉ ๋๋ ์ ์ก ๊ธฐ๋ฅ
3๋จ๊ณ: ํ ์คํธ ์์ฑ
test/MyToken.test.js ํ์ผ:
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("MyAwesomeToken", function () {
let token;
let owner;
let addr1;
let addr2;
beforeEach(async function () {
[owner, addr1, addr2] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyAwesomeToken");
token = await Token.deploy();
await token.deployed();
});
describe("๋ฐฐํฌ", function () {
it("์ฌ๋ฐ๋ฅธ ์ด๋ฆ๊ณผ ์ฌ๋ณผ์ ๊ฐ์ ธ์ผ ํจ", async function () {
expect(await token.name()).to.equal("My Awesome Token");
expect(await token.symbol()).to.equal("MAT");
});
it("์ด๊ธฐ ๊ณต๊ธ๋์ด ๋ฐฐํฌ์์๊ฒ ํ ๋น๋์ด์ผ ํจ", async function () {
const ownerBalance = await token.balanceOf(owner.address);
expect(await token.totalSupply()).to.equal(ownerBalance);
});
});
describe("ํธ๋์ญ์
", function () {
it("ํ ํฐ์ ์ ์กํ ์ ์์ด์ผ ํจ", async function () {
await token.transfer(addr1.address, 50);
expect(await token.balanceOf(addr1.address)).to.equal(50);
});
it("์์ก์ด ๋ถ์กฑํ๋ฉด ์คํจํด์ผ ํจ", async function () {
const initialBalance = await token.balanceOf(owner.address);
await expect(
token.connect(addr1).transfer(owner.address, 1)
).to.be.revertedWith("ERC20: transfer amount exceeds balance");
});
it("approve์ transferFrom์ด ์๋ํด์ผ ํจ", async function () {
await token.approve(addr1.address, 100);
await token.connect(addr1).transferFrom(owner.address, addr2.address, 50);
expect(await token.balanceOf(addr2.address)).to.equal(50);
expect(await token.allowance(owner.address, addr1.address)).to.equal(50);
});
});
describe("๋ฏผํ
", function () {
it("์์ ์๋ง ๋ฏผํ
ํ ์ ์์ด์ผ ํจ", async function () {
await expect(
token.connect(addr1).mint(addr1.address, 1000)
).to.be.revertedWith("Ownable: caller is not the owner");
});
it("์ต๋ ๊ณต๊ธ๋์ ์ด๊ณผํ ์ ์์ด์ผ ํจ", async function () {
const maxSupply = await token.MAX_SUPPLY();
const currentSupply = await token.totalSupply();
const remaining = maxSupply.sub(currentSupply);
await expect(
token.mint(addr1.address, remaining.add(1))
).to.be.revertedWith("์ต๋ ๊ณต๊ธ๋ ์ด๊ณผ");
});
});
describe("์์ด๋๋", function () {
it("์ฌ๋ฌ ์ฃผ์์ ๋์ ์ ์กํ ์ ์์ด์ผ ํจ", async function () {
const recipients = [addr1.address, addr2.address];
const amounts = [100, 200];
await token.airdrop(recipients, amounts);
expect(await token.balanceOf(addr1.address)).to.equal(100);
expect(await token.balanceOf(addr2.address)).to.equal(200);
});
});
});
ํ ์คํธ ์คํ:
npx hardhat test
๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผํ๋ฉด ์ด๋ก๋ถ! โ
4๋จ๊ณ: ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
scripts/deploy.js ํ์ผ:
const hre = require("hardhat");
async function main() {
console.log("ํ ํฐ ๋ฐฐํฌ ์์...");
// ์ปจํธ๋ํธ ๊ฐ์ ธ์ค๊ธฐ
const Token = await hre.ethers.getContractFactory("MyAwesomeToken");
// ๋ฐฐํฌ
const token = await Token.deploy();
await token.deployed();
console.log(`ํ ํฐ์ด ๋ฐฐํฌ๋์์ต๋๋ค: ${token.address}`);
// ์ด๊ธฐ ์ ๋ณด ์ถ๋ ฅ
const name = await token.name();
const symbol = await token.symbol();
const totalSupply = await token.totalSupply();
const decimals = await token.decimals();
console.log(`์ด๋ฆ: ${name}`);
console.log(`์ฌ๋ณผ: ${symbol}`);
console.log(`์ด ๊ณต๊ธ๋: ${ethers.utils.formatUnits(totalSupply, decimals)}`);
console.log(`์์์ : ${decimals}`);
// Etherscan ๊ฒ์ฆ์ ์ํ ๋๊ธฐ
console.log("Etherscan ๊ฒ์ฆ์ ์ํด 30์ด ๋๊ธฐ...");
await new Promise(resolve => setTimeout(resolve, 30000));
// ์๋ ๊ฒ์ฆ
try {
await hre.run("verify:verify", {
address: token.address,
constructorArguments: [],
});
console.log("Etherscan ๊ฒ์ฆ ์๋ฃ!");
} catch (error) {
console.log("๊ฒ์ฆ ์คํจ:", error.message);
}
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
5๋จ๊ณ: ๋คํธ์ํฌ ์ค์ ๋ฐ ๋ฐฐํฌ
hardhat.config.js ํ์ผ ์์ :
require("@nomiclabs/hardhat-waffle");
require("@nomiclabs/hardhat-etherscan");
require("dotenv").config();
module.exports = {
solidity: {
version: "0.8.20",
settings: {
optimizer: {
enabled: true,
runs: 200
}
}
},
networks: {
// ํ
์คํธ๋ท (Sepolia)
sepolia: {
url: process.env.SEPOLIA_RPC_URL,
accounts: [process.env.PRIVATE_KEY],
chainId: 11155111
},
// ๋ฉ์ธ๋ท
mainnet: {
url: process.env.MAINNET_RPC_URL,
accounts: [process.env.PRIVATE_KEY],
chainId: 1
},
// Polygon
polygon: {
url: process.env.POLYGON_RPC_URL,
accounts: [process.env.PRIVATE_KEY],
chainId: 137
}
},
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY
}
};
.env ํ์ผ ์์ฑ:
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_INFURA_KEY
MAINNET_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY
POLYGON_RPC_URL=https://polygon-rpc.com
PRIVATE_KEY=your_private_key_here
ETHERSCAN_API_KEY=your_etherscan_api_key
โ ๏ธ ๋ณด์ ์ฃผ์:
โข .env ํ์ผ์ ์ ๋ Git์ ์ปค๋ฐํ์ง ๋ง! .gitignore์ ์ถ๊ฐํด์ผ ํด
โข ํ๋ผ์ด๋น ํค๋ ํ
์คํธ์ฉ ๊ณ์ ๋ง ์ฌ์ฉํด
โข ๋ฉ์ธ๋ท ๋ฐฐํฌ ์ ์๋ ํ๋์จ์ด ์ง๊ฐ ์ฌ์ฉ ๊ถ์ฅ
๋ฐฐํฌ ์คํ:
# ํ
์คํธ๋ท ๋ฐฐํฌ
npx hardhat run scripts/deploy.js --network sepolia
# ๋ฉ์ธ๋ท ๋ฐฐํฌ (์ ์คํ๊ฒ!)
npx hardhat run scripts/deploy.js --network mainnet
๐ ๊ฐ์ค ์ต์ ํ ํ
๐ฐ ๊ฐ์ค๋น๋ฅผ ์ค์ด๋ ์ค์ ํ
ํฌ๋:
1๏ธโฃ ๋ณ์ ํจํน:
uint256 ๋์ uint128, uint64 ๋ฑ ์์ ํ์
์ฌ์ฉ. ๊ฐ์ ์ฌ๋กฏ์ ์ฌ๋ฌ ๋ณ์๋ฅผ ํจํนํ๋ฉด SLOAD ๋น์ฉ ์ ๊ฐ!
2๏ธโฃ Immutable & Constant:
๋ณํ์ง ์๋ ๊ฐ์ immutable์ด๋ constant๋ก ์ ์ธ. ์คํ ๋ฆฌ์ง ๋์ ๋ฐ์ดํธ์ฝ๋์ ์ ์ฅ๋ผ!
3๏ธโฃ Short-circuit ํ๊ฐ:
์กฐ๊ฑด๋ฌธ์์ ๊ฐ๋ฒผ์ด ๊ฒ์ฌ๋ฅผ ๋จผ์ ๋ฐฐ์น. && ์ฐ์ฐ์๋ ์ฒซ ๋ฒ์งธ๊ฐ false๋ฉด ๋ ๋ฒ์งธ๋ฅผ ํ๊ฐํ์ง ์์.
4๏ธโฃ ๋ฐฐ์น ์์
:
์ฌ๋ฌ ์ ์ก์ ํ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌ. ์์ด๋๋ ํจ์๊ฐ ์ข์ ์์!
5๏ธโฃ ์ด๋ฒคํธ ํ์ฉ:
์คํ ๋ฆฌ์ง ๋์ ์ด๋ฒคํธ๋ก ๋ฐ์ดํฐ ๊ธฐ๋ก. ํจ์ฌ ์ ๋ ดํด!
6๏ธโฃ Unchecked ๋ธ๋ก:
์ค๋ฒํ๋ก์ฐ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ unchecked ์ฌ์ฉ. Solidity 0.8.0+์์ ์ ์ฉ!
// ์ต์ ํ ์์
function optimizedTransfer(address[] calldata recipients, uint256 amount) external {
uint256 length = recipients.length; // ์บ์ฑ
unchecked {
for (uint256 i = 0; i < length; ++i) { // ++i๊ฐ i++๋ณด๋ค ์ ๋ ด
_transfer(msg.sender, recipients[i], amount);
}
}
}
๐ ERC-20 ์ํ๊ณ์ ๋ฏธ๋
ERC-20์ ๋จ์ํ ๊ธฐ์ ํ์ค์ ๋์ด ๊ฑฐ๋ํ ๊ฒฝ์ ์ํ๊ณ๋ฅผ ๋ง๋ค์ด๋์ด. ์์ผ๋ก์ ์ ๋ง์ ์ดํด๋ณด์! ๐ฎ
๐ ํ์ฌ ์ํ๊ณ ๊ท๋ชจ
๋๋ผ์ด ํต๊ณ๋ค:
โข 50๋ง ๊ฐ ์ด์์ ERC-20 ํ ํฐ์ด ์กด์ฌํด ๐
โข ์์ 100๊ฐ ํ ํฐ์ ์๊ฐ์ด์ก: ์์ฒ์ต ๋ฌ๋ฌ ๐ฐ
โข ์ผ์ผ ๊ฑฐ๋๋: ์๋ฐฑ์ต ๋ฌ๋ฌ ๐
โข DeFi TVL(Total Value Locked): $50B+ ๐ฆ
โข ํ์ฑ ์ง๊ฐ ์ฃผ์: ์์ฒ๋ง ๊ฐ ๐ฅ
์ด ๋ชจ๋ ๊ฒ ํ๋์ ํ์ค ์์์ ์๋ํ๊ณ ์๋ค๋ ๊ฒ ๋๋์ง ์์? ๐คฏ
๐ฎ ๋ฏธ๋ ํธ๋ ๋
1. Layer 2 ํตํฉ ๐
์ด๋๋ฆฌ์ ๋ฉ์ธ๋ท์ ๋์ ๊ฐ์ค๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Layer 2 ์๋ฃจ์
์ด ๊ธ์ฑ์ฅํ๊ณ ์์ด:
โข Optimistic Rollups: Optimism, Arbitrum
โข ZK Rollups: zkSync, StarkNet
โข Sidechains: Polygon, Gnosis Chain
์ด๋ค์ ๋ชจ๋ ERC-20 ํ์ค์ ์ง์ํ๋ฉด์ ๊ฑฐ๋ ๋น์ฉ์ 1/100 ์ดํ๋ก ์ค์ฌ! ๐ธ
2. ํฌ๋ก์ค์ฒด์ธ ๋ธ๋ฆฟ์ง ๐
์๋ก ๋ค๋ฅธ ๋ธ๋ก์ฒด์ธ ๊ฐ ํ ํฐ ์ด๋์ด ์ ์ ์ฌ์์ง๊ณ ์์ด:
โข Wrapped Tokens: WBTC (๋นํธ์ฝ์ธ์ ERC-20์ผ๋ก)
โข Bridge Protocols: Multichain, Synapse, Hop
โข Interoperability: Cosmos IBC, Polkadot XCM
๋ฏธ๋์๋ ์ด๋ค ์ฒด์ธ์ ์๋ ํ ํฐ์ ์์ ๋กญ๊ฒ ์ด๋ํ ์ ์์ ๊ฑฐ์ผ! ๐
3. ์ค๋ฌผ ์์ฐ ํ ํฐํ (RWA) ๐
ํ์ค ์ธ๊ณ์ ์์ฐ์ ERC-20 ํ ํฐ์ผ๋ก ๋ง๋๋ ํธ๋ ๋:
โข ๋ถ๋์ฐ: ๊ฑด๋ฌผ ์ง๋ถ์ ํ ํฐ์ผ๋ก ๋ถํ ์์
โข ์ฑ๊ถ: ๊ตญ์ฑ, ํ์ฌ์ฑ๋ฅผ ๋ธ๋ก์ฒด์ธ์์ ๊ฑฐ๋
โข ์์์ฌ: ๊ธ, ์, ์์ ๋ฑ์ ํ ํฐํ
โข ํ์ ๋ฐฐ์ถ๊ถ: ํ๊ฒฝ ์์ฐ์ ๋์งํธํ
์ ํต ๊ธ์ต๊ณผ DeFi์ ๊ฒฝ๊ณ๊ฐ ํ๋ฌผ์ด์ง๊ณ ์์ด! ๐ฆโก๏ธโ๏ธ
4. AI์์ ์ตํฉ ๐ค
์ธ๊ณต์ง๋ฅ๊ณผ ๋ธ๋ก์ฒด์ธ์ ๊ฒฐํฉ์ด ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด๊ณ ์์ด:
โข AI ์์ด์ ํธ: ์๋์ผ๋ก ํ ํฐ์ ๊ฑฐ๋ํ๋ ๋ด
โข ์์ธก ์์ฅ: AI ๊ธฐ๋ฐ ํ ํฐ ๊ฐ๊ฒฉ ์์ธก
โข ์ค๋งํธ ๋ฆฌ๋ฐธ๋ฐ์ฑ: ํฌํธํด๋ฆฌ์ค ์๋ ์ต์ ํ
โข ์ฌ๊ธฐ ํ์ง: AI๋ก ์
์์ ํ ํฐ ์๋ณ
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ AI์ ๋ธ๋ก์ฒด์ธ์ ๊ฒฐํฉํ ์๋น์ค๊ฐ ๋์ฌ ์ ์๊ฒ ์ง? ๐ฏ
5. ๊ท์ ์ ์ปดํ๋ผ์ด์ธ์ค โ๏ธ
๊ฐ๊ตญ ์ ๋ถ์ ์ํธํํ ๊ท์ ๊ฐ ๊ตฌ์ฒดํ๋๋ฉด์ ์๋ก์ด ํ์ค๋ค์ด ๋ฑ์ฅํ๊ณ ์์ด:
โข KYC/AML ํตํฉ: ์ ์ ํ์ธ์ด ๋ด์ฅ๋ ํ ํฐ
โข ์ ํ์ ์ ์ก: ๊ท์ ์ค์๋ฅผ ์ํ ํ์ดํธ๋ฆฌ์คํธ
โข ์ธ๊ธ ์๋ ๊ณ์ฐ: ๊ฑฐ๋ ์ ์๋์ผ๋ก ์ธ๊ธ ์ ๋ณด ๊ธฐ๋ก
โข ์ฆ๊ถํ ํ ํฐ: ERC-1400 ๊ฐ์ ๊ท์ ์นํ์ ํ์ค
ํฉ๋ฒ์ ์ด๊ณ ์์ ํ ์ํ๊ณ๋ก ๋ฐ์ ํ๊ณ ์์ด! ๐ก๏ธ
๐ก ๊ฐ๋ฐ์๋ฅผ ์ํ ์ปค๋ฆฌ์ด ์กฐ์ธ
ERC-20์ ๋ง์คํฐํ๋ฉด ์ด๋ฆฌ๋ ๊ธฐํ๋ค:
1๏ธโฃ ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ๋ฐ์:
์ฐ๋ด $100k~$300k, ์ ์ธ๊ณ ์๊ฒฉ ๊ทผ๋ฌด ๊ฐ๋ฅ! ์์๊ฐ ๊ณต๊ธ์ ํจ์ฌ ์ด๊ณผํ๊ณ ์์ด. ๐ผ
2๏ธโฃ DeFi ํ๋กํ ์ฝ ์์ง๋์ด:
Uniswap, Aave, Compound ๊ฐ์ ํ๋ก์ ํธ์์ ์ผํ ์ ์์ด. ํ์ ์ ์ต์ ์ ! ๐
3๏ธโฃ ๋ณด์ ๊ฐ์ฌ์:
์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ์ฌ๋ ํ๋ก์ ํธ๋น $10k~$100k+. ์ ๋ฌธ์ฑ์ด ๋งค์ฐ ์ค์ํ ๋ถ์ผ์ผ. ๐
4๏ธโฃ ๋ธ๋ก์ฒด์ธ ์ปจ์คํดํธ:
๊ธฐ์
๋ค์ ํ ํฐ ์ด์ฝ๋
ธ๋ฏธ ์ค๊ณ๋ฅผ ๋์์ค. ๊ธฐ์ ๊ณผ ๋น์ฆ๋์ค์ ๊ต์ฐจ์ ! ๐ก
5๏ธโฃ ๊ต์ก์/์ฝํ
์ธ ํฌ๋ฆฌ์์ดํฐ:
๋ธ๋ก์ฒด์ธ ๊ต์ก ์์๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์ด. ์ฌ๋ฅ๋ท์์๋ ๊ด๋ จ ๊ฐ์๋ฅผ ์ฌ๋ฆด ์ ์๊ฒ ์ง? ๐
ํ์ต ๋ก๋๋งต:
1. Solidity ๊ธฐ์ด โ 2. ERC-20 ๊ตฌํ โ 3. DeFi ํ๋กํ ์ฝ ๋ถ์ โ 4. ๋ณด์ ๋ฒ ์คํธ ํ๋ํฐ์ค โ 5. ์ค์ ํ๋ก์ ํธ โ 6. ์คํ์์ค ๊ธฐ์ฌ ๐ฏ
๐ ํ์ต ๋ฆฌ์์ค ๋ฐ ์ปค๋ฎค๋ํฐ
ERC-20์ ๋ ๊น์ด ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด? ์ต๊ณ ์ ํ์ต ์๋ฃ๋ค์ ๋ชจ์๋ดค์ด! ๐
๐ ๊ณต์ ๋ฌธ์ ๋ฐ ํ์ค
ํ์ ์ฝ๊ธฐ ์๋ฃ:
โข EIP-20 ์๋ฌธ: ethereum.org/en/eips/eip-20
โ ํ์ค์ ์์กฐ! ๋ชจ๋ ๊ฒ์ ์์์ ์ด์ผ
โข OpenZeppelin Docs: docs.openzeppelin.com
โ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ตฌํ์ฒด์ ๊ณต์ ๋ฌธ์
โข Solidity ๋ฌธ์: docs.soliditylang.org
โ ์ค๋งํธ ์ปจํธ๋ํธ ์ธ์ด์ ๋ฐ์ด๋ธ
โข Ethereum.org: ethereum.org/en/developers
โ ์ด๋๋ฆฌ์ ๊ฐ๋ฐ์ ๋ชจ๋ ๊ฒ
๐ฅ ์จ๋ผ์ธ ๊ฐ์
์ถ์ฒ ๊ฐ์ ํ๋ซํผ:
โข CryptoZombies: cryptozombies.io
โ ๊ฒ์ํ๋ฏ Solidity ๋ฐฐ์ฐ๊ธฐ! ์์ ๋ฌด๋ฃ ๐ฎ
โข Alchemy University: university.alchemy.com
โ ๋ฌด๋ฃ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ๋ถํธ์บ ํ
โข Udemy: "Ethereum and Solidity: The Complete Developer's Guide"
โ ์ฒด๊ณ์ ์ธ ์ ๋ฃ ๊ฐ์
โข YouTube: Patrick Collins, Dapp University
โ ๋ฌด๋ฃ ๊ณ ํ์ง ํํ ๋ฆฌ์ผ
โข ์ฌ๋ฅ๋ท: ํ๊ตญ์ด๋ก ๋ ๋ธ๋ก์ฒด์ธ ๊ฐ์๋ ์ฐพ์๋ณผ ์ ์์ด! ๐ฐ๐ท
๐ป ์ค์ต ํ๋ซํผ
์ฝ๋ฉ ์ฐ์ตํ๊ธฐ:
โข Remix IDE: remix.ethereum.org
โ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก Solidity ์ฝ๋ฉ! ์ค์น ํ์ ์์ โจ
โข Hardhat: hardhat.org
โ ํ๋กํ์
๋ ๊ฐ๋ฐ ํ๊ฒฝ
โข Foundry: getfoundry.sh
โ ๋น ๋ฅด๊ณ ๊ฐ๋ ฅํ ํ
์คํ
ํ๋ ์์ํฌ
โข Tenderly: tenderly.co
โ ์ค๋งํธ ์ปจํธ๋ํธ ๋๋ฒ๊น
๋ฐ ๋ชจ๋ํฐ๋ง
โข Etherscan: etherscan.io
โ ์ค์ ์ปจํธ๋ํธ ์ฝ๋ ๋ถ์ํ๊ธฐ
๐ฅ ์ปค๋ฎค๋ํฐ
ํจ๊ป ์ฑ์ฅํ๊ธฐ:
โข Discord:
- OpenZeppelin Community
- Ethereum R&D
- Buildspace
โข Reddit:
- r/ethdev (์ด๋๋ฆฌ์ ๊ฐ๋ฐ)
- r/solidity
- r/ethereum
โข Twitter:
- @VitalikButerin
- @OpenZeppelin
- @PatrickAlphaC
โข ํ๊ตญ ์ปค๋ฎค๋ํฐ:
- ์ด๋๋ฆฌ์ ์ฐ๊ตฌํ
- ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ๋ชจ์
- ์ฌ๋ฅ๋ท ๋ธ๋ก์ฒด์ธ ์นดํ
๊ณ ๋ฆฌ ๐ฏ
๐ง ์ ์ฉํ ๋๊ตฌ๋ค
๊ฐ๋ฐ ํจ์จ์ ๋์ด๋ ํด:
โข Metamask: ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ด๋๋ฆฌ์ ์ง๊ฐ
โข Infura/Alchemy: ๋
ธ๋ ์ธํ๋ผ ์๋น์ค
โข The Graph: ๋ธ๋ก์ฒด์ธ ๋ฐ์ดํฐ ์ธ๋ฑ์ฑ
โข Chainlink: ์ค๋ผํด ์๋น์ค
โข IPFS: ํ์ค์ํ ํ์ผ ์ ์ฅ
โข Gnosis Safe: ๋ฉํฐ์๊ทธ ์ง๊ฐ
โข Defender: ์ค๋งํธ ์ปจํธ๋ํธ ์๋ํ
โข Slither: ์ ์ ๋ถ์ ๋๊ตฌ
๐ฏ ์ค์ ํ๋ก์ ํธ ์์ด๋์ด
์ด๋ก ์ ๋ฐฐ์ ์ผ๋ฉด ์ด์ ์ง์ ๋ง๋ค์ด๋ด์ผ์ง! ๋์ด๋๋ณ ํ๋ก์ ํธ ์์ด๋์ด๋ฅผ ์๊ฐํ ๊ฒ. ๐
๐ฑ ์ด๊ธ ํ๋ก์ ํธ
1. ๋๋ง์ ๋ฐ ์ฝ์ธ ๋ง๋ค๊ธฐ ๐
๋ชฉํ: ๊ธฐ๋ณธ ERC-20 ํ ํฐ ๋ฐฐํฌ
๊ธฐ๋ฅ: ์ด๋ฆ, ์ฌ๋ณผ, ์ด๊ธฐ ๊ณต๊ธ๋ ์ค์
ํ์ต ํฌ์ธํธ: ์ปจํธ๋ํธ ๋ฐฐํฌ, Etherscan ๊ฒ์ฆ
์์ ์๊ฐ: 2-3์๊ฐ
2. ํ ํฐ ์์ด๋๋ ์์คํ ๐
๋ชฉํ: ์ฌ๋ฌ ์ฃผ์์ ๋์ ์ ์ก
๊ธฐ๋ฅ: CSV ํ์ผ ์ฝ๊ธฐ, ๋ฐฐ์น ์ ์ก, ๊ฐ์ค ์ต์ ํ
ํ์ต ํฌ์ธํธ: ๋ฃจํ ์ต์ ํ, ์ด๋ฒคํธ ํ์ฉ
์์ ์๊ฐ: 4-6์๊ฐ
๐ฟ ์ค๊ธ ํ๋ก์ ํธ
3. ๋ฒ ์คํ ์ปจํธ๋ํธ โฐ
๋ชฉํ: ์๊ฐ์ ๋ฐ๋ผ ํ ํฐ์ ์ ์ง์ ์ผ๋ก ํด์
๊ธฐ๋ฅ: ํด๋ฆฌํ ๊ธฐ๊ฐ, ์ ํ ๋ฒ ์คํ
, ์กฐ๊ธฐ ํด์ง
ํ์ต ํฌ์ธํธ: ์๊ฐ ๊ธฐ๋ฐ ๋ก์ง, ์ํ ์ฐ์ฐ
์์ ์๊ฐ: 1-2์ผ
์ค์ ์ฌ์ฉ ์ฌ๋ก: ํ ํ ํฐ, ํฌ์์ ํ ํฐ ๋ฝ์
4. ์คํ ์ดํน ํ ๐
๋ชฉํ: ํ ํฐ์ ์์นํ๊ณ ๋ณด์ ๋ฐ๊ธฐ
๊ธฐ๋ฅ: ์์น, ์ธ์ถ, ๋ณด์ ๊ณ์ฐ, APY ํ์
ํ์ต ํฌ์ธํธ: ๋ณต์กํ ์ํ, ๋ณด์ ๋ถ๋ฐฐ ์๊ณ ๋ฆฌ์ฆ
์์ ์๊ฐ: 3-5์ผ
์ถ๊ฐ ๊ธฐ๋ฅ: ๋ฝ์
๊ธฐ๊ฐ, ๋ถ์คํฐ, ํ๋ํฐ
๐ณ ๊ณ ๊ธ ํ๋ก์ ํธ
5. DEX (ํ์ค์ํ ๊ฑฐ๋์) ๐
๋ชฉํ: Uniswap ์คํ์ผ์ AMM ๊ตฌํ
๊ธฐ๋ฅ: ์ ๋์ฑ ํ, ์ค์, LP ํ ํฐ, ์์๋ฃ
ํ์ต ํฌ์ธํธ: AMM ์๊ณ ๋ฆฌ์ฆ, ๊ฐ๊ฒฉ ๊ณ์ฐ, ์ฌ๋ฆฌํผ์ง
์์ ์๊ฐ: 1-2์ฃผ
ํต์ฌ ๊ฐ๋
: x * y = k ๊ณต์, ์ํผ๋จธ๋ํธ ๋ก์ค
6. ๋์ถ ํ๋กํ ์ฝ ๐ฆ
๋ชฉํ: Aave/Compound ์คํ์ผ์ ๋์ถ ํ๋ซํผ
๊ธฐ๋ฅ: ๋ด๋ณด ์์น, ๋์ถ, ์ฒญ์ฐ, ์ด์ ๊ณ์ฐ
ํ์ต ํฌ์ธํธ: ๋ด๋ณด ๋น์จ, ์ค๋ผํด ํตํฉ, ์ฒญ์ฐ ๋ฉ์ปค๋์ฆ
์์ ์๊ฐ: 2-3์ฃผ
๊ณ ๊ธ ๊ธฐ๋ฅ: ํ๋์ ๋ก , ์ด์์จ ๋ชจ๋ธ, ๊ฑฐ๋ฒ๋์ค
7. DAO (ํ์ค์ํ ์์จ ์กฐ์ง) ๐ณ๏ธ
๋ชฉํ: ๊ฑฐ๋ฒ๋์ค ํ ํฐ ๊ธฐ๋ฐ ํฌํ ์์คํ
๊ธฐ๋ฅ: ์ ์ ์์ฑ, ํฌํ, ์คํ, ํ์๋ฝ
ํ์ต ํฌ์ธํธ: ๊ฑฐ๋ฒ๋์ค ํจํด, ์์, ์ฟผ๋ผ
์์ ์๊ฐ: 2-3์ฃผ
์ค์ ํ์ฉ: ํ๋กํ ์ฝ ์
๊ทธ๋ ์ด๋, ์ฌ๋ฌด ๊ด๋ฆฌ
๐ก ํ๋ก์ ํธ ์ฑ๊ณต ํ
ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋น๊ฒฐ:
1๏ธโฃ ์๊ฒ ์์ํ๊ธฐ:
์ฒ์๋ถํฐ ์๋ฒฝํ ๊ฑธ ๋ง๋ค๋ ค๊ณ ํ์ง ๋ง. MVP(Minimum Viable Product)๋ถํฐ!
2๏ธโฃ ๊ธฐ์กด ์ฝ๋ ๋ถ์:
Uniswap, Aave ๊ฐ์ ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ์ฝ์ด๋ด. ์ต๊ณ ์ ํ์ต ์๋ฃ์ผ!
3๏ธโฃ ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ:
ํ
์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ๊ตฌํํด. ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ ์ ์์ด!
4๏ธโฃ ๋ณด์ ์ต์ฐ์ :
๋์ด ๊ฑธ๋ฆฐ ์ฝ๋์ผ. ํญ์ ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ์๊ฐํด!
5๏ธโฃ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ:
Discord, Reddit์ ๊ณต์ ํ๊ณ ํผ๋๋ฐฑ ๋ฐ์. ํผ์๋ณด๋ค ํจ๊ป!
6๏ธโฃ ๋ฌธ์ํ:
README, ์ฃผ์, ์ํคํ
์ฒ ๋ค์ด์ด๊ทธ๋จ์ ๊ผผ๊ผผํ ์์ฑํด. ๋ฏธ๋์ ๋๋ฅผ ์ํด!
7๏ธโฃ ํฌํธํด๋ฆฌ์ค ๊ตฌ์ถ:
GitHub์ ์ฌ๋ฆฌ๊ณ , ๋ธ๋ก๊ทธ์ ๊ฐ๋ฐ ๊ณผ์ ์ ๊ธฐ๋กํด. ์ทจ์
/ํ๋ฆฌ๋์ฑ์ ํฐ ๋์!
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐ ERC-20 ํ์ค์ ๋ํด ๊ฝค ๊น์ด ์๊ฒ ์์๋ดค์ด. ๊ฐ๋จํ ํ ํฐ ํ์ค์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์์ฒ์ต ๋ฌ๋ฌ ๊ท๋ชจ์ ์ํ๊ณ๋ฅผ ์งํฑํ๋ ํต์ฌ ๊ธฐ์ ์ด์ผ. ๐
๐ ํต์ฌ ์์ฝ
์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๊ฒ๋ค:
โ
ERC-20์ ์ด๋๋ฆฌ์ ํ ํฐ์ ๊ณตํต ํ์ค์ด์ผ
โ
6๊ฐ์ ํ์ ํจ์์ 3๊ฐ์ ์ ํ์ ํจ์๋ก ๊ตฌ์ฑ๋ผ
โ
approve/transferFrom ํจํด์ด DeFi์ ํต์ฌ์ด์ผ
โ
OpenZeppelin์ ์ฌ์ฉํ๋ฉด ์์ ํ๊ฒ ๊ตฌํํ ์ ์์ด
โ
ํ ํฐ ์์ค, approve ๊ณต๊ฒฉ ๊ฐ์ ํ๊ณ์ ์ด ์์ด
โ
ERC-777, EIP-2612 ๊ฐ์ ๊ฐ์ ํ์ค๋ค์ด ๋์์ด
โ
Layer 2, ํฌ๋ก์ค์ฒด์ธ, RWA ๋ฑ์ผ๋ก ์งํ ์ค์ด์ผ
โ
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์๋ ์์๊ฐ ๋งค์ฐ ๋์ ์ง์
์ด์ผ
๐ญ ๊ฐ์ธ์ ์ธ ์กฐ์ธ:
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ์ฒ์์ ์ด๋ ค์ ๋ณด์ด์ง๋ง, ํ ๊ฑธ์์ฉ ๋์๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ๋ฉ์ง DApp์ ๋ง๋ค๊ณ ์๋ ์์ ์ ๋ฐ๊ฒฌํ๊ฒ ๋ ๊ฑฐ์ผ! ๐
์ค์ํ ๊ฑด ๊พธ์คํจ์ด์ผ. ๋งค์ผ ์กฐ๊ธ์ฉ์ด๋ผ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๋ถ์ํ๊ณ , ์ปค๋ฎค๋ํฐ์ ์ํตํ๋ฉด์ ์ฑ์ฅํด๋ด. ์ค์๋ฅผ ๋๋ ค์ํ์ง ๋ง! ํ
์คํธ๋ท์ ๋ฌดํ๋๋ก ์คํจํด๋ ๊ด์ฐฎ์ ๊ณณ์ด๋๊น. ๐
๊ทธ๋ฆฌ๊ณ ํผ์ ๊ณต๋ถํ๊ธฐ ํ๋ค๋ค๋ฉด ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๋ฉํ ๋ฅผ ์ฐพ๊ฑฐ๋, ์คํฐ๋ ๊ทธ๋ฃน์ ๋ง๋ค์ด๋ด. ํจ๊ป ๋ฐฐ์ฐ๋ฉด ํจ์ฌ ์ฌ๋ฏธ์๊ณ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ด! ๐ค
๐ฏ ๋ค์ ๋จ๊ณ:
1. ์ด ๊ธ์ ๋ถ๋งํฌํ๊ณ ํ์ํ ๋๋ง๋ค ์ฐธ๊ณ ํด ๐
2. Remix์์ ๊ฐ๋จํ ERC-20 ํ ํฐ์ ๋ง๋ค์ด๋ด ๐ป
3. ํ
์คํธ๋ท์ ๋ฐฐํฌํ๊ณ ์น๊ตฌ๋ค์๊ฒ ์ ์กํด๋ด ๐
4. OpenZeppelin ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ถ์ํด๋ด ๐
5. ์์ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ด (์์ด๋๋ ์์คํ
์ถ์ฒ!) ๐
6. Discord ์ปค๋ฎค๋ํฐ์ ๊ฐ์
ํด์ ์ง๋ฌธํ๊ณ ๋ต๋ณํด๋ด ๐ฌ
7. ๋ธ๋ก๊ทธ๋ GitHub์ ํ์ต ๋ด์ฉ์ ๊ธฐ๋กํด๋ด ๐
๋ธ๋ก์ฒด์ธ ์ธ๊ณ๋ ๋งค์ผ ์๋ก์ด ํ์ ์ด ์ผ์ด๋๋ ๊ณณ์ด์ผ. ERC-20์ ๊ทธ ์ฌ์ ์ ์์์ ์ผ ๋ฟ์ด์ง. ์ฌ๊ธฐ์ ๋ฐฐ์ด ์ง์์ ๋ฐํ์ผ๋ก NFT(ERC-721), ๋ฉํฐํ ํฐ(ERC-1155), Layer 2, ํฌ๋ก์ค์ฒด์ธ ๋ฑ ๋ ๋์ ์ธ๊ณ๋ก ๋์๊ฐ๋ด! ๐
์ธ์ ๊ฐ ๋น์ ์ด ๋ง๋ ํ ํฐ์ด ์๋ฐฑ๋ง ๋ช
์ด ์ฌ์ฉํ๋ ๋ ์ด ์ฌ์ง๋ ๋ชฐ๋ผ. ๊ทธ๋๋ฅผ ์์ํ๋ฉฐ ์ค๋๋ ํ ์ค์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์! ๐ช
์ง๋ฌธ์ด๋ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํด์ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ์ค์ด๋๊น! ๐ฑ
ํ์ด์ ๋น์ด! May the blockchain be with you! ๐โจ
๐ ์ถํํฉ๋๋ค!
ERC-20 ํ์ค์ ๋ชจ๋ ๊ฒ์ ๋ง์คํฐํ์ด์!
์ด์ ๋น์ ๋ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์์ ๊ธธ์ ๊ฑท๊ณ ์์ต๋๋ค. ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.