์ด๋ฒ ํ๋ก์ ํธ๋ ์ ๋ฒ ํ๋ก์ ํธ2์ ์ฃผ์ ์ ๋์ผํ๊ฒ ํ๋ก๊น
๋ฐ ๊ธฐํ ํ๊ฒฝ ์ด๋ ๊ด๋ จ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ธ๋ก์ฒด์ธ ๊ธฐ๋ฐ ์ธ์ผํฐ๋ธ ํ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. ์ฃผ์ ๊ฐ ๋น์ทํ ๋์ ๊ธฐ๋ฅ์ ๋๋ ธ๊ณ ERC-1155๋ฅผ ํตํด ๋์ผํ NFT๋ฅผ ๋ฐฐ์ง ํ์์ผ๋ก ์ฐธ๊ฐ์์๊ฒ ํ์ฌ ์ฐธ์ฌ ๋ณด์์ผ๋ก ์ง๊ธํ๊ณ ERC-721๋ก DNFT๋ฅผ ๊ตฌํํ๋ค.
ํ๋ก์ ํธ2์ ๋์ผํ ํ์ ๋ถ๋ค์ ํ๋ถ ๋ ๋ชจ์ ์ ์งํํ๋ค. ๋ค๋ค ๋๋ฌด ์ํ์๋ ๋ถ๋ค์ด๋ผ ๊ฐ๋ฑ ํ๋ฒ ์์ด ํ๋ก์ ํธ๋ฅผ ์ ๋ง๋ฌด๋ฆฌ ํ๋ค.
๋๋ ๊ทธ๋์์ ํ๋ก์ ํธ์ ๋์ผํ๊ฒ smart contract ๋ถ๋ถ์ ๋ด๋นํ๋ค. ์ด๋ฒ์๋ ์ปจํธ๋ํธ ๋ฐ ์๋ฒ์ ํ ์คํธ ์ฝ๋๋ ์์ฑํด๋ณด๊ณ mongoDB๋ ์๋ก ์ฌ์ฉํด ๋ณด์๋ค. ์ฒ์์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ์ง๋ง ๊ธ๋ฐฉ ์ ์ ์ํด์ ๋งก์ ๋ถ๋ถ์ ์ ๊ตฌํํด ๋์๊ฐ๋ค. ํด๋ผ์ด์ธํธ์ ๊ด๋ฆฌ์ ํ์ด์ง๋ฅผ ๋ฐ๋ก ๊ตฌํํด ์ฌ๋ฌ ํ์ฌ ๋ฐ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ๋์ฑ ์ฉ์ดํ๊ฒ ๊ตฌ์ฑํ๋ค.
client : https://www.clean-mile.co/
admin : https://admin.clean-mile.co/auth/login
ERC1155๋ ์ด๋๋ฆฌ์ ๊ฐ๋ฐ์๊ฐ ๋์ผํ ํ์ค์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋์ฒด ๊ฐ๋ฅ, ๋ถ๋ถ ๋์ฒด ๊ฐ๋ฅ, ๋์ฒด ๋ถ๊ฐ๋ฅ ํ ํฐ์ ์์ฑํ๋๋ก ํด ์ฃผ๋ ํ์ค์ด๋ค
์ฐ๋ฆฌ ํ๋ซํผ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋์ธ ํ๋ ํ ์ธ์ฆ์ ํ๋ฉด ํ์ฌ์ ๊ด๋ จํ ๋ฐฐ์ง๋ฅผ ์ง๊ธํ๋ ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ์ํด ํ์ํ๋ค. ๋ฐฐ์ง๋ ERC-721๋ก๋ ์ถฉ๋ถํ ๊ตฌํ ๊ฐ๋ฅํ์ง๋ง ํ์ฌ์ ์ฐธ์ฌํ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ๋์ผํ ๋ฐฐ์ง๋ฅผ ์ฃผ๊ธฐ ์ํด์ ์ธ์์ ์ค์ง ๋ฑ ํ๋ ์กด์ฌํ๋ ํ ํฐ์ด ์๋ ์ฐธ๊ฐ์ ์ ๋งํผ ๋์ผํ ํ ํฐ์ด ์กด์ฌํด์ผ ํ๋ค. ๋ฐ๋ผ์ ERC-1155๋ฅผ ํตํด ๊ตฌํํ๋ค.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface ICleanMileBadge {
// ๊ฐ ๋ฑ์ง์ ID๋ฅผ ์ ์ํฉ๋๋ค. 0์ ๋ธ๋ก ์ฆ, 1์ ์ค๋ฒ, 2๋ ๊ณจ๋ ๋ฑ์ง์
๋๋ค.
enum BadgeType {
Bronze,
Silver,
Gold
}
// ํ ํฐ ID์ ๋ํ ๋ฑ์ง ์ ํ์ ์กฐํํ๋ ํจ์
function badgeType(uint256 tokenId) external view returns (BadgeType);
// ์ ์ ์ ๋ฑ์ง ์ ์๋ฅผ ์กฐํํ๋ ํจ์
function userBadgeScore(
address userAddress
) external view returns (uint256);
// ํน์ ํ ํฐ์ ๋ฑ์ง ์๋์ ์กฐํํ๋ ํจ์
function badgeBalance(
address account,
uint256 tokenId
) external view returns (uint256);
// ๋ฑ์ง๋ฅผ ๋ฐ๊ธํ๋ ํจ์
function mintBadge(
address account,
BadgeType badgeType,
uint256 amount,
string memory uri
) external returns (uint256);
// ๋ฑ์ง๋ฅผ ์ ์กํ๋ ํจ์ (ํ๋ช
์๊ฒ ํ๊ฐ์ฉ)
function transferBadge(
address from,
address to,
uint256 tokenId,
uint256 amount
) external;
// ๋ฑ์ง๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ์ ์กํ๋ ํจ์ (ํ๊ฐ์ง ์ข
๋ฅ์ ํ ํฐ์ ์ฌ๋ฌ ์ฌ๋์๊ฒ)
function transferBadges(
address from,
address[] calldata recipients,
uint256 tokenId,
uint256 amount
) external;
event MintBadge(
address indexed sender,
address account,
BadgeType badgeType,
uint256 amount,
string _uri
);
event TransferMultiple(
address indexed sender,
address[] recipients,
uint256 tokenId,
uint256 amount
);
// ํน์ ํ ํฐ์ ๋ํ ๊ถํ ๋ถ์ฌ ์ด๋ฒคํธ์
๋๋ค.
event ApprovalForToken(
address indexed account,
uint256 indexed tokenId,
bool approve
);
1.๊ด๋ฆฌ์๋ mintBadge ํจ์๋ก ํ์ฌ์ ๊ด๋ จํ ๋ฑ์ง๋ฅผ ์ํ๋ ์๋๋งํผ ๋ฏผํ
ํ ์ ์์ต๋๋ค.
2.์ดํ transferBadge ํจ์๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ qr์ธ์ฆ์ ํ๋ฉด ํด๋น ํ์ฌ์ ๋ํ ๋ฑ์ง๋ฅผ ์ ์กํ๋ค.
3.๋ง์ฝ ์ฐธ์ฌ์๊ฐ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ ์ผ์ผ์ด ๋ฐฐ์ง๋ฅผ ์ ์กํ๋ ๊ฒ์ ๊ฐ์ค๋น๊ฐ ๋๋ฌด ๋ง์ด ์์๋๋ค. ๋ฐ๋ผ์ transferBadges๋ก ์ธ์ฆ ์๋ฃํ ์ฐธ์ฌ์๋ค์๊ฒ ์ผ๊ด ์ ์กํ๋ค.
4. ๋ฐฐ์ง๋ gold, silver, bronze ํ์
์ ๊ฐ์ง๊ณ ์๋ค. ์ฌ์ฉ์๋ ๋ฐฐ์ง๋ฅผ ๋ฐ๋ ์๊ฐ ๊ฐ์ด ๋ฐฐ์ง ์ ์๋ ๋ฐ๊ฒ ๋๋ฉฐ ์ถํ์ DNFT ์
๊ทธ๋ ์ด๋์ ์ฌ์ฉ๋๋ค. (๊ณจ๋ : 10์ , ์ค๋ฒ : 5์ , ๋ธ๋ก ์ฆ : 1์ )
5.userBadgeScore ํจ์๋ฅผ ์ด์ฉํด ์ฌ์ฉ์์ ๋ฐฐ์ง ์ ์๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ์ฐธ๊ฐ์๊ฐ qr์ธ์ฆ์ ํ๊ฒ ๋๋ค๋ฉด ์ด๋ฐ ์์ผ๋ก ๋ฐฐ์ง๋ฅผ ์ง๊ธ ๋ฐ๊ฒ ๋๋ค.
์ดํ ๋ง์ดํ์ด์ง์์ ์๋ นํ ๋ฐฐ์ง ๋ฐ ์ฐธ๊ฐํ ํ๋์ ๋ํ ๊ธฐ๋ก์ ํ์ธํ ์ ์๋ค.
๋ฐฐ์ง ์ ์ ๋ํ ๊ฐ์ด ์ฌ๋ผ๊ฐ๊ฒ ๋๋ค.
๋ฐฐ์ง ๋ฏผํ ์ด๋ ์ ์ก ๊ฐ์ด ์ค์ํ ํจ์๋ค์ ๋ฐ๋ก ์ด๋ฒคํธ๋ฅผ ์ ์ํด ๋ก๊ทธ ์์ฑ ๋ฐ ๋ฐ๋ชฌ์ด ์ถ์ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ๋ค.
NFT์ ์์ฑ์ด ๋์ ์ผ๋ก ๋ณ๋๊ฐ๋ฅํ ๊ฒ์ด DNFT์ด๋ค. ์ฐ๋ฆฌ๋ ์ด DNFT๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์๊ฐ์ ์ ์ง๊ธํ๊ณ ํ๋์ ๋ฐ๋ฅธ ๋ฐฐ์ง ์ ์์ ๋ฐ๋ผ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ๊ฐ๋ฅํ๋๋ก ํ๋ค. ์ฌ์ฉ์๋ค์ ํ๋์ ๋ฐ๋ผ DNFT๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ณ ์์ด์ฝ์ด ๋ณ๊ฒฝ๋๋ฉฐ ์์ ์ ํ๋ ๊ธฐ๋ก์ด DNFT description์ ๊ณ์ํด์ ๊ธฐ๋ก๋๋ฉฐ ์ด๋ ์ ๋ ํ๋์ ๋ํ ์ธ์ฆ๋ ๊ฐ๋ฅํ๋ค.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface ICleanMileDNFT {
//level 1~5๋ ์ผ๋ฐ ์ฌ์ฉ์ level_6์ ๊ด๋ฆฌ์
enum DNFTLevel {
level_1,
level_2,
level_3,
level_4,
level_5,
level_6
}
enum UserType {
User,
Admin
}
struct DNFTData {
uint256 token_id;
string name;
string description;
DNFTLevel level;
}
event UpgradeDNFT(address indexed sender, uint256 tokenId);
event MintDNFT(
address _to,
string _name,
string _description,
UserType userType
);
function dnftName(uint256 _tokenId) external view returns (string memory);
function dnftDescription(
uint256 _tokenId
) external view returns (string memory);
function dnftLevel(uint256 _tokenId) external view returns (DNFTLevel);
function dnftData(uint256 _tokenId) external view returns (DNFTData memory);
function mintDNFT(
address _to,
string calldata _name,
string calldata _description,
UserType userType
) external returns (uint256);
function updateName(uint256 _tokenId, string calldata _name) external;
function updateDescription(
uint256 _tokenId,
string calldata _description
) external;
function setBadge(address badgeAddress) external returns (bool);
function upgradeDNFT(uint256 _tokenId) external returns (bool);
function upgradeCheck(uint256 _tokenId) external returns (DNFTLevel);
}
DNFT ์ปจํธ๋ํธ์ ์ธํฐํ์ด์ค์ด๋ค.
1.DNFT๋ 1~6๋ ๋ฒจ๊น์ง ์กด์ฌํ๋ค. 6๋ ๋ฒจ์ ๊ด๋ฆฌ์์ด๋ค.
2.์ฌ์ฉ์๋ ํ์๊ฐ์
์ mintDNFT ํจ์๋ฅผ ํตํด ์์ ์ ์ง๊ฐ์ DNFT๋ฅผ ์๋ นํ๋ค.
3.์ดํ ํ๋์ ํ๋ฉฐ ๋ฐฐ์ง ์ ์๋ฅผ ํ๋ํ๊ณ ์ ํด์ง ๊ธฐ์ค์ ๋ฐ๋ผ ์
๊ทธ๋ ์ด๋๊ฐ ๊ฐ๋ฅํ๋ค.
[๊ธฐ์ค]
1๋จ๊ณ(์จ์) : 0์ (ํ์๊ฐ์
์ํ)~ 14์ (๊ฐ๊ฒฉ: 15์ )
2๋จ๊ณ(์์น) : 15์ ~ 39์ (๊ฐ๊ฒฉ25์ )
3๋จ๊ณ(์์) : 41์ ~ 74์ (๊ฐ๊ฒฉ35์ )
4๋จ๊ณ(๊ฐ์ง) : 75์ ~ 119์ (๊ฐ๊ฒฉ45์ )
5๋จ๊ณ(์ด๋งค) : 120์ ~
์ด ๊ธฐ์ค์ ํ์ค์ ์ธ ํ์ฌ๋ค์ ์ฃผ์ต ์ฃผ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํ์ต๋๋ค.
4.์ด ๊ธฐ์ค์ ์ถฉ์กฑํ๋ค๋ฉด ๋ค์ ๋ ๋ฒจ๋ก ์
๊ทธ๋ ์ด๋ ํ ์ ์์ต๋๋ค.
์
๊ทธ๋ ์ด๋ ์
์
๊ทธ๋ ์ด๋ ํ
์ปจํธ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ณผ์ ์์ ๊ฐ์ค๋น๋ฅผ ์ค์ด๊ธฐ ์ํด ์ต๋ํ ์จ์ฒด์ธ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ด๊ณ ํธ๋์ญ์ ํ์๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ง์ด ๊ณ ๋ฏผํด ๋ณด์๋ค.
ํ๋ก์ ํธ 1์ foundry, ํ๋ก์ ํธ 2๋ truffle, ์ด๋ฒ ํ๋ก์ ํธ 3๋ hardhat์ ์ฌ์ฉํ๋ค. 3๋ฒ ๋ชจ๋ ๋ค๋ฅธ ํ๊ฒฝ์ ์ด์ฉํด ์ปจํธ๋ํธ๋ฅผ ๊ฐ๋ฐ, ๋ฐฐํฌ, ๊ฒ์ฆ๊น์ง ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ํ๋ก์ ํธ์์ ๋ ํ๋ ์๋ก ์๋ํ ๊ฒ์ mocha๋ฅผ ์ด์ฉํ ์ปจํธ๋ํธ ํ ์คํธ ์ฝ๋ ์์ฑ์ด๋ค. ๊ฐ ์ปจํธ๋ํธ ๋ง๋ค positive, negative case๋ฅผ ๋์ด ๊ฐ๋ฅํ ๋ชจ๋ ์ํฉ์ ํ ์คํธ ํด๋ณด๋ ค ํ๋ค. ์ฌ์ค ์ด ๋ถ๋ถ์ด ๊ตณ์ด ํ์ํ๊ฐ ์ถ์์ง๋ง ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ์ปจํธ๋ํธ์ ๋น ๊ณณ์ด ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๊ณ ์์ ํ ์ ์์๋ค. ๊ฐ๋ฐ์ ์์ด์ ๋ฐ๋์ ํ์ํ ์์ ์ด๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ์๋ฌ ์ ์ ๋ฐ ์ด๋ฒคํธ ์ ์์ ๊ด๋ จ๋ ๋ถ๋ถ์ ๋ํ ๊ณต๋ถ๋ฅผ ๋ง์ด ํ ์ ์์๋ค.
์๋ฒ ๋ถ๋ถ์์๋ ์ปจํธ๋์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋ํ controller๋ฅผ ๊ตฌํํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฒ ๋ด๋นํ์ ํ์ ๋ถ์ด ์์ฑํด ๋์ api์์ ํ์ํ ๋ถ๋ถ์ ๊ฐ๋ค ๋ถ์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฒ ์ ๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ฌ์ค ์๋ฒ ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ๋ ํจ์๊ฐ ๋๋ฌด ๋ง์์ ์กฐ๊ธ ํ๋ค์๋ค. ๋ฐฉ์์ ํ
์คํธ๋ฅผ ์งํํ๋ฉด์ ๊ธฐ์กด DB๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ mongo-memory-server๋ฅผ ๋์ด๋ค์ ํ
์คํธ๊ฐ ์ข
๋ฃ ๋๋ฉด ๊ฐ์ด ์ข
๋ฃํ๋ ์์ผ๋ก ๊ตฌ์ฑํ๋ค. ์ปจํธ๋ํธ์ ๋ง์น๊ฐ์ง๋ก mocha, chai๋ฅผ ์ฌ์ฉํ๋ค!
์ฌ์ค ์๋ฒ์ ๊ด๋ จํด์ ๋ด๊ฐ ๊ธฐ์ฌํ ๋ถ๋ถ์ ์ด ์ ๋์ด๋ค. ํ์ง๋ง ํ์๋ถ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋งค์ผ ๊ณต๋ถํ๋ค ๋ณด๋ ์ข ๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๊ฐ ์ดํด๊ฐ ์ ๋์๋ค. ์๋ง ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ง์ด ์ฐธ๊ณ ํ ๊ฑฐ ๊ฐ๋ค. ์๋ฒ ๋ด๋นํ์ ํ์ ๋ถ๊ป์ postman์ผ๋ก api๋ฅผ ์ ๋ฆฌํ์ จ๋ค. ํ ๋์ ๋ณด๊ธฐ ์๋นํ ํธํ๊ณ ๊น๋ํ๋ค. ๋ด๊ฐ ์ฃผ๋ก ๋งก์ ํํธ๊ฐ ์๋๋ค ๋ณด๋ ๋จ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ด ๊ฒ์ ์ค๊ฐ์ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ๋ํ ๋ถ๋ถ ๋ณด๋ค๋ ๋จ์ ๊ฒ์ ๋ด ๊ฒ์ผ๋ก ๋ง๋๋๋ฐ ๋ง์ ์๊ฐ์ ์์๋๊ฑฐ ๊ฐ๋ค.ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ ์ผ ๋ง์ด ๋ฐฐ์ธ ์ ์๋ ๋ถ๋ถ์ ๋จ์ด ํ๋ ๊ฒ์ ๋ด ๊ฒ์ผ๋ก ๋ง๋๋ ๋ถ๋ถ์์ ์ค๋ ๊ฒ ๊ฐ๋ค๊ณ ๋๊ผ๋ค.
๋ง์ง๋ง ํ๋ก์ ํธ๊น์ง ๋ง๋ฌด๋ฆฌ ๋์๋ค.
์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ์์ํ์ง๋ง ์ข์ ์ฌ๋๋ค๋ก๋ถํฐ ๋ง์ ์ ๋ณด์ ๋์์ ๋ฐ์ ์ด๋ ๊ฒ ๋๋ ๋ ์ฏค์๋ ์ด๋ ์ ๋ ๋ด๊ฐ ๋งก์ ์ญํ ์ ๋ค ํ ์ ์๋ ์ฌ๋์ด ๋๊ฑฐ ๊ฐ์ ๋ฟ๋ฏํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก ๋๋ ์ด๋ป๊ฒ ๊ณต๋ถ๋ฅผ ํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋ฐฉํฅ์ ์ก์ ์ ์์ด ์ข์๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ด์ ํญ์ ๋๋ฆฌ๊ณ ์ปจํธ๋ํธ ๊ด๋ จ ๋ถ๋ถ ํด์๋ ์ด๋ก ์ ๋ํ ๋ถ๋ถ์ ๋ง์ด ๊น๋จน์๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ๋ค์ ๋ณต์ตํ๋ฉด์ ๋ณด๊ฐํด ๋๊ฐ์ผ ํ ๊ฑฐ ๊ฐ๋ค.
์์ฌ๋ถ๋ฆฌ์ง ์๊ณ ์ฒ์ฒํ ์์ผ๋ก ๋์๊ฐ์ผ๊ฒ ๋ค.
์ด๋ ๊ฒ ์ ์ฉํ ์ ๋ณด๋ฅผ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.