Ver3.0 ๐ Web3 ๊ธฐ๋ฐ ๊ธฐ๋ถ ํฌ๋ช ์ฑ ์์คํ

๐ Web3 ๊ธฐ๋ฐ ๊ธฐ๋ถ ํฌ๋ช ์ฑ ์์คํ
๋ธ๋ก์ฒด์ธ์ผ๋ก ๊ธฐ๋ถ์ ์ ๋ขฐ๋ฅผ ๋์ฐพ๋ค
๐ค ์ฌ๋ฌ๋ถ, ๊ธฐ๋ถํ๋๋ฐ ๊ทธ ๋์ด ์ง์ง ์ด๋๋ก ๊ฐ๋์ง ๊ถ๊ธํ๋ ์ ์์ฃ ? ใ ใ ใ ์์งํ ๊ธฐ๋ถ๋จ์ฒด ๋ฏฟ๊ณ ๋ณด๋๋๋ฐ ๋์ค์ ๋ด์ค ๋ณด๋ฉด ํก๋ น์ด๋ ๋ญ๋ ํ๋ ๊ฑฐ ๋ณด๋ฉด ์ง์ง ๋นก์น์์์. ๊ทผ๋ฐ ์ด์ Web3 ๊ธฐ์ ๋ก ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์์ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฑฐ! ๐
๐ ์ ๊ธฐ๋ถ ํฌ๋ช ์ฑ์ด ๋ฌธ์ ๊ฐ ๋๋ ๊ฑธ๊น?
๊ธฐ๋ถ ์์ฅ์ ์ ์ธ๊ณ์ ์ผ๋ก ์์ฒญ๋ ๊ท๋ชจ์์. ํ๊ตญ๋ง ํด๋ ์ฐ๊ฐ ์์กฐ ์์ด ๊ธฐ๋ถ๋๊ณ ์๋๋ฐ, ๋ฌธ์ ๋ ๊ธฐ๋ถ๊ธ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ถ์ ํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต๋ค๋ ๊ฑฐ์ฃ . ๐คทโโ๏ธ
์ ํต์ ์ธ ๊ธฐ๋ถ ์์คํ ์ ๋ฌธ์ ์ ๋ค:
๐ธ ๋ถํฌ๋ช
ํ ์๊ธ ํ๋ฆ - ๊ธฐ๋ถ๊ธ์ด ์ค๊ฐ์ ์ด๋๋ก ๊ฐ๋์ง ๋ชจ๋ฆ
๐ ๋์ ์ด์๋น - ์ค์ ์ํ์์๊ฒ ๋๋ฌํ๋ ๋น์จ์ด ๋ฎ์
โฐ ๋๋ฆฐ ์ฒ๋ฆฌ ์๋ - ๊ธด๊ธ ์ฌ๋ ์ํฉ์์๋ ๋ฉฐ์น ์ฉ ๊ฑธ๋ฆผ
๐ ์ค์ํ๋ ๊ด๋ฆฌ - ํน์ ๊ธฐ๊ด์ ๋ํ ๋งน๋ชฉ์ ์ ๋ขฐ ํ์
๐ ๋ณต์กํ ํ๊ณ ๋ณด๊ณ - ์ผ๋ฐ์ธ์ด ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฌ๋ฌด์ ํ
์ค์ ๋ก 2021๋ ํ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด, ๊ธฐ๋ถ์์ 67%๊ฐ "๊ธฐ๋ถ๊ธ์ด ์ ๋๋ก ์ฌ์ฉ๋๋์ง ํ์ ํ ์ ์๋ค"๊ณ ๋ตํ๋์. ์ด๊ฑฐ ์ง์ง ์ฌ๊ฐํ ๋ฌธ์ ์๋์์? ใ ใ
๐ Web3๊ฐ ๋ญ๋ฐ? ์ ๊ธฐ๋ถ์ ์ฐ๋ ๊ฑฐ์ผ?
Web3๋ ์ฝ๊ฒ ๋งํ๋ฉด ํ์ค์ํ๋ ์ธํฐ๋ท์ด์์. ๊ธฐ์กด Web2(์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ์ธํฐ๋ท)๋ ๊ตฌ๊ธ, ํ์ด์ค๋ถ ๊ฐ์ ๋๊ธฐ์ ๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ค์์์ ๊ด๋ฆฌํ์์์? Web3๋ ์ด๊ฑธ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ๋ก ๋ถ์ฐ์์ผ์ ๋๊ตฌ๋ ํฌ๋ช ํ๊ฒ ๋ณผ ์ ์๊ฒ ๋ง๋๋ ๊ฑฐ์ฃ ! ๐
๐ฏ Web3์ ํต์ฌ ํน์ง:
ํ์ค์ํ ํฌ๋ช ์ฑ ๋ถ๋ณ์ฑ ์๋ํ ๋ณด์์ฑ
๐
๋ธ๋ก์ฒด์ธ ๊ธฐ๋ฐ
๋ชจ๋ ๊ฑฐ๋๊ฐ ์ฒด์ธ์ ์๊ตฌ ๊ธฐ๋ก๋์ด ์๋ณ์กฐ ๋ถ๊ฐ๋ฅ
๐ค
์ค๋งํธ ์ปจํธ๋ํธ
์กฐ๊ฑด ์ถฉ์กฑ ์ ์๋์ผ๋ก ์คํ๋๋ ํ๋ก๊ทธ๋จ
๐๏ธ
์์ ํ ํฌ๋ช ์ฑ
๋๊ตฌ๋ ์ธ์ ๋ ์ง ๊ฑฐ๋ ๋ด์ญ ํ์ธ ๊ฐ๋ฅ
โก
๋น ๋ฅธ ์ฒ๋ฆฌ
์ค๊ฐ ๋จ๊ณ ์์ด ์ง์ ์ ๋ฌ๋ก ์๊ฐ ๋จ์ถ
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ง์ง ๊ฟํ! ๐ฏ Web3 ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ถ๊ฑฐ๋, ๊ด๋ จ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์ถ์๋ฐ ํผ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์๋ ์ปจ์คํดํธ๋ฅผ ์ฐพ์๋ณผ ์ ์์ด์. ์ค์ ๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์ด Web3 ๊ด๋ จ ์ฌ๋ฅ์ ๊ณต์ ํ๊ณ ์๊ฑฐ๋ ์! ๐
๐ก Web3 ๊ธฐ๋ถ ์์คํ ์ ํต์ฌ ๊ธฐ์
1๏ธโฃ ์ค๋งํธ ์ปจํธ๋ํธ (Smart Contract)
์ค๋งํธ ์ปจํธ๋ํธ๋ Web3 ๊ธฐ๋ถ ์์คํ ์ ์ฌ์ฅ์ด๋ผ๊ณ ํ ์ ์์ด์! ๐ซ ์ด๊ฒ ๋ญ๋๋ฉด, ์ฝ๋๋ก ์์ฑ๋ ์๋ ์คํ ๊ณ์ฝ์์์. "๋ง์ฝ A ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด B๋ฅผ ์คํํ๋ค" ์ด๋ฐ ์์ผ๋ก ์๋ํ๋ ๊ฑฐ์ฃ .
๐ ์ค๋งํธ ์ปจํธ๋ํธ ์์:
// Solidity๋ก ์์ฑ๋ ๊ฐ๋จํ ๊ธฐ๋ถ ์ปจํธ๋ํธ ์์
contract DonationContract {
address public beneficiary;
uint public goal;
uint public totalDonated;
mapping(address => uint) public donations;
event DonationReceived(address donor, uint amount);
event GoalReached(uint totalAmount);
function donate() public payable {
require(msg.value > 0, "๊ธฐ๋ถ ๊ธ์ก์ 0๋ณด๋ค ์ปค์ผ ํฉ๋๋ค");
donations[msg.sender] += msg.value;
totalDonated += msg.value;
emit DonationReceived(msg.sender, msg.value);
if(totalDonated >= goal) {
emit GoalReached(totalDonated);
payable(beneficiary).transfer(address(this).balance);
}
}
}
ใ ใ ใ ์ฝ๋ ๋ณด๋๊น ์ด๋ ต์ฃ ? ๊ทผ๋ฐ ์ด๊ฒ ์ง์ง ์ ๊ธฐํ ๊ฒ, ์ด ์ฝ๋๊ฐ ๋ธ๋ก์ฒด์ธ์ ๋ฐฐํฌ๋๋ฉด ๋๊ตฌ๋ ์์ ํ ์ ์๊ณ , ์กฐ๊ฑด๋ง ๋ง์ผ๋ฉด ์๋์ผ๋ก ์คํ๋๋ค๋ ๊ฑฐ์์! ๐ฏ
๐ก ์ค๋งํธ ์ปจํธ๋ํธ์ ์ฅ์ :
โ
์ค๊ฐ์ ์์ด ์ง์ ๊ฑฐ๋ ๊ฐ๋ฅ
โ
์กฐ๊ฑด ์ถฉ์กฑ ์ ์๋ ์คํ์ผ๋ก ์ธ์ ์ค๋ฅ ์ ๊ฑฐ
โ
์ฝ๋๊ฐ ๊ณต๊ฐ๋์ด ๋๊ตฌ๋ ๊ฒ์ฆ ๊ฐ๋ฅ
โ
ํ๋ฒ ๋ฐฐํฌ๋๋ฉด ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ (๋ณด์์ฑ UP)
โ
24/7 ์๋ ์ด์์ผ๋ก ๊ด๋ฆฌ ๋น์ฉ ์ ๊ฐ
2๏ธโฃ ๋ธ๋ก์ฒด์ธ ์์ฅ (Blockchain Ledger)
๋ธ๋ก์ฒด์ธ์ ๋ง ๊ทธ๋๋ก "๋ธ๋ก"๋ค์ด "์ฒด์ธ"์ฒ๋ผ ์ฐ๊ฒฐ๋ ๊ฑฐ์์. ๊ฐ ๋ธ๋ก์๋ ๊ฑฐ๋ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ณ , ์ด๊ฒ ๊ณ์ ์์ด๋ฉด์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ธฐ๋ก์ ๋ง๋๋ ๊ฑฐ์ฃ ! ๐
๊ฐ ๋ธ๋ก์ ์ด์ ๋ธ๋ก์ ํด์๊ฐ์ ํฌํจํ๊ณ ์์ด์, ๋ง์ฝ ๋๊ตฐ๊ฐ ์ค๊ฐ ๋ธ๋ก์ ์กฐ์ํ๋ ค๊ณ ํ๋ฉด ๊ทธ ๋ค์ ๋ชจ๋ ๋ธ๋ก์ด ๋ฌดํจํ๋๋ ๊ฑฐ์์! ๊ทธ๋์ ์ฌ์ค์ ์กฐ์์ด ๋ถ๊ฐ๋ฅํ ๊ฑฐ์ฃ . ์์ ์ฒ์ฌ์ ์ธ ์์คํ ์๋์์? ใ ใ ใ ๐
3๏ธโฃ ์ํธํํ ์ง๊ฐ (Crypto Wallet)
๊ธฐ๋ถ๋ฅผ ํ๋ ค๋ฉด ์ํธํํ ์ง๊ฐ์ด ํ์ํด์. ์ด๊ฑด ์ํ ๊ณ์ข ๊ฐ์ ๊ฑด๋ฐ, ์ฐจ์ด์ ์ ๋ด๊ฐ ์์ ํ ํต์ ๊ถ์ ๊ฐ์ง๋ค๋ ๊ฑฐ์์! ๐
๐ฆ ์ ํต ์ํ ๊ณ์ข vs ๐ฐ ์ํธํํ ์ง๊ฐ
| ๊ตฌ๋ถ | ์ ํต ์ํ | ์ํธํํ ์ง๊ฐ |
|---|---|---|
| ํต์ ๊ถ | ์ํ์ด ๊ด๋ฆฌ | ๋ณธ์ธ์ด ์ง์ ๊ด๋ฆฌ |
| ๊ณ์ข ๊ฐ์ค | ์ ๋ถ์ฆ, ์๋ฅ ํ์ | ์ฆ์ ์์ฑ ๊ฐ๋ฅ |
| ๊ฑฐ๋ ์๊ฐ | ์์ ์๊ฐ ์ ํ | 24์๊ฐ 365์ผ |
| ๊ตญ์ ์ก๊ธ | ๋ฉฐ์น ์์, ๋์ ์์๋ฃ | ๋ช ๋ถ ๋ด, ๋ฎ์ ์์๋ฃ |
| ํฌ๋ช ์ฑ | ๋ณธ์ธ ๊ณ์ข๋ง ํ์ธ | ๋ชจ๋ ๊ฑฐ๋ ๊ณต๊ฐ |
| ๋๊ฒฐ ์ํ | ์ํ/์ ๋ถ๊ฐ ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ |
๋ํ์ ์ธ ์ง๊ฐ์ผ๋ก๋ MetaMask, Trust Wallet, Ledger ๊ฐ์ ๊ฒ ์์ด์. ํนํ MetaMask๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค์นํด์ ์ธ ์ ์์ด์ ์ง์ง ํธํด์! ๐
๐ ๏ธ Web3 ๊ธฐ๋ถ ์์คํ ๊ตฌ์ถํ๊ธฐ
์, ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ๋ง๋๋์ง ์์๋ณผ๊น์? ๊ฐ๋ฐ์๊ฐ ์๋์ด๋ ์ดํดํ ์ ์๊ฒ ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐
๐ฏ ์์คํ ์ํคํ ์ฒ
์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ํฌ๊ฒ 3๊ฐ ๋ ์ด์ด๋ก ๋๋์ด์ ธ ์์ด์. ๊ฐ๊ฐ์ ์ญํ ์ ์์ธํ ์์๋ณผ๊ฒ์! ๐
1๋จ๊ณ: ํ๋ก ํธ์๋ ๋ ์ด์ด ๐จ
์ฌ์ฉ์๊ฐ ์ง์ ๋ณด๊ณ ์ํธ์์ฉํ๋ ๋ถ๋ถ์ด์์. ์น์ฌ์ดํธ๋ ์ฑ ํ๋ฉด์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์. React๋ Vue.js ๊ฐ์ ํ๋ ์์ํฌ๋ก ๋ง๋ค๊ณ , Web3.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ธ๋ก์ฒด์ธ๊ณผ ์ฐ๊ฒฐํด์.
2๋จ๊ณ: ์ค๋งํธ ์ปจํธ๋ํธ ๋ ์ด์ด ๐ค
์ค์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ค์ด๊ฐ๋ ๋ถ๋ถ! ๊ธฐ๋ถ๊ธ ๋ฐ๊ธฐ, ๋ถ๋ฐฐํ๊ธฐ, ํฌ๋ช ์ฑ ๋ณด๊ณ ์ ์์ฑํ๊ธฐ ๋ฑ์ ๊ธฐ๋ฅ์ด ์ฌ๊ธฐ์ ์๋์ผ๋ก ์คํ๋ผ์. Solidity ์ธ์ด๋ก ์์ฑํด์.
3๋จ๊ณ: ๋ธ๋ก์ฒด์ธ ๋ ์ด์ด โ๏ธ
๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ์ ์ฅ๋๋ ๊ณณ! Ethereum, Polygon, BSC ๋ฑ ๋ค์ํ ๋ธ๋ก์ฒด์ธ ์ค์์ ์ ํํ ์ ์์ด์. ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ด์ ํ๋ก์ ํธ ํน์ฑ์ ๋ง๊ฒ ๊ณ ๋ฅด๋ฉด ๋ผ์.
๐ป ์ค์ ๊ตฌํ ๊ณผ์
์, ์ด์ ์ง์ง ์ฝ๋ฉ ๋ค์ด๊ฐ๋๋ค! ใ ใ ใ ๊ทผ๋ฐ ๊ฑฑ์ ๋ง์ธ์, ํ๋ํ๋ ์ฒ์ฒํ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๐
๐ง ํ์ํ ๊ฐ๋ฐ ๋๊ตฌ๋ค:
โข Node.js - JavaScript ์คํ ํ๊ฒฝ
โข Truffle ๋๋ Hardhat - ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ๋ฐ ํ๋ ์์ํฌ
โข Ganache - ๋ก์ปฌ ๋ธ๋ก์ฒด์ธ ํ
์คํธ ํ๊ฒฝ
โข MetaMask - ๋ธ๋ผ์ฐ์ ์ง๊ฐ
โข Remix IDE - ์จ๋ผ์ธ Solidity ๊ฐ๋ฐ ํ๊ฒฝ
โข Infura ๋๋ Alchemy - ๋ธ๋ก์ฒด์ธ ๋
ธ๋ ์๋น์ค
Step 1: ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ
// Node.js์ npm์ด ์ค์น๋์ด ์๋ค๊ณ ๊ฐ์
// Hardhat ํ๋ก์ ํธ ์ด๊ธฐํ
mkdir donation-dapp
cd donation-dapp
npm init -y
npm install --save-dev hardhat
// Hardhat ์ด๊ธฐํ
npx hardhat
// ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
npm install @openzeppelin/contracts
npm install ethers
npm install dotenv
Step 2: ์ค๋งํธ ์ปจํธ๋ํธ ์์ฑ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ธฐ๋ถ ์์คํ ์ ํต์ฌ์ธ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ์! ๐
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract TransparentDonation is Ownable, ReentrancyGuard {
// ๊ธฐ๋ถ ์บ ํ์ธ ๊ตฌ์กฐ์ฒด
struct Campaign {
string name;
string description;
address payable beneficiary;
uint256 goalAmount;
uint256 currentAmount;
uint256 deadline;
bool isActive;
bool fundsWithdrawn;
}
// ๊ฐ๋ณ ๊ธฐ๋ถ ๊ธฐ๋ก
struct Donation {
address donor;
uint256 amount;
uint256 timestamp;
uint256 campaignId;
}
// ์ํ ๋ณ์๋ค
mapping(uint256 => Campaign) public campaigns;
mapping(uint256 => Donation[]) public campaignDonations;
mapping(address => uint256[]) public donorCampaigns;
uint256 public campaignCounter;
uint256 public totalDonated;
uint256 public platformFeePercent = 2; // 2% ํ๋ซํผ ์์๋ฃ
// ์ด๋ฒคํธ๋ค
event CampaignCreated(
uint256 indexed campaignId,
string name,
address beneficiary,
uint256 goalAmount,
uint256 deadline
);
event DonationReceived(
uint256 indexed campaignId,
address indexed donor,
uint256 amount,
uint256 timestamp
);
event FundsWithdrawn(
uint256 indexed campaignId,
address indexed beneficiary,
uint256 amount
);
event CampaignClosed(uint256 indexed campaignId);
// ์บ ํ์ธ ์์ฑ
function createCampaign(
string memory _name,
string memory _description,
address payable _beneficiary,
uint256 _goalAmount,
uint256 _durationDays
) external returns (uint256) {
require(_goalAmount > 0, "๋ชฉํ ๊ธ์ก์ 0๋ณด๋ค ์ปค์ผ ํฉ๋๋ค");
require(_durationDays > 0, "๊ธฐ๊ฐ์ 0๋ณด๋ค ์ปค์ผ ํฉ๋๋ค");
require(_beneficiary != address(0), "์ ํจํ์ง ์์ ์ํ์ ์ฃผ์");
uint256 campaignId = campaignCounter++;
uint256 deadline = block.timestamp + (_durationDays * 1 days);
campaigns[campaignId] = Campaign({
name: _name,
description: _description,
beneficiary: _beneficiary,
goalAmount: _goalAmount,
currentAmount: 0,
deadline: deadline,
isActive: true,
fundsWithdrawn: false
});
emit CampaignCreated(
campaignId,
_name,
_beneficiary,
_goalAmount,
deadline
);
return campaignId;
}
// ๊ธฐ๋ถํ๊ธฐ
function donate(uint256 _campaignId)
external
payable
nonReentrant
{
Campaign storage campaign = campaigns[_campaignId];
require(campaign.isActive, "์บ ํ์ธ์ด ํ์ฑํ๋์ง ์์์ต๋๋ค");
require(block.timestamp < campaign.deadline, "์บ ํ์ธ์ด ์ข
๋ฃ๋์์ต๋๋ค");
require(msg.value > 0, "๊ธฐ๋ถ ๊ธ์ก์ 0๋ณด๋ค ์ปค์ผ ํฉ๋๋ค");
// ๊ธฐ๋ถ ๊ธฐ๋ก ์ ์ฅ
Donation memory newDonation = Donation({
donor: msg.sender,
amount: msg.value,
timestamp: block.timestamp,
campaignId: _campaignId
});
campaignDonations[_campaignId].push(newDonation);
donorCampaigns[msg.sender].push(_campaignId);
// ๊ธ์ก ์
๋ฐ์ดํธ
campaign.currentAmount += msg.value;
totalDonated += msg.value;
emit DonationReceived(
_campaignId,
msg.sender,
msg.value,
block.timestamp
);
}
// ๊ธฐ๋ถ๊ธ ์ธ์ถ
function withdrawFunds(uint256 _campaignId)
external
nonReentrant
{
Campaign storage campaign = campaigns[_campaignId];
require(
msg.sender == campaign.beneficiary,
"์ํ์๋ง ์ธ์ถํ ์ ์์ต๋๋ค"
);
require(campaign.isActive, "์บ ํ์ธ์ด ํ์ฑํ๋์ง ์์์ต๋๋ค");
require(!campaign.fundsWithdrawn, "์ด๋ฏธ ์ธ์ถ๋์์ต๋๋ค");
require(
block.timestamp >= campaign.deadline ||
campaign.currentAmount >= campaign.goalAmount,
"์์ง ์ธ์ถ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์์ต๋๋ค"
);
uint256 amount = campaign.currentAmount;
uint256 platformFee = (amount * platformFeePercent) / 100;
uint256 beneficiaryAmount = amount - platformFee;
campaign.fundsWithdrawn = true;
campaign.isActive = false;
// ์ํ์์๊ฒ ์ ์ก
(bool success, ) = campaign.beneficiary.call{value: beneficiaryAmount}("");
require(success, "์ ์ก ์คํจ");
emit FundsWithdrawn(_campaignId, campaign.beneficiary, beneficiaryAmount);
emit CampaignClosed(_campaignId);
}
// ์บ ํ์ธ ์ ๋ณด ์กฐํ
function getCampaignDetails(uint256 _campaignId)
external
view
returns (
string memory name,
string memory description,
address beneficiary,
uint256 goalAmount,
uint256 currentAmount,
uint256 deadline,
bool isActive,
uint256 donationCount
)
{
Campaign memory campaign = campaigns[_campaignId];
return (
campaign.name,
campaign.description,
campaign.beneficiary,
campaign.goalAmount,
campaign.currentAmount,
campaign.deadline,
campaign.isActive,
campaignDonations[_campaignId].length
);
}
// ํน์ ์บ ํ์ธ์ ๋ชจ๋ ๊ธฐ๋ถ ๋ด์ญ ์กฐํ
function getCampaignDonations(uint256 _campaignId)
external
view
returns (Donation[] memory)
{
return campaignDonations[_campaignId];
}
// ๊ธฐ๋ถ์๊ฐ ์ฐธ์ฌํ ์บ ํ์ธ ๋ชฉ๋ก
function getDonorCampaigns(address _donor)
external
view
returns (uint256[] memory)
{
return donorCampaigns[_donor];
}
// ํ๋ซํผ ์์๋ฃ ๋ณ๊ฒฝ (๊ด๋ฆฌ์๋ง)
function setPlatformFee(uint256 _newFeePercent) external onlyOwner {
require(_newFeePercent <= 5, "์์๋ฃ๋ 5%๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค");
platformFeePercent = _newFeePercent;
}
}
์... ์ฝ๋ ๊ธธ์ฃ ? ใ ใ ใ ๊ทผ๋ฐ ์ด๊ฒ ๋ค ํ์ํ ๊ธฐ๋ฅ๋ค์ด์์! ํ๋์ฉ ๋ฏ์ด๋ณด๋ฉด:
๐ ์ฝ๋ ์ฃผ์ ๊ธฐ๋ฅ ์ค๋ช :
โ
createCampaign: ์๋ก์ด ๊ธฐ๋ถ ์บ ํ์ธ ์์ฑ
โ
donate: ํน์ ์บ ํ์ธ์ ๊ธฐ๋ถํ๊ธฐ
โ
withdrawFunds: ๋ชฉํ ๋ฌ์ฑ ํ ๊ธฐ๋ถ๊ธ ์ธ์ถ
โ
getCampaignDetails: ์บ ํ์ธ ์์ธ ์ ๋ณด ์กฐํ
โ
getCampaignDonations: ๋ชจ๋ ๊ธฐ๋ถ ๋ด์ญ ํฌ๋ช
ํ๊ฒ ๊ณต๊ฐ
โ
ReentrancyGuard: ์ฌ์ง์
๊ณต๊ฒฉ ๋ฐฉ์ง (๋ณด์!)
โ
Ownable: ๊ด๋ฆฌ์ ๊ถํ ๊ด๋ฆฌ
Step 3: ํ๋ก ํธ์๋ ์ฐ๋
์ด์ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ์น ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ์! React๋ก ์์๋ฅผ ๋ค์ด๋๋ฆด๊ฒ์. ๐จ
// DonationApp.jsx
import React, { useState, useEffect } from 'react';
import { ethers } from 'ethers';
import TransparentDonationABI from './contracts/TransparentDonation.json';
const CONTRACT_ADDRESS = "0x..."; // ๋ฐฐํฌ๋ ์ปจํธ๋ํธ ์ฃผ์
function DonationApp() {
const [provider, setProvider] = useState(null);
const [signer, setSigner] = useState(null);
const [contract, setContract] = useState(null);
const [account, setAccount] = useState('');
const [campaigns, setCampaigns] = useState([]);
const [loading, setLoading] = useState(false);
// ์ง๊ฐ ์ฐ๊ฒฐ
const connectWallet = async () => {
try {
if (window.ethereum) {
const provider = new ethers.providers.Web3Provider(window.ethereum);
await provider.send("eth_requestAccounts", []);
const signer = provider.getSigner();
const address = await signer.getAddress();
const contract = new ethers.Contract(
CONTRACT_ADDRESS,
TransparentDonationABI.abi,
signer
);
setProvider(provider);
setSigner(signer);
setContract(contract);
setAccount(address);
console.log("์ง๊ฐ ์ฐ๊ฒฐ ์ฑ๊ณต:", address);
} else {
alert("MetaMask๋ฅผ ์ค์นํด์ฃผ์ธ์!");
}
} catch (error) {
console.error("์ง๊ฐ ์ฐ๊ฒฐ ์คํจ:", error);
}
};
// ์บ ํ์ธ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ
const loadCampaigns = async () => {
if (!contract) return;
setLoading(true);
try {
const campaignCount = await contract.campaignCounter();
const campaignList = [];
for (let i = 0; i < campaignCount; i++) {
const details = await contract.getCampaignDetails(i);
campaignList.push({
id: i,
name: details.name,
description: details.description,
beneficiary: details.beneficiary,
goalAmount: ethers.utils.formatEther(details.goalAmount),
currentAmount: ethers.utils.formatEther(details.currentAmount),
deadline: new Date(details.deadline * 1000),
isActive: details.isActive,
donationCount: details.donationCount.toNumber()
});
}
setCampaigns(campaignList);
} catch (error) {
console.error("์บ ํ์ธ ๋ก๋ฉ ์คํจ:", error);
}
setLoading(false);
};
// ๊ธฐ๋ถํ๊ธฐ
const makeDonation = async (campaignId, amount) => {
if (!contract) return;
try {
const tx = await contract.donate(campaignId, {
value: ethers.utils.parseEther(amount)
});
console.log("ํธ๋์ญ์
์ ์ก:", tx.hash);
await tx.wait();
console.log("๊ธฐ๋ถ ์๋ฃ!");
// ์บ ํ์ธ ๋ชฉ๋ก ์๋ก๊ณ ์นจ
await loadCampaigns();
} catch (error) {
console.error("๊ธฐ๋ถ ์คํจ:", error);
alert("๊ธฐ๋ถ์ ์คํจํ์ต๋๋ค: " + error.message);
}
};
// ์บ ํ์ธ ์์ฑ
const createCampaign = async (name, description, beneficiary, goal, days) => {
if (!contract) return;
try {
const tx = await contract.createCampaign(
name,
description,
beneficiary,
ethers.utils.parseEther(goal),
days
);
await tx.wait();
console.log("์บ ํ์ธ ์์ฑ ์๋ฃ!");
await loadCampaigns();
} catch (error) {
console.error("์บ ํ์ธ ์์ฑ ์คํจ:", error);
}
};
useEffect(() => {
if (contract) {
loadCampaigns();
}
}, [contract]);
return (
<div className="app-container">
<header>
<h1>๐ ํฌ๋ช
ํ ๊ธฐ๋ถ ํ๋ซํผ</h1>
{!account ? (
<button onClick={connectWallet}>
์ง๊ฐ ์ฐ๊ฒฐํ๊ธฐ
</button>
) : (
<p>์ฐ๊ฒฐ๋ ์ง๊ฐ: {account.slice(0, 6)}...{account.slice(-4)}</p>
)}
</header>
<main>
{loading ? (
<p>๋ก๋ฉ ์ค...</p>
) : (
<div className="campaigns-grid">
{campaigns.map(campaign => (
<CampaignCard
key={campaign.id}
campaign={campaign}
onDonate={makeDonation}
/>
))}
</div>
)}
</main>
</div>
);
}
// ์บ ํ์ธ ์นด๋ ์ปดํฌ๋ํธ
function CampaignCard({ campaign, onDonate }) {
const [donationAmount, setDonationAmount] = useState('');
const progress = (campaign.currentAmount / campaign.goalAmount) * 100;
return (
<div className="campaign-card">
<h3>{campaign.name}</h3>
<p>{campaign.description}</p>
<div className="progress-bar">
<div
className="progress-fill"
style={{ width: `${Math.min(progress, 100)}%` }}
/>
</div>
<div className="campaign-stats">
<p>๋ชฉํ: {campaign.goalAmount} ETH</p>
<p>ํ์ฌ: {campaign.currentAmount} ETH</p>
<p>์งํ๋ฅ : {progress.toFixed(1)}%</p>
<p>๊ธฐ๋ถ์ ์: {campaign.donationCount}๋ช
</p>
</div>
{campaign.isActive && (
<div className="donation-input">
<input
type="number"
step="0.01"
placeholder="๊ธฐ๋ถ ๊ธ์ก (ETH)"
value={donationAmount}
onChange={(e) => setDonationAmount(e.target.value)}
/>
<button
onClick={() => {
onDonate(campaign.id, donationAmount);
setDonationAmount('');
}}
>
๊ธฐ๋ถํ๊ธฐ
</button>
</div>
)}
</div>
);
}
export default DonationApp;
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ๊ธฐ๋ถํ ์ ์๋ ์น์ฑ์ด ์์ฑ๋ผ์! ์ง์ง ์ ๊ธฐํ์ฃ ? ใ ใ ใ ๐
๐ฏ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ค
์ด๋ก ๋ง ๋ณด๋ฉด ์ฌ๋ฏธ์์ผ๋๊น, ์ค์ ๋ก Web3 ๊ธฐ๋ถ ์์คํ ์ด ์ด๋ป๊ฒ ํ์ฉ๋๊ณ ์๋์ง ๋ณผ๊น์? ๐
๐ ์ฐํฌ๋ผ์ด๋ ์ ์ ๊ตฌํธ ๊ธฐ๊ธ
2022๋ ์ฐํฌ๋ผ์ด๋ ์ ์์ด ๋ฐ๋ฐํ์ ๋, ์ฐํฌ๋ผ์ด๋ ์ ๋ถ๋ ์ํธํํ๋ก ์ง์ ๊ธฐ๋ถ๋ฅผ ๋ฐ์์ด์. ์ ํต์ ์ธ ์ํ ์์คํ ์ด ๋ง๋น๋ ์ํฉ์์ Web3 ๊ธฐ์ ์ด ๋น์ ๋ฐํ ๊ฑฐ์ฃ ! ๐ช
โจ ์ฑ๊ณผ:
โข ์ฒซ 48์๊ฐ ๋ด์ $10M ์ด์ ๋ชจ๊ธ
โข 60๊ฐ๊ตญ ์ด์์์ ๊ธฐ๋ถ ์ฐธ์ฌ
โข ํ๊ท ์ฒ๋ฆฌ ์๊ฐ: 10๋ถ ์ด๋ด
โข ๋ชจ๋ ๊ฑฐ๋ ๋ด์ญ ๋ธ๋ก์ฒด์ธ์์ ์ค์๊ฐ ํ์ธ ๊ฐ๋ฅ
โข ์ค๊ฐ ์์๋ฃ ๊ฑฐ์ ์์ด ์ง์ ์ ๋ฌ
์ฐํฌ๋ผ์ด๋ ์ ๋ถ๋ ๊ณต์ ์ด๋๋ฆฌ์ ์ฃผ์๋ฅผ ๊ณต๊ฐํ๊ณ , ๋๊ตฌ๋ ํด๋น ์ฃผ์๋ก ์ง์ ๊ธฐ๋ถํ ์ ์์์ด์. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฌ๋์ด Etherscan ๊ฐ์ ๋ธ๋ก์ฒด์ธ ํ์๊ธฐ์์ ์ค์๊ฐ์ผ๋ก ๊ธฐ๋ถ๊ธ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ํ์ธํ ์ ์์์ฃ ! ๐
๐ณ ํ๊ฒฝ ๋ณดํธ ํ๋ก์ ํธ
Gitcoin Grants ๊ฐ์ ํ๋ซํผ์์๋ ํ๊ฒฝ ๋ณดํธ, ์คํ์์ค ๊ฐ๋ฐ ๋ฑ ๊ณต๊ณต์ฌ ํ๋ก์ ํธ์ Web3 ๊ธฐ๋ฐ ๊ธฐ๋ถ ์์คํ ์ ํ์ฉํ๊ณ ์์ด์. ํนํ Quadratic Funding์ด๋ผ๋ ํ์ ์ ์ธ ๋ฐฉ์์ ์ฌ์ฉํด์! ๐ฑ
๐งฎ Quadratic Funding์ด๋?
๊ธฐ๋ถ์ ์๊ฐ ๋ง์์๋ก ๋งค์นญ ํ๋๋ฅผ ๋ ๋ง์ด ๋ฐ๋ ์์คํ
์ด์์. ์๋ฅผ ๋ค์ด:
โข ํ๋ก์ ํธ A: 10๋ช
์ด ๊ฐ๊ฐ $10 ๊ธฐ๋ถ = ์ด $100
โข ํ๋ก์ ํธ B: 1๋ช
์ด $100 ๊ธฐ๋ถ = ์ด $100
๊ฐ์ ๊ธ์ก์ด์ง๋ง, ํ๋ก์ ํธ A๊ฐ ๋ ๋ง์ ๋งค์นญ ํ๋๋ฅผ ๋ฐ์์! ์๋ํ๋ฉด ๋ ๋ง์ ์ฌ๋๋ค์ ์ง์ง๋ฅผ ๋ฐ์์ผ๋๊น์. ์ด๋ ๊ฒ ํ๋ฉด ์ง์ง ๊ณต๊ณต์ ์ด์ต์ด ๋๋ ํ๋ก์ ํธ๊ฐ ๋ ๋ง์ ์ง์์ ๋ฐ๊ฒ ๋๋ ๊ฑฐ์ฃ ! ๐ฏ
๐ฅ ์๋ฃ ํฌ๋ผ์ฐ๋ํ๋ฉ
๊ฐ๋ฐ๋์๊ตญ์์๋ ์ํ ๊ณ์ข๊ฐ ์๋ ์ฌ๋๋ค์ด ๋ง์์. ํ์ง๋ง ์ค๋งํธํฐ์ ์์ฃ ! Web3 ๊ธฐ๋ถ ์์คํ ์ ํ์ฉํ๋ฉด ์ํ ๊ณ์ข ์์ด๋ ์ ์ธ๊ณ์์ ์๋ฃ๋น ์ง์์ ๋ฐ์ ์ ์์ด์. ๐ฅ
์ค์ ์ฌ๋ก: ์ํ๋ฆฌ์นด ์๋ฃ ์ง์
์ผ๋์ ํ ๋ณ์์์ Web3 ๊ธฐ๋ถ ์์คํ
์ ๋์
ํ ๊ฒฐ๊ณผ:
๐ ๊ธฐ๋ถ๊ธ 30% ์ฆ๊ฐ
โก ์๊ธ ๋์ฐฉ ์๊ฐ 7์ผ โ 1์๊ฐ์ผ๋ก ๋จ์ถ
๐ฐ ์ค๊ฐ ์์๋ฃ 15% โ 2%๋ก ๊ฐ์
๐๏ธ ๊ธฐ๋ถ์๋ค์ ์ ๋ขฐ๋ ํฌ๊ฒ ํฅ์
๐ ๊ตญ์ ๊ธฐ๋ถ์ ๋น์จ 3๋ฐฐ ์ฆ๊ฐ
โ ๏ธ ์ฃผ์์ฌํญ๊ณผ ํ๊ณ์
๋ฌผ๋ก Web3 ๊ธฐ๋ถ ์์คํ ์ด ์๋ฒฝํ ๊ฑด ์๋์์. ๋ช ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ๋ค์ด ์์ด์! ๐ค
โ ๏ธ ๊ธฐ์ ์ ์ง์ ์ฅ๋ฒฝ
์์งํ ์ผ๋ฐ ์ฌ๋๋คํํ "์ง๊ฐ ๋ง๋ค๊ณ , ์๋ ๊ตฌ๋ฌธ ๋ฐฑ์ ํ๊ณ , ๊ฐ์ค๋น ํ์ธํ๊ณ ..." ์ด๋ฐ ๊ฑฐ ์ค๋ช ํ๋ฉด ๋จธ๋ฆฌ ์ํํด์ ใ ใ ใ ํนํ ๋์ด ๋์ ๋ถ๋ค์ ๋ ์ด๋ ค์ํ์์ฃ . ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด UX/UI๋ฅผ ์ต๋ํ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด์ผ ํด์!
โ ๏ธ ๊ฐ์ค๋น ๋ฌธ์
์ด๋๋ฆฌ์ ๋ฉ์ธ๋ท์์ ๊ฑฐ๋ํ๋ฉด ๊ฐ์ค๋น๊ฐ ์ฅ๋ ์๋์์. ์์ ๊ธ์ก ๊ธฐ๋ถํ ๋ ๊ฐ์ค๋น๊ฐ ๋ ๋น์ธ๋ฉด ๋ง์ด ์ ๋์์์? ๐ ๊ทธ๋์ ์์ฆ์ Polygon, Optimism ๊ฐ์ Layer 2 ์๋ฃจ์ ์ ๋ง์ด ์จ์. ๊ฐ์ค๋น๊ฐ ๊ฑฐ์ 0์ ๊ฐ๊น์์!
โ ๏ธ ๋ฒ์ ๊ท์
๋๋ผ๋ง๋ค ์ํธํํ ๊ด๋ จ ๋ฒ๊ท๊ฐ ๋ค๋ฅด๊ณ , ๊ณ์ ๋ฐ๋๊ณ ์์ด์. ํนํ ๊ธฐ๋ถ๊ธ ์ธ๊ธ ๊ณต์ ๊ฐ์ ๋ถ๋ถ์์ ์์ง ๋ช ํํ์ง ์์ ๋ถ๋ถ์ด ๋ง์์. ํ๋ก์ ํธ ์์ํ๊ธฐ ์ ์ ๋ฐ๋์ ๋ฒ๋ฅ ์๋ฌธ์ ๋ฐ์์ผ ํด์! โ๏ธ
โ ๏ธ ๊ฐ๊ฒฉ ๋ณ๋์ฑ
์ํธํํ๋ ๊ฐ๊ฒฉ์ด ์์ฒญ ์ค๋ฅด๋ฝ๋ด๋ฆฌ๋ฝํ์์์? ์ค๋ 1 ETH๊ฐ $2000์ธ๋ฐ ๋ด์ผ $1500์ด ๋ ์๋ ์์ด์. ๊ธฐ๋ถ๋ฐ์ ๋์ ๊ฐ์น๊ฐ ๊ณ์ ๋ณํ๋ ๊ฑฐ์ฃ . ์ด ๋ฌธ์ ๋ ์คํ ์ด๋ธ์ฝ์ธ(USDC, DAI ๋ฑ)์ ์ฌ์ฉํ๋ฉด ์ด๋ ์ ๋ ํด๊ฒฐํ ์ ์์ด์! ๐ต
โ ๏ธ ์ค๋งํธ ์ปจํธ๋ํธ ๋ฒ๊ทธ
์ฝ๋์ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉด ํฐ์ผ ๋์! ํ๋ฒ ๋ฐฐํฌ๋ ์ปจํธ๋ํธ๋ ์์ ์ด ์ ๋๋๊น์. ์ค์ ๋ก ๊ณผ๊ฑฐ์ The DAO ํดํน ์ฌ๊ฑด์ฒ๋ผ ์๋ฐฑ์ต ์์ด ๋ ์๊ฐ ์ ๋ ์์ด์. ๊ทธ๋์ ๋ฐ๋์ ์ ๋ฌธ๊ฐ์ ๋ณด์ ๊ฐ์ฌ(Audit)๋ฅผ ๋ฐ์์ผ ํด์! ๐
๐ ๋ฏธ๋ ์ ๋ง๊ณผ ๋ฐ์ ๋ฐฉํฅ
Web3 ๊ธฐ๋ถ ์์คํ ์ ์์ง ์ด๊ธฐ ๋จ๊ณ์์. ์์ผ๋ก ์ด๋ป๊ฒ ๋ฐ์ ํ ๊น์? ์ ์๊ฐ์ ์ข ๋๋ ๋ณผ๊ฒ์! ๐ฎ
1๏ธโฃ AI์์ ๊ฒฐํฉ
AI๊ฐ ๊ธฐ๋ถ ํ๋ก์ ํธ์ ์ง์ ์ฑ์ ์๋์ผ๋ก ๊ฒ์ฆํ๊ณ , ์ฌ๊ธฐ๋ฅผ ํ์งํ๊ณ , ์ต์ ์ ๊ธฐ๋ถ์ฒ๋ฅผ ์ถ์ฒํด์ฃผ๋ ์์คํ ! ์์๋ง ํด๋ ๋ฉ์ง์ง ์์์? ๐คโจ
์์ ์๋๋ฆฌ์ค:
"AI์ผ, ํ๊ฒฝ ๋ณดํธ ๊ด๋ จํด์ ์ ๋ขฐํ ์ ์๋ ํ๋ก์ ํธ ์ถ์ฒํด์ค"
โ AI๊ฐ ๋ธ๋ก์ฒด์ธ ๋ฐ์ดํฐ ๋ถ์ํด์ ํฌ๋ช
์ฑ ๋์ ํ๋ก์ ํธ 5๊ฐ ์ถ์ฒ
โ ๊ฐ ํ๋ก์ ํธ์ ๊ณผ๊ฑฐ ์ฑ๊ณผ, ์๊ธ ์ฌ์ฉ ๋ด์ญ, ์ปค๋ฎค๋ํฐ ํ๊ฐ ๋ฑ์ ์ข
ํฉ์ ์ผ๋ก ๋ณด์ฌ์ค
โ ์ํด๋ฆญ์ผ๋ก ๊ธฐ๋ถ ์๋ฃ! ๐ฏ
2๏ธโฃ DAO ๊ธฐ๋ฐ ๊ฑฐ๋ฒ๋์ค
๊ธฐ๋ถ์๋ค์ด ์ง์ ํฌํ๋ก ๊ธฐ๋ถ๊ธ ์ฌ์ฉ์ฒ๋ฅผ ๊ฒฐ์ ํ๋ ์์คํ ! DAO(Decentralized Autonomous Organization)๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฅํด์. ๐ณ๏ธ
// DAO ํฌํ ์ปจํธ๋ํธ ์์
contract DonationDAO {
struct Proposal {
string description;
address payable recipient;
uint256 amount;
uint256 voteCount;
bool executed;
mapping(address => bool) voters;
}
mapping(uint256 => Proposal) public proposals;
uint256 public proposalCount;
// ์ ์ ์์ฑ
function createProposal(
string memory _description,
address payable _recipient,
uint256 _amount
) external {
// ์ ์ ์์ฑ ๋ก์ง
}
// ํฌํํ๊ธฐ
function vote(uint256 _proposalId) external {
// ํฌํ ๋ก์ง
}
// ์ ์ ์คํ
function executeProposal(uint256 _proposalId) external {
// ๊ณผ๋ฐ์ ์ฐฌ์ฑ ์ ์๋ ์คํ
}
}
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ถ์๋ค์ด ์ง์ง ์ฃผ์ธ์ด ๋๋ ๊ฑฐ์์! ๋ฏผ์ฃผ์ ์ด๊ณ ํฌ๋ช ํ์ฃ ? ๐
3๏ธโฃ NFT ํ์ฉ
๊ธฐ๋ถํ๋ฉด NFT๋ฅผ ๋ฐ๋ ์์คํ ! ์ด๊ฒ ๋จ์ํ ์์์ฆ์ด ์๋๋ผ, ํน๋ณํ ํํ์ด๋ ์ปค๋ฎค๋ํฐ ๋ฉค๋ฒ์ญ์ผ๋ก ํ์ฉ๋ ์ ์์ด์. ๐จ
๐
๊ธฐ๋ถ ๋ฐฐ์ง NFT
๊ธฐ๋ถ ๊ธ์ก์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฑ๊ธ์ NFT ๋ฐฐ์ง ๋ฐ๊ธ
๐ซ
๋ฉค๋ฒ์ญ NFT
ํน๋ณ ์ด๋ฒคํธ ์ฐธ์ฌ๊ถ, ํฌํ๊ถ ๋ฑ ๋ถ์ฌ
๐ผ๏ธ
์ํธ NFT
์ ๋ช ์ํฐ์คํธ ํ์ ์ผ๋ก ์์ง ๊ฐ์น ์๋ NFT ์ ๊ณต
๐
์๊ตฌ ๊ธฐ๋ก NFT
๊ธฐ๋ถ ๋ด์ญ์ด ์์ํ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ก
4๏ธโฃ ํฌ๋ก์ค์ฒด์ธ ํตํฉ
์ง๊ธ์ ์ด๋๋ฆฌ์, ํด๋ฆฌ๊ณค, BSC ๋ฑ ๊ฐ ์ฒด์ธ์ด ๋ฐ๋ก ๋์์์? ์์ผ๋ก๋ ์ฌ๋ฌ ๋ธ๋ก์ฒด์ธ์ ๋๋๋ค๋ฉฐ ๊ธฐ๋ถํ ์ ์๊ฒ ๋ ๊ฑฐ์์! ๐
๐ก ํฌ๋ก์ค์ฒด์ธ ๋ธ๋ฆฟ์ง ๊ธฐ์ :
โข LayerZero, Wormhole ๊ฐ์ ํ๋กํ ์ฝ ํ์ฉ
โข ์ฌ์ฉ์๋ ์ด๋ค ์ฒด์ธ์ธ์ง ์ ๊ฒฝ ์ธ ํ์ ์์
โข ์๋์ผ๋ก ์ต์ ์ ๊ฒฝ๋ก์ ์์๋ฃ ์ ํ
โข ๋ ๋น ๋ฅด๊ณ ์ ๋ ดํ ๊ฑฐ๋ ๊ฐ๋ฅ
5๏ธโฃ ์ค๋ฌผ ์์ฐ ์ฐ๋
๋ธ๋ก์ฒด์ธ๊ณผ ์ค์ ์ธ๊ณ๋ฅผ ์ฐ๊ฒฐํ๋ ์ค๋ผํด(Oracle) ๊ธฐ์ ์ ํ์ฉํ๋ฉด, ๊ธฐ๋ถ๊ธ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋์๋์ง ์๋์ผ๋ก ๊ฒ์ฆํ ์ ์์ด์! ๐ก
์์: ํ๊ต ๊ฑด์ค ํ๋ก์ ํธ
1๏ธโฃ ๊ธฐ๋ถ๊ธ ๋ชจ๊ธ ์๋ฃ
2๏ธโฃ ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ๊ฑด์ค์ฌ์ ์๊ธ ์ ๋ฌ
3๏ธโฃ IoT ์ผ์๊ฐ ๊ฑด์ค ์งํ ์ํฉ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
4๏ธโฃ ์ค๋ผํด์ด ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ก
5๏ธโฃ ๊ธฐ๋ถ์๋ค์ด ์ฑ์์ ์ค์๊ฐ ์งํ ์ํฉ ํ์ธ
6๏ธโฃ ๊ฑด์ค ์๋ฃ ์ ์๋์ผ๋ก ์ธ์ฆ์ ๋ฐ๊ธ
์์ ๋ฏธ๋์ ์ด์ฃ ? ใ ใ ใ ์ด๊ฒ ๋ค ๊ฐ๋ฅํ ์๋๊ฐ ์ค๊ณ ์์ด์! ๐
๐ผ ์ค๋ฌด์์ ์์ํ๊ธฐ
์, ์ด์ ์ฌ๋ฌ๋ถ์ด ์ง์ Web3 ๊ธฐ๋ถ ์์คํ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ์์ํด์ผ ํ ๊น์? ๋จ๊ณ๋ณ๋ก ์๋ ค๋๋ฆด๊ฒ์! ๐
๐ ํ์ต ๋ก๋๋งต
Phase 1: ๊ธฐ์ด ๋ค์ง๊ธฐ (1-2๊ฐ์)
๐ JavaScript ๊ธฐ๋ณธ ๋ฌธ๋ฒ
๐ ๋ธ๋ก์ฒด์ธ ๊ฐ๋
์ดํด
๐ ์ด๋๋ฆฌ์ ์๋ ์๋ฆฌ
๐ Web3 ์ํ๊ณ ํ์
๐ MetaMask ์ฌ์ฉ๋ฒ
Phase 2: ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ๋ฐ (2-3๊ฐ์)
๐ป Solidity ์ธ์ด ํ์ต
๐ป Remix IDE ํ์ฉ
๐ป OpenZeppelin ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๐ป ํ
์คํธ๋ท์์ ์ค์ต
๐ป ๊ฐ๋จํ ์ปจํธ๋ํธ ๋ฐฐํฌ ๊ฒฝํ
Phase 3: ํ์คํ ๊ฐ๋ฐ (2-3๊ฐ์)
๐ React/Vue.js ํ๋ก ํธ์๋
๐ Web3.js/Ethers.js ์ฐ๋
๐ IPFS ํ์ผ ์ ์ฅ
๐ The Graph๋ก ๋ฐ์ดํฐ ์ฟผ๋ฆฌ
๐ ์์ ํ DApp ๊ตฌ์ถ
Phase 4: ๊ณ ๊ธ ๊ธฐ๋ฅ (3-4๊ฐ์)
๐ ๋ณด์ ๊ฐ์ฌ ๋ฐ ์ต์ ํ
๐ ๊ฐ์ค๋น ์ต์ ํ ๊ธฐ๋ฒ
๐ Layer 2 ์๋ฃจ์
์ ์ฉ
๐ DAO ๊ฑฐ๋ฒ๋์ค ๊ตฌํ
๐ ๋ฉ์ธ๋ท ๋ฐฐํฌ ๋ฐ ์ด์
์ด 8-12๊ฐ์ ์ ๋๋ฉด ์ถฉ๋ถํ ์ค๋ฌด ์์ค์ Web3 ๊ฐ๋ฐ์๊ฐ ๋ ์ ์์ด์! ๋ฌผ๋ก ๊ฐ์ธ์ฐจ๋ ์์ง๋ง์. ๐
๐ ๏ธ ์ถ์ฒ ํ์ต ๋ฆฌ์์ค
๐ ๋ฌด๋ฃ ํ์ต ์๋ฃ:
โข CryptoZombies - ๊ฒ์ํ๋ฏ Solidity ๋ฐฐ์ฐ๊ธฐ
โข Ethereum.org - ๊ณต์ ๋ฌธ์, ์ต๊ณ ์ ๋ ํผ๋ฐ์ค
โข Alchemy University - ๋ฌด๋ฃ Web3 ๊ฐ๋ฐ ๊ฐ์
โข Buildspace - ํ๋ก์ ํธ ๊ธฐ๋ฐ ํ์ต
โข YouTube - Patrick Collins, Dapp University ์ฑ๋
๐ฐ ์ ๋ฃ ๊ฐ์ (ํฌ์ ๊ฐ์น ์์):
โข Udemy - "Ethereum and Solidity: The Complete Developer's Guide"
โข Coursera - "Blockchain Specialization"
โข Moralis Academy - ์ค์ ์ค์ฌ ์ปค๋ฆฌํ๋ผ
โข ConsenSys Academy - ์ ๋ฌธ๊ฐ ๊ณผ์
๊ทธ๋ฆฌ๊ณ ํผ์ ๊ณต๋ถํ๊ธฐ ํ๋ค๋ค๋ฉด? ์ฌ๋ฅ๋ท์์ ๋ธ๋ก์ฒด์ธ ๋ฉํ ๋ฅผ ์ฐพ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์! ์ค๋ฌด ๊ฒฝํ ์๋ ๊ฐ๋ฐ์ํํ ์ง์ ๋ฐฐ์ฐ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์๊ฑฐ๋ ์. ๐ช
๐ค ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ
๊ฐ๋ฐ์ ํผ์ ํ๋ ๊ฒ ์๋์์! ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ๋ฉด ์์ฒญ๋ ๋์์ ๋ฐ์ ์ ์์ด์. ๐
๐ฌ
Discord
Ethereum, Polygon ๋ฑ ๊ฐ ํ๋ก์ ํธ ๊ณต์ ๋์ค์ฝ๋
๐ฆ
Web3 ๊ฐ๋ฐ์๋ค ํ๋ก์ฐํ๊ณ ์ต์ ํธ๋ ๋ ํ์
๐
Medium
๊ธฐ์ ๋ธ๋ก๊ทธ ์ฝ๊ณ ์ง์ ์์ฑํ๊ธฐ
๐ฎ
Hackathon
ETHGlobal ๋ฑ ํด์ปคํค ์ฐธ์ฌ๋ก ์ค์ ๊ฒฝํ
๐ก ์ค์ ํ๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค
์ด์ ์ค๋ฌด์์ ์ ๋ง ์ค์ํ ํ๋ค์ ๊ณต์ ํ ๊ฒ์! ์ด๊ฑฐ ๋ชจ๋ฅด๋ฉด ๋์ค์ ๊ณ ์ํด์ ใ ใ ใ ๐
๐ ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ
โ ๏ธ ๋ฐ๋์ ํ์ธํด์ผ ํ ๋ณด์ ์ฌํญ:
โ
Reentrancy ๊ณต๊ฒฉ ๋ฐฉ์ง - ReentrancyGuard ์ฌ์ฉ
โ
Integer Overflow/Underflow - Solidity 0.8.0 ์ด์ ์ฌ์ฉ
โ
Access Control - Ownable, AccessControl ํจํด ์ ์ฉ
โ
Input Validation - require๋ฌธ์ผ๋ก ๋ชจ๋ ์
๋ ฅ๊ฐ ๊ฒ์ฆ
โ
External Call ์ฃผ์ - ์ ๋ขฐํ ์ ์๋ ์ปจํธ๋ํธ ํธ์ถ ์ต์ํ
โ
Gas Limit - ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง
โ
Private Key ๊ด๋ฆฌ - ์ ๋ ์ฝ๋์ ํ๋์ฝ๋ฉ ๊ธ์ง!
// ๋์ ์ โ
function withdraw() public {
uint amount = balances[msg.sender];
msg.sender.call{value: amount}(""); // ์ฌ์ง์
๊ณต๊ฒฉ ์ํ!
balances[msg.sender] = 0;
}
// ์ข์ ์ โ
function withdraw() public nonReentrant {
uint amount = balances[msg.sender];
balances[msg.sender] = 0; // ์ํ ๋จผ์ ๋ณ๊ฒฝ
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
}
โก ๊ฐ์ค๋น ์ต์ ํ
๊ฐ์ค๋น๋ ๋์ด์์! ์ต์ ํ ์ ํ๋ฉด ์ฌ์ฉ์๋ค์ด ์ ์จ์. ์ง์ง๋ก! ๐ธ
๊ฐ์ค๋น ์ ์ฝ ํ ํฌ๋:
1๏ธโฃ uint256 ๋์ uint8 ๊ฐ์ ์์ ํ์
์ฌ์ฉ (๊ฐ๋ฅํ ๊ฒฝ์ฐ)
2๏ธโฃ ๋ฐฐ์ด ๋์ mapping ์ฌ์ฉ
3๏ธโฃ ๋ถํ์ํ storage ๋ณ์ ์ ๊ฑฐ
4๏ธโฃ ํจ์๋ฅผ external๋ก ์ ์ธ (public๋ณด๋ค ์ ๋ ด)
5๏ธโฃ ์งง์ ์๋ฌ ๋ฉ์์ง ์ฌ์ฉ
6๏ธโฃ ๋ณ์ ํจํน ํ์ฉ
7๏ธโฃ ๋ถํ์ํ ์ด๋ฒคํธ emit ์ค์ด๊ธฐ
// ๊ฐ์ค๋น ์ต์ ํ ์์
contract OptimizedDonation {
// ๋ณ์ ํจํน - ๊ฐ์ ์ฌ๋กฏ์ ์ ์ฅ
struct Donor {
address addr; // 20 bytes
uint96 amount; // 12 bytes (์ด 32 bytes = 1 ์ฌ๋กฏ)
}
// mapping์ด ๋ฐฐ์ด๋ณด๋ค ๊ฐ์ค๋น ์ ๋ ด
mapping(address => uint256) public donations;
// external์ด public๋ณด๋ค ์ ๋ ด
function donate() external payable {
donations[msg.sender] += msg.value;
}
// view ํจ์๋ ๊ฐ์ค๋น ์์
function getDonation(address _donor) external view returns (uint256) {
return donations[_donor];
}
}
๐งช ํ ์คํธ ์ ๋ต
ํ ์คํธ ์ ํ๊ณ ๋ฉ์ธ๋ท์ ๋ฐฐํฌํ๋ฉด... ๋งํด์ ใ ใ ใ ์ง์ง๋ก! ๐ฑ
โ ํ ์คํธ ์ฒดํฌ๋ฆฌ์คํธ:
1. Unit Test - ๊ฐ ํจ์ ๊ฐ๋ณ ํ
์คํธ
2. Integration Test - ์ปจํธ๋ํธ ๊ฐ ์ํธ์์ฉ ํ
์คํธ
3. Edge Case Test - ๊ทน๋จ์ ์ธ ์ํฉ ํ
์คํธ
4. Fuzz Test - ๋๋ค ์
๋ ฅ๊ฐ์ผ๋ก ํ
์คํธ
5. Gas Report - ๊ฐ์ค ์ฌ์ฉ๋ ๋ถ์
6. Security Audit - ์ ๋ฌธ๊ฐ ๋ณด์ ๊ฐ์ฌ
7. Testnet Deploy - ํ
์คํธ๋ท์์ ์ค์ ์ฌ์ฉ ์๋ฎฌ๋ ์ด์
// Hardhat ํ
์คํธ ์์
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("TransparentDonation", function () {
let donation;
let owner, donor1, donor2, beneficiary;
beforeEach(async function () {
[owner, donor1, donor2, beneficiary] = await ethers.getSigners();
const Donation = await ethers.getContractFactory("TransparentDonation");
donation = await Donation.deploy();
await donation.deployed();
});
it("์บ ํ์ธ ์์ฑ ํ
์คํธ", async function () {
const tx = await donation.createCampaign(
"ํ
์คํธ ์บ ํ์ธ",
"์ค๋ช
",
beneficiary.address,
ethers.utils.parseEther("10"),
30
);
expect(await donation.campaignCounter()).to.equal(1);
});
it("๊ธฐ๋ถ ํ
์คํธ", async function () {
await donation.createCampaign(
"ํ
์คํธ",
"์ค๋ช
",
beneficiary.address,
ethers.utils.parseEther("10"),
30
);
await donation.connect(donor1).donate(0, {
value: ethers.utils.parseEther("1")
});
const campaign = await donation.getCampaignDetails(0);
expect(campaign.currentAmount).to.equal(ethers.utils.parseEther("1"));
});
it("์ฌ์ง์
๊ณต๊ฒฉ ๋ฐฉ์ง ํ
์คํธ", async function () {
// ์
์์ ์ธ ์ปจํธ๋ํธ๋ก ์ฌ์ง์
์๋
// ์คํจํด์ผ ํจ
});
it("๊ฐ์ค๋น ์ธก์ ", async function () {
const tx = await donation.connect(donor1).donate(0, {
value: ethers.utils.parseEther("1")
});
const receipt = await tx.wait();
console.log("Gas used:", receipt.gasUsed.toString());
});
});
๐ ๋ชจ๋ํฐ๋ง๊ณผ ์ ์ง๋ณด์
๋ฐฐํฌํ๊ณ ๋์ด ์๋์์! ๊ณ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํด์ผ ํด์. ๐
๐ก ๋ชจ๋ํฐ๋ง ๋๊ตฌ:
โข Tenderly - ์ค์๊ฐ ํธ๋์ญ์
๋ชจ๋ํฐ๋ง, ์๋ฆผ ์ค์
โข Dune Analytics - ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋์๋ณด๋
โข The Graph - ๋ธ๋ก์ฒด์ธ ๋ฐ์ดํฐ ์ธ๋ฑ์ฑ
โข Defender - OpenZeppelin์ ๋ณด์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ
โข Etherscan - ๊ธฐ๋ณธ์ ์ธ ํธ๋์ญ์
์ถ์
๐ ์ฑ๊ณต ์ฌ๋ก ์ฌ์ธต ๋ถ์
์ด๋ก ๋ง ๋ณด๋ฉด ์ฌ๋ฏธ์์ผ๋๊น, ์ค์ ์ฑ๊ณตํ ํ๋ก์ ํธ๋ค์ ์์ธํ ๋ฏ์ด๋ณผ๊น์? ๐ฌ
๐ฏ Gitcoin Grants
Gitcoin์ Web3 ๊ธฐ๋ถ ํ๋ซํผ์ ๋ํ์ฃผ์์์! ์คํ์์ค ํ๋ก์ ํธ์ ๊ณต๊ณต์ฌ์ ์๊ธ์ ์ง์ํ๋ ํ๋ซํผ์ธ๋ฐ, ์ ๋ง ํ์ ์ ์ธ ๋ฐฉ์์ ์ฌ์ฉํด์. ๐
๐ Gitcoin์ ์ฑ๊ณผ:
โข ๋์ ๊ธฐ๋ถ๊ธ: $72M ์ด์
โข ์ง์๋ฐ์ ํ๋ก์ ํธ: 3,500๊ฐ ์ด์
โข ์ฐธ์ฌ ๊ธฐ๋ถ์: 300,000๋ช
์ด์
โข ํ๊ท ๋งค์นญ ๋น์จ: 1:10 (๊ธฐ๋ถ์ $1 โ ํ๋ก์ ํธ $10 ์๋ น)
โข ๋ถ๊ธฐ๋ณ ๋ผ์ด๋: ํ๊ท $2M ๋ถ๋ฐฐ
ํต์ฌ ์ ๋ต:
1๏ธโฃ Quadratic Funding - ์์์ ์ค๋ช
ํ ๊ทธ ํ์ ์ ์ธ ๋ฐฉ์!
2๏ธโฃ Gitcoin Passport - ์๋น ๊ณต๊ฒฉ ๋ฐฉ์ง๋ฅผ ์ํ ์ ์ ๊ฒ์ฆ
3๏ธโฃ ์ปค๋ฎค๋ํฐ ๊ฑฐ๋ฒ๋์ค - GTC ํ ํฐ ํ๋๋ค์ด ์์ฌ๊ฒฐ์
4๏ธโฃ ๋ค์ํ ์ฒด์ธ ์ง์ - Ethereum, Polygon, zkSync ๋ฑ
๐ Giveth
Giveth๋ "๊ธฐ๋ถ์ ๋ฏธ๋"๋ฅผ ๋ง๋ค๊ณ ์๋ ํ๋ซํผ์ด์์. ํนํ GIVeconomy๋ผ๋ ๋ ํนํ ํ ํฐ ์ด์ฝ๋ ธ๋ฏธ๋ฅผ ์ด์ํด์! ๐ฐ
Giveth์ ํ์ ์ ์ธ ๊ธฐ๋ฅ:
โข GIVbacks - ๊ธฐ๋ถํ๋ฉด GIV ํ ํฐ์ ๋๋ ค๋ฐ์
โข GIVstream - ์๊ฐ์ด ์ง๋ ์๋ก ๋ ๋ง์ ํ ํฐ ์ธ๋ฝ
โข GIVgarden - ์ปค๋ฎค๋ํฐ ๊ฑฐ๋ฒ๋์ค ํ๋ซํผ
โข GIVfarm - ์ ๋์ฑ ์ ๊ณต์ผ๋ก ์ถ๊ฐ ๋ณด์
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ถ์๋ค์ด ๋จ์ํ ๋์ ์ฃผ๋ ๊ฒ ์๋๋ผ, ์ํ๊ณ์ ์ผ์์ด ๋๋ ๊ฑฐ์์! ์์ ๋๋ํ์ฃ ? ๐ง
๐ฅ The Giving Block
์ ํต์ ์ธ ๋น์๋ฆฌ ๋จ์ฒด๋ค์ด ์ํธํํ ๊ธฐ๋ถ๋ฅผ ๋ฐ์ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ซํผ์ด์์. ๊ธฐ์ ์ฅ๋ฒฝ์ ๋ฎ์ถฐ์ ๋๊ตฌ๋ ์ฝ๊ฒ ์ฐธ์ฌํ ์ ์๊ฒ ๋ง๋ค์์ด์! ๐
โจ The Giving Block์ ์ ๋ต:
โข 1,000๊ฐ ์ด์์ ๋น์๋ฆฌ ๋จ์ฒด ์จ๋ณด๋ฉ
โข ์ธ๊ธ ๊ณต์ ์๋ ์ฒ๋ฆฌ ์์คํ
โข ์ํธํํ โ ๋ฒ์ ํํ ์๋ ์ ํ ์ต์
โข ๊ธฐ๋ถ์ ๊ต์ก ํ๋ก๊ทธ๋จ ์ด์
โข ๊ธฐ์
CSR ํ๋ก๊ทธ๋จ๊ณผ ์ฐ๊ณ
๐จ UX/UI ๋์์ธ ๊ณ ๋ ค์ฌํญ
์๋ฌด๋ฆฌ ๊ธฐ์ ์ด ์ข์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ฐ๋ฉด ์์ฉ์์ด์! UX/UI๊ฐ ์ง์ง ์ค์ํด์. ๐
๐ต ์ ๊ทผ์ฑ ๊ฐ์
๐ฏ ์ผ๋ฐ ์ฌ์ฉ์๋ฅผ ์ํ ๋์์ธ:
1. ๊ฐ๋จํ ์จ๋ณด๋ฉ
- "์ง๊ฐ์ด ๋ญ์์?" ๊ฐ์ ์ง๋ฌธ์ ์น์ ํ ์ค๋ช
- ๋จ๊ณ๋ณ ๊ฐ์ด๋ ์ ๊ณต
- ๋น๋์ค ํํ ๋ฆฌ์ผ
2. ๋ช
ํํ ์ฉ์ด ์ฌ์ฉ
- "๊ฐ์ค๋น" โ "๊ฑฐ๋ ์์๋ฃ"
- "์ค๋งํธ ์ปจํธ๋ํธ" โ "์๋ ์คํ ํ๋ก๊ทธ๋จ"
- ์ ๋ฌธ ์ฉ์ด ์ต์ํ
3. ์๊ฐ์ ํผ๋๋ฐฑ
- ํธ๋์ญ์
์งํ ์ํฉ ์ค์๊ฐ ํ์
- ์ฑ๊ณต/์คํจ ๋ช
ํํ ์๋ฆผ
- ๋ก๋ฉ ์ ๋๋ฉ์ด์
4. ๋ค๊ตญ์ด ์ง์
- ํ๊ตญ์ด, ์์ด, ์ค๊ตญ์ด ๋ฑ
- ์ง์ญ๋ณ ๊ฒฐ์ ๋ฐฉ์ ์ง์
๐ฑ ๋ชจ๋ฐ์ผ ์ต์ ํ
์์ฆ ์ฌ๋๋ค์ ๊ฑฐ์ ๋ค ๋ชจ๋ฐ์ผ๋ก ์ ์ํ์์์? ๋ชจ๋ฐ์ผ UX๊ฐ ์ง์ง ์ค์ํด์! ๐ฑ
๐ก ๋ชจ๋ฐ์ผ ์ต์ ํ ์ฒดํฌ๋ฆฌ์คํธ:
โ
๋ฐ์ํ ๋์์ธ (๋ชจ๋ ํ๋ฉด ํฌ๊ธฐ ๋์)
โ
ํฐ์น ์นํ์ ์ธ ๋ฒํผ ํฌ๊ธฐ (์ต์ 44x44px)
โ
๋น ๋ฅธ ๋ก๋ฉ ์๋ (3์ด ์ด๋ด)
โ
์คํ๋ผ์ธ ๋ชจ๋ ์ง์
โ
ํธ์ ์๋ฆผ ๊ธฐ๋ฅ
โ
์์ฒด ์ธ์ฆ (์ง๋ฌธ, ์ผ๊ตด ์ธ์)
โ
QR ์ฝ๋ ์ค์บ ๊ธฐ๋ฅ
๐จ ์ ๋ขฐ๊ฐ ์ฃผ๋ ๋์์ธ
๊ธฐ๋ถ๋ ์ ๋ขฐ๊ฐ ์๋ช ์ด์์! ๋์์ธ์ผ๋ก ์ ๋ขฐ๊ฐ์ ์ค์ผ ํด์. ๐
๐
๋ณด์ ๋ฐฐ์ง
๊ฐ์ฌ ์๋ฃ, ์ธ์ฆ์ ๋ฑ ํ์
๐
ํฌ๋ช ํ ๋ฐ์ดํฐ
์ค์๊ฐ ํต๊ณ, ์ฐจํธ ์ ๊ณต
๐ฅ
์ฌํ์ ์ฆ๊ฑฐ
๋ค๋ฅธ ๊ธฐ๋ถ์ ํ๊ธฐ, ์ฐธ์ฌ ์ธ์
๐ธ
์ค์ ์ฌ์ง
์ํ์ ์ฌ์ง, ํ๋ก์ ํธ ์งํ ์ํฉ
๐ฐ ๋น์ฆ๋์ค ๋ชจ๋ธ๊ณผ ์์ตํ
์ข์ ์์คํ ์ ๋ง๋ค์์ผ๋ฉด ์ง์ ๊ฐ๋ฅํด์ผ๊ฒ ์ฃ ? ์ด๋ป๊ฒ ์์ต์ ๋ผ ์ ์์๊น์? ๐ค
๐ต ์์ต ๋ชจ๋ธ
| ๋ชจ๋ธ | ์ค๋ช | ์ฅ์ | ๋จ์ |
|---|---|---|---|
| ํ๋ซํผ ์์๋ฃ | ๊ธฐ๋ถ๊ธ์ 1-3% ์์๋ฃ | ์์ ์ ์ธ ์์ต | ๊ธฐ๋ถ์ ๋ถ๋ด ์ฆ๊ฐ |
| ํ๋ฆฌ๋ฏธ์ ๊ธฐ๋ฅ | ๊ณ ๊ธ ๋ถ์, ๋ง์ถค ๋ฆฌํฌํธ | ์ถ๊ฐ ๊ฐ์น ์ ๊ณต | ๊ฐ๋ฐ ๋น์ฉ ์ฆ๊ฐ |
| ๊ธฐ์ ํํธ๋์ญ | CSR ํ๋ก๊ทธ๋จ ์ฐ๊ณ | ๋๊ท๋ชจ ์๊ธ ์ ์ | ์์กด๋ ๋์ |
| ํ ํฐ ์ด์ฝ๋ ธ๋ฏธ | ํ๋ซํผ ํ ํฐ ๋ฐํ | ์ํ๊ณ ํ์ฅ | ๊ท์ ๋ฆฌ์คํฌ |
| ๋ฐ์ดํฐ ๋ถ์ | ์ต๋ช ํ๋ ํต๊ณ ํ๋งค | ๋ถ๊ฐ ์์ต | ํ๋ผ์ด๋ฒ์ ์ด์ |
๊ฐ์ธ์ ์ผ๋ก๋ ๋ฎ์ ํ๋ซํผ ์์๋ฃ + ํ๋ฆฌ๋ฏธ์ ๊ธฐ๋ฅ ์กฐํฉ์ ์ถ์ฒํด์! ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋, ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๋ฃ๋ก ํ๋ ๊ฑฐ์ฃ . ๐
๐ฏ ๋ง์ผํ ์ ๋ต
์ข์ ์ ํ์ ๋ง๋ค์์ผ๋ฉด ์๋ ค์ผ์ฃ ! ใ ใ ใ ์ด๋ป๊ฒ ๋ง์ผํ ํ ๊น์? ๐ข
1๋จ๊ณ: ์ปค๋ฎค๋ํฐ ๊ตฌ์ถ
โข Discord, Telegram ์ปค๋ฎค๋ํฐ ์ด์
โข ์ ๊ธฐ์ ์ธ AMA (Ask Me Anything) ์ธ์
โข ์ผ๋ฆฌ ์ด๋ตํฐ ๋ฆฌ์๋ ํ๋ก๊ทธ๋จ
โข ์ฐ๋ฐฐ์๋ ํ๋ก๊ทธ๋จ ์ด์
2๋จ๊ณ: ์ฝํ ์ธ ๋ง์ผํ
โข ๋ธ๋ก๊ทธ ํฌ์คํธ (ํฌ๋ช
์ฑ ๋ฆฌํฌํธ, ์ฑ๊ณต ์ฌ๋ก)
โข YouTube ํํ ๋ฆฌ์ผ
โข ํ์บ์คํธ ์ถ์ฐ
โข ์ธํ๋ฃจ์ธ์ ํ์
3๋จ๊ณ: ํํธ๋์ญ
โข ์ ๋ช
๋น์๋ฆฌ ๋จ์ฒด์ ํ๋ ฅ
โข ๋ค๋ฅธ Web3 ํ๋ก์ ํธ์ ํฌ๋ก์ค ํ๋ก๋ชจ์
โข ๋ํ๊ต, ์ฐ๊ตฌ๊ธฐ๊ด๊ณผ ํ์
โข ์ ๋ถ ๊ธฐ๊ด ํ์ผ๋ฟ ํ๋ก๊ทธ๋จ
4๋จ๊ณ: PR ํ๋
โข ์ธ๋ก ๋ณด๋์๋ฃ ๋ฐฐํฌ
โข ์ปจํผ๋ฐ์ค ๋ฐํ
โข ํด์ปคํค ์คํฐ์
โข ์ด์๋ ์ถํ
๐ฎ 2024๋ ์ดํ ํธ๋ ๋ ์์ธก
์, ์ด์ ๋ฏธ๋๋ฅผ ์ข ๋ด๋ค๋ด๋ณผ๊น์? ์์ผ๋ก ์ด๋ค ๋ณํ๊ฐ ์ฌ๊น์? ๐
๐ ์ฃผ๋ชฉํด์ผ ํ ํธ๋ ๋
1. Account Abstraction (๊ณ์ ์ถ์ํ)
ERC-4337 ํ์ค์ผ๋ก ์ง๊ฐ ์ฌ์ฉ์ด ํจ์ฌ ์ฌ์์ ธ์! ์๋ ๊ตฌ๋ฌธ ์์ด๋ ์์ ๋ก๊ทธ์ธ์ผ๋ก ์ง๊ฐ ์์ฑ ๊ฐ๋ฅ. ๊ฐ์ค๋น๋ฅผ ๋ค๋ฅธ ์ฌ๋์ด ๋์ ๋ด์ค ์๋ ์๊ณ ์. ์ด๊ฑฐ ์ง์ง ๊ฒ์ ์ฒด์ธ์ ์์! ๐ฎ
2. Zero-Knowledge Proofs (์์ง์ ์ฆ๋ช )
๊ฐ์ธ์ ๋ณด๋ฅผ ๊ณต๊ฐํ์ง ์๊ณ ๋ ์ ์์ ์ฆ๋ช ํ ์ ์์ด์. ์๋ฅผ ๋ค์ด "๋๋ 18์ธ ์ด์์ด๋ค"๋ฅผ ์ฆ๋ช ํ๋, ์ ํํ ๋์ด๋ ๊ณต๊ฐ ์ ํ๋ ๊ฑฐ์ฃ . ํ๋ผ์ด๋ฒ์์ ํฌ๋ช ์ฑ์ ์๋ฒฝํ ์กฐํฉ! ๐
3. AI + Blockchain ์ตํฉ
AI๊ฐ ๊ธฐ๋ถ ํ๋ก์ ํธ๋ฅผ ์๋์ผ๋ก ํ๊ฐํ๊ณ , ์ฌ๊ธฐ๋ฅผ ํ์งํ๊ณ , ์ต์ ์ ์๊ธ ๋ถ๋ฐฐ๋ฅผ ์ ์ํด์. ์ธ๊ฐ์ ํ๋จ๊ณผ AI์ ๋ถ์์ด ๊ฒฐํฉ๋๋ ๊ฑฐ์ฃ ! ๐ค๐ง
4. Real World Assets (RWA) ํ ํฐํ
๋ถ๋์ฐ, ์์ ํ ๊ฐ์ ์ค๋ฌผ ์์ฐ์ ํ ํฐํํด์ ๊ธฐ๋ถ์ ํ์ฉ! "์ด ๊ทธ๋ฆผ์ 10%๋ฅผ ๊ธฐ๋ถํฉ๋๋ค" ์ด๋ฐ ๊ฒ ๊ฐ๋ฅํด์ ธ์. ์์ ์ ์ธ๊ณ์ฃ ? ๐จ
5. Decentralized Identity (DID)
๋ธ๋ก์ฒด์ธ ๊ธฐ๋ฐ ์ ์ ์ธ์ฆ์ผ๋ก ํ ๋ฒ ์ธ์ฆํ๋ฉด ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ ๊ฐ๋ฅ! ์ค๋ณต ๊ธฐ๋ถ ๋ฐฉ์ง, ์๋น ๊ณต๊ฒฉ ์ฐจ๋จ์ ์๋ฒฝํด์. ๐
๐ ๊ธ๋ก๋ฒ ํ์ฅ ์ ๋ต
ํ๊ตญ์์ ์์ํ๋ค๋ฉด ์ด์ ์ธ๊ณ๋ก ๋๊ฐ์ผ์ฃ ! ๐
์ง์ญ๋ณ ์ ๋ต:
๐ฐ๐ท ํ๊ตญ
โข ์นด์นด์คํก ์ฐ๋, ๋ค์ด๋ฒํ์ด ์ง์
โข ํ๊ตญ ๋ฒ๊ท ์ค์ (ํน์ ๊ธ์ต์ ๋ณด๋ฒ ๋ฑ)
โข K-pop ํฌ๋ค ํ์ฉ ๋ง์ผํ
๐บ๐ธ ๋ฏธ๊ตญ
โข IRS ์ธ๊ธ ๊ณต์ ์๋ ์ฒ๋ฆฌ
โข Coinbase, Binance.US ์ฐ๋
โข ์ค๋ฆฌ์ฝ๋ฐธ๋ฆฌ VC ํฌ์ ์ ์น
๐ช๐บ ์ ๋ฝ
โข GDPR ์๋ฒฝ ์ค์
โข MiCA ๊ท์ ๋์
โข ํ๊ฒฝ ์นํ์ ๋ธ๋ก์ฒด์ธ ๊ฐ์กฐ
๐ ๋๋จ์์์
โข ๋ชจ๋ฐ์ผ ํผ์คํธ ์ ๋ต
โข ๋ฎ์ ์์๋ฃ ๊ฐ์กฐ
โข ํ์ง ํํธ๋์ญ ์ค์
๐ ํ์ต ๋ฆฌ์์ค ์ด์ ๋ฆฌ
์ฌ๊ธฐ๊น์ง ์ฝ์ผ์ จ๋ค๋ฉด ์ง์ง ๋๋จํด์! ๐ ์ด์ ์ค์ ๋ก ๊ณต๋ถ๋ฅผ ์์ํ๊ณ ์ถ์ผ์์ฃ ? ์ ๊ฐ ์ถ์ฒํ๋ ํ์ต ๊ฒฝ๋ก๋ฅผ ์ ๋ฆฌํด๋๋ฆด๊ฒ์! ๐
"๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ์ด๋ ต์ง๋ง, ํ ๊ฑธ์์ฉ ๋์๊ฐ๋ฉด ๋๊ตฌ๋ ํ ์ ์์ด์. ํฌ๊ธฐํ์ง ๋ง์ธ์!" ๐ช
๐ ํ์ ๋์
1. "Mastering Ethereum" by Andreas Antonopoulos
- ์ด๋๋ฆฌ์์ ๋ฐ์ด๋ธ, ๋ฌด๋ฃ ์จ๋ผ์ธ ๋ฒ์ ์์
2. "Mastering Bitcoin" by Andreas Antonopoulos
- ๋ธ๋ก์ฒด์ธ ๊ธฐ์ด ์ดํด์ ์ต๊ณ
3. "The Infinite Machine" by Camila Russo
- ์ด๋๋ฆฌ์์ ์ญ์ฌ, ์ฌ๋ฏธ์๊ฒ ์ฝํ
4. "Token Economy" by Shermin Voshmgir
- ํ ํฐ ์ด์ฝ๋
ธ๋ฏธ ์ดํด์ ํ์
๐ฅ ์ถ์ฒ ์ ํ๋ธ ์ฑ๋
Patrick Collins
32์๊ฐ์ง๋ฆฌ ๋ฌด๋ฃ ํ์คํ Web3 ๊ฐ์, ์ง์ง ๋ช ๊ฐ์!
Dapp University
ํ๋ก์ ํธ ๊ธฐ๋ฐ ํ์ต, ๋ฐ๋ผํ๊ธฐ ์ข์
EatTheBlocks
DeFi ํ๋ก์ ํธ ํํ ๋ฆฌ์ผ ๋ง์
Whiteboard Crypto
๊ฐ๋ ์ค๋ช ์ด ์ฝ๊ณ ๋ช ํํจ
๐ป ์ค์ต ํ๋ซํผ
๐ฎ ๊ฒ์์ฒ๋ผ ๋ฐฐ์ฐ๊ธฐ:
โข CryptoZombies - Solidity ๊ฒ์ ๊ฐ๋ฐ ๋ฐฐ์ฐ๊ธฐ
โข Ethernaut - ๋ณด์ ์ทจ์ฝ์ ์ฐพ๊ธฐ ๊ฒ์
โข Capture The Ether - ํดํน ์ฑ๋ฆฐ์ง
โข Damn Vulnerable DeFi - DeFi ๋ณด์ ํ์ต
๐ค ์ปค๋ฎค๋ํฐ์ ๋คํธ์ํน
ํผ์ ๊ณต๋ถํ๋ฉด ์ธ๋กญ๊ณ ํ๋ค์ด์ ใ ใ ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ์ธ์! ๐
โจ ์ถ์ฒ ์ปค๋ฎค๋ํฐ:
๐น Ethereum Korea - ํ๊ตญ ์ต๋ ์ด๋๋ฆฌ์ ์ปค๋ฎค๋ํฐ
๐น Klaytn Developers - ๊ตญ๋ด ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ๋ชจ์
๐น Web3 Korea - Web3 ์ ๋ฐ์ ๋ํ ๋
ผ์
๐น DeFi Korea - DeFi ํ๋ก์ ํธ ์ ๋ณด ๊ณต์
๐น NFT Korea - NFT ๊ด๋ จ ์ปค๋ฎค๋ํฐ
๊ทธ๋ฆฌ๊ณ ์คํ๋ผ์ธ ๋ฐ์ ๋ ์ ๋ง ์ค์ํด์! ์ค์ ๋ก ๋ง๋์ ๋คํธ์ํนํ๋ฉด ์์ฒญ๋ ๊ธฐํ๊ฐ ์๊ฒจ์. ์ ๋ ๋ฐ์ ์์ ๋ง๋ ๋ถ๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์ด ์๊ฑฐ๋ ์! ๐
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์... ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์ จ๋ค๋ฉด ์ ๋ง ๋๋จํ์ธ์! ๐๐๐ ์ง์ฌ์ผ๋ก ๋ฐ์ ๋ณด๋ด๋๋ ค์! ใ ใ ใ
Web3 ๊ธฐ๋ฐ ๊ธฐ๋ถ ํฌ๋ช ์ฑ ์์คํ ์ ๋จ์ํ ๊ธฐ์ ์ด ์๋์์. ์ธ์์ ๋ ๋์ ๊ณณ์ผ๋ก ๋ง๋ค ์ ์๋ ๋๊ตฌ์์. ๊ธฐ๋ถ ๋ฌธํ๋ฅผ ํ์ ํ๊ณ , ์ ๋ขฐ๋ฅผ ํ๋ณตํ๊ณ , ๋ ๋ง์ ์ฌ๋๋ค์ด ์ ํ ์ํฅ๋ ฅ์ ๋ฐํํ ์ ์๊ฒ ๋์์ฃผ๋ ๊ฑฐ์ฃ . ๐๐
"๊ธฐ์ ์ ๋๊ตฌ์ผ ๋ฟ์ด์์. ์ค์ํ ๊ฑด ๊ทธ ๊ธฐ์ ๋ก ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ์์. Web3๋ก ์ธ์์ ๊ธ์ ์ ์ธ ๋ณํ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์!" ๐
์ด ๊ธ์ ์ฝ๊ณ ์๊ฐ์ ๋ฐ์ผ์ จ๋ค๋ฉด, ์ง๊ธ ๋ฐ๋ก ์์ํ์ธ์! ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด๋ ๊ด์ฐฎ์์. ์ค์ํ ๊ฑด ์ฒซ ๊ฑธ์์ ๋ผ๋ ๊ฒ์ด์์. ๐ช
๊ทธ๋ฆฌ๊ณ ํน์ ๋งํ๋ ๋ถ๋ถ์ด ์๊ฑฐ๋, ๋ฉํ ๋ง์ด ํ์ํ๋ค๋ฉด ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์ ํ์ฉํด๋ณด์ธ์. ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฌ๋ฌ๋ถ์ ๋์์ค ๊ฑฐ์์! ๐ค
๐ฏ ์ก์ ํ๋:
1๏ธโฃ ์ค๋: MetaMask ์ค์นํ๊ณ ํ
์คํธ๋ท ์ด๋ ๋ฐ๊ธฐ
2๏ธโฃ ์ด๋ฒ ์ฃผ: CryptoZombies ์๋ฃํ๊ธฐ
3๏ธโฃ ์ด๋ฒ ๋ฌ: ์ฒซ ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐฐํฌํ๊ธฐ
4๏ธโฃ 3๊ฐ์ ํ: ๊ฐ๋จํ ๊ธฐ๋ถ DApp ๋ง๋ค๊ธฐ
5๏ธโฃ 6๊ฐ์ ํ: ์ค์ ํ๋ก์ ํธ ๋ฐ์นญํ๊ธฐ
์ฌ๋ฌ๋ถ์ Web3 ์ฌ์ ์ ์์ํฉ๋๋ค! ํ์ดํ ! ๐ฅ๐ฅ๐ฅ
๐ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ด ๊ธ์ด ๋์์ด ๋์
จ๋ค๋ฉด ์ฃผ๋ณ ๋ถ๋ค๊ณผ ๊ณต์ ํด์ฃผ์ธ์.
ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ Web3 ์ปค๋ฎค๋ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ์! ๐
์ง๋ฌธ์ด๋ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์ํฉ๋๋ค! ๐
โจ Happy Coding & Happy Giving! โจ
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.