Smart Contract

μ΄λ²ˆμ— 블둝체인 κ΄€λ ¨ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜κ²Œ λ˜μ–΄ 슀마트 μ»¨νŠΈλž™νŠΈλ₯Ό 직접 λ°°ν¬ν•΄μ•Όν•˜λŠ” 상황이 생겼닀. κ·Έ 전에 슀마트 μ»¨νŠΈλž™νŠΈκ°€ μ •ν™•νžˆ 무엇인지 μ •λ¦¬ν•˜κΈ° μœ„ν•΄ μž‘μ„±ν•œ κ²Œμ‹œκΈ€μ΄λ‹€.

Smart Contract?

슀마트 μ»¨νŠΈλž™νŠΈλž€, 블둝체인 κΈ°μˆ μ„ ν™œμš©ν•΄ 거래 λ‹Ήμ‚¬μž μ™Έ 제 3의 인증기관없이 계약이 이루어지도둝 ν•˜λŠ” κΈ°μˆ μ„ λ§ν•œλ‹€.

κΈ°μ‘΄ 거래 쀑 μ†‘κΈˆμ„ μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³΄μž. 은행에 μ†‘κΈˆμ„ μš”μ²­ν•˜λ©΄ 은행은 μ™Έν™˜μ€ν–‰μ— 지급을 μš”μ²­ν•œλ‹€. 이후, μ™Έν™˜ μ€‘κ°œμ€ν–‰μ€ ν•΄μ™Έ 은행에 μž…κΈˆν›„, μˆ˜μ·¨μΈμ—κ²Œ μ „λ‹¬λ˜κ²Œ λœλ‹€. 이처럼, κ°œκ°œμΈκ°„μ˜ 거래 사이에 μ€ν–‰μ΄λΌλŠ” 제 3의 μΈμ¦κΈ°κ΄€μ˜ κ°œμž…μ΄ λ°œμƒν•΄ μˆ˜μˆ˜λ£Œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

이처럼 인증기관이 ν•„μš”ν•œ μ΄μœ λŠ” λ””μ§€ν„Έ 데이터λ₯Ό 닀뀄야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ””μ§€ν„Έ λ°μ΄ν„°λŠ” λ³΅μ œκ°€ 쉽기 λ•Œλ¬Έμ— λˆ„κ΅¬λ‚˜ ν•¨λΆ€λ‘œ λ‹€λ£°μˆ˜ 없도둝 μ‹ λ’°ν• μˆ˜ μžˆλŠ” 인증기관(eg. 은행)을 거쳐 거래λ₯Ό κ²€μ¦ν•˜κ²Œ λœλ‹€. 그런데 인증기관을 κ±°μΉ˜λ©΄μ„œ μ‹œκ°„μ΄ 였래 μ†Œμš”λ˜κ³ , μˆ˜μˆ˜λ£Œκ°€ λ°œμƒν•œλ‹€λŠ” 단점이 λ°œμƒν•œλ‹€. 이 점에 μ°©μ•ˆν•΄ νƒ„μƒν•œ 기술이 λ°”λ‘œ 슀마트 μ»¨νŠΈλž™νŠΈμ΄λ‹€.

슀마트 μ»¨νŠΈλž™νŠΈλŠ” 거래 λ‹Ήμ‚¬μžκ°„ 계약을 μž‘μ„±ν•˜κ³ , 이 쑰건이 좩쑱되면 μžλ™μœΌλ‘œ 계약을 μ΄ν–‰μ‹œμΌœμ£ΌλŠ” κΈ°μˆ μ΄λ‹€.

그런데 슀마트 μ»¨νŠΈλž™νŠΈλ„ κ²°κ΅­ λ””μ§€ν„Έ 데이터λ₯Ό λ‹€λ£¨λŠ” 것인데 데이터 λ³€μ‘°λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  것인가?

슀마트 μ»¨νŠΈλž™νŠΈλŠ” 이 문제λ₯Ό 블둝 체인의 νŠΉμ§•μΈ Peer to Peer 기반 λΆ„μ‚° 데이터 베이슀λ₯Ό 톡해 ν•΄κ²°ν–ˆλ‹€. λΈ”λ‘μ²΄μΈμ—μ„œλŠ” λ„€νŠΈμ›Œν¬μ˜ λ…Έλ“œλ“€μ΄ λ™μΌν•œ 데이터λ₯Ό κ³΅μœ ν•˜κ³ , μ•”ν˜Έν™” κΈ°μˆ μ„ 톡해 무결성을 κ²€μ¦ν• μˆ˜ μžˆλ‹€. μΆ”κ°€μ μœΌλ‘œ 슀마트 μ»¨νŠΈλž™νŠΈλ₯Ό λ„€νŠΈμ›Œν¬μ— κ³΅μœ ν•˜κ²Œ 되면, 슀마트 μ»¨νŠΈλž™νŠΈ μ½”λ“œμ˜ λ³€κ²½ μ—¬λΆ€λ₯Ό 검증할 수 μžˆλ‹€.

μ˜ˆμ‹œλ₯Ό 톡해 쑰금 더 μžμ„Έν•˜κ²Œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract KukuCoin is ERC20, Ownable {
    // 총 κ³΅κΈ‰λŸ‰ = 1μ–΅ 개
    uint256 public constant TOTAL_SUPPLY = 100_000_000 * 10 ** 18;

    // λΆ„λ°° λΉ„μœ¨
    uint256 public constant TEAM_SUPPLY = TOTAL_SUPPLY * 30 / 100; 
    uint256 public constant COMMUNITY_SUPPLY = TOTAL_SUPPLY * 25 / 100; 
    uint256 public constant LIQUIDITY_SUPPLY = TOTAL_SUPPLY * 30 / 100; 
    uint256 public constant RESERVE_SUPPLY = TOTAL_SUPPLY * 15 / 100;

    // airdrop κ°€λŠ₯ν•œ μ΅œμ†Œ λ³΄μœ λŸ‰
    uint256 public constant MINIMUM_BALANCE = 50 * 10 ** 18; 

    // 보유자 λͺ©λ‘
    address[] public holders;

    
    constructor() ERC20("KukuCoin", "KUKU") Ownable(msg.sender) {
        _mint(msg.sender, TEAM_SUPPLY);
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    // μ—μ–΄λ“œλž κΈ°λŠ₯ μΆ”κ°€
    function airdrop(uint256 amount) external onlyOwner {
        require(amount > 0, "Amount must be greater than 0");

        for (uint256 i = 0; i < holders.length; i++) {
            address holder = holders[i];
            // λ³΄μœ μžκ°€ κ³ μ •λœ μ΅œμ†Œ μž”μ•‘μ„ μΆ©μ‘±ν•˜λŠ”μ§€ 확인
            if (balanceOf(holder) >= MINIMUM_BALANCE) {
                _mint(holder, amount); // 쑰건을 μΆ©μ‘±ν•˜λŠ” 경우, μ—μ–΄λ“œλž
            }
        }
    }
}

```

μœ„ μ½”λ“œλŠ” μ΄λ²ˆμ— ν”„λ‘œμ νŠΈλ‘œ μ§„ν–‰ν•˜λ©° μž‘μ„±ν•œ 슀마트 μ»¨νŠΈλž™νŠΈ μ½”λ“œμ˜ 일뢀이닀.

주석에 μ¨μžˆλ“―μ΄, 코인 총 λ°œν–‰λŸ‰, λΆ„λ°°λΉ„μœ¨, μ—μ–΄λ“œλž λ“±μ˜ κΈ°λŠ₯이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€. 이 κΈ°λŠ₯듀이 μ‹€μ œλ‘œ 블둝체인 λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μž‘λ™ν•˜κΈ° μœ„ν•΄μ„œλŠ” 슀마트 μ»¨νŠΈλž™νŠΈλ₯Ό λ°°ν¬ν•΄μ•Όν•˜λŠ”λ° μ΄λ•Œ μ‚¬μš© λ˜λŠ” 것이 λ°”λ‘œ 메인넷, ν…ŒμŠ€νŠΈλ„· 이닀.

Mainnet, Testnet

λ©”μΈλ„·μ΄λž€, λΈ”λ‘μ²΄μΈμ—μ„œ μ‹€μ œλ‘œ μš΄μ˜λ˜λŠ” λ„€νŠΈμ›Œν¬λ₯Ό λ§ν•œλ‹€. μ‹€μ œλ‘œ μš΄μ˜λ˜λŠ” λ„€νŠΈμ›Œν¬λž€ μ•”ν˜Έν™”ν, NFT λ“±μ˜ μ‹€μ œ μžμ‚°μ„ μ „μ†‘ν•˜κ±°λ‚˜ ν™œμš©ν•˜λŠ” ν™˜κ²½μ„ μ–˜κΈ°ν•œλ‹€. λͺ¨λ“  νŠΈλž™μž­μ…˜μ΄ 영ꡬ적으둜 기둝되며, λ„€νŠΈμ›Œν¬μ—μ„œ μœ νš¨μ„±μ„ κ²€μ¦ν•œλ‹€.

Transaction : 블둝체인 λ„€νŠΈμ›Œν¬μ—μ„œ 데이터, μžμ‚°μ˜ 이동을 λ‚˜νƒ€λ‚΄λŠ” μž‘μ—…λ‹¨μœ„. μˆ˜ν–‰μ‹œλ§ˆλ‹€ 일정 λΉ„μš©μ΄ μ§€λΆˆλ˜λ©° 이것을 κ°€μŠ€λΉ„ 라고 ν•œλ‹€.

즉, 슀마트 μ»¨νŠΈλž™νŠΈλ₯Ό μ΅œμ’…μ μœΌλ‘œ 메인넷에 배포해야 μ‹€μ œλ‘œ μ‚¬μš©μžλ“€μ΄ νŠΈλžœμž­μ…˜μ„ μ‹€μ‹œν• μˆ˜ μžˆλ‹€.

그런데 κ°œλ°œλ‹¨κ³„μ—μ„œ μˆ˜ν–‰ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό λ©”μΈλ„·μ—μ„œ μ§„ν–‰ν•œλ‹€λ©΄, κ°œλ°œμžλŠ” μ‹€μ œ μžμ‚°μ„ μ‚¬μš©ν•΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό ν•΄μ•Όν•˜λ©°, 각 νŠΈλžœμž­μ…˜ λ§ˆλ‹€ κ°€μŠ€λΉ„λ₯Ό μ§€λΆˆν•΄μ•Όν•˜λŠ” μ•ˆνƒ€κΉŒμš΄ 상황이 λ°œμƒν•œλ‹€.

λ”°λΌμ„œ, κ°œλ°œν™˜κ²½μ—μ„œ μ‚¬μš©λ˜λŠ” λ„€νŠΈμ›Œν¬κ°€ λ”°λ‘œ ν•„μš”ν•œλ° 이것이 λ°”λ‘œ ν…ŒμŠ€νŠΈλ„·μ΄λ‹€.

ν…ŒμŠ€νŠΈλ„·μ΄λΌκ³  메인넷과 ꡬ쑰가 λ‹€λ₯Έκ²ƒμ€ μ•„λ‹ˆλ‹€. λ‹€λ§Œ, μ‹€μ œ κ°€μΉ˜κ°€ μ—†λŠ” ν…ŒμŠ€νŠΈ μžμ‚°μ„ μ‚¬μš©ν•˜κ³ , ν…ŒμŠ€νŠΈ μžμ‚°μœΌλ‘œ κ°€μŠ€λΉ„λ₯Ό μ§€λΆˆν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œ λΉ„μš© 뢀담이 μ—†λ‹€λŠ”κ²ƒμ΄ νŠΉμ§•μ΄λ‹€. λ˜ν•œ 메인넷에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•  수 μžˆλŠ” 독립적인 κ°œλ°œν™˜κ²½μ„ ꡬ성할 수 μžˆλ‹€.

Last updated