Decentralization

Solidity 기초 스마트 계약을 이용한 토큰 시스템 만들기

이영훈닷컴 2025. 3. 15. 17:23
728x90

오늘은 Solidity로 작성된 간단한 토큰 계약인 개인 토큰 만들기에 대해 배웠습니다. 이 계약은 기본적인 ERC-20 스타일의 토큰을 구현한 것으로, 특정 주소 간에 토큰을 전송할 수 있는 기능을 제공합니다. 이 블로그에서는 코드의 각 부분을 분석하고 설명해보겠습니다.

Solidity 스마트 계약: 개인 토큰

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.4;

// YHToken이라는 간단한 토큰 계약
contract YHToken {

    // 각 주소의 토큰 잔액을 저장하는 매핑
    mapping(address => uint) public balanceOf;

    // 생성자는 계약이 배포될 때 초기 토큰 공급량을 설정합니다.
    // 초기 공급량은 계약을 배포한 주소로 할당됩니다.
    constructor(uint initialSupply) public {
        balanceOf[msg.sender] = initialSupply; // 배포자의 주소에 초기 공급량 할당
    }

    // transfer 함수는 사용자가 다른 주소로 토큰을 전송할 수 있도록 합니다.
    // 두 개의 파라미터를 받습니다: 수신자 주소(_to)와 전송할 토큰의 양(_value)
    function transfer(address _to, uint256 _value) public returns (bool success) {
        // 전송자가 충분한 토큰을 보유하고 있는지 확인
        require(balanceOf[msg.sender] >= _value, "잔액 부족");

        // 수신자의 잔액이 오버플로우되지 않도록 확인 (보호용 체크)
        require(balanceOf[_to] + _value >= balanceOf[_to], "오버플로우 오류");

        // 전송자의 잔액에서 토큰을 차감
        balanceOf[msg.sender] -= _value;

        // 수신자의 잔액에 토큰을 추가
        balanceOf[_to] += _value;

        // 전송이 성공했음을 나타내는 true 반환
        return true;
    }
}

1. 계약 개요

이 계약은 간단한 토큰 시스템을 구현한 것입니다. balanceOf 매핑을 사용하여 각 주소가 얼마나 많은 토큰을 보유하고 있는지 추적합니다. 사용자는 transfer 함수를 통해 다른 주소로 토큰을 전송할 수 있습니다.

2. 매핑 (Mapping)

mapping(address => uint) public balanceOf;
  • 매핑(mapping)은 특정 키(address)에 대한 값을 저장하는 데이터 구조입니다. 여기서 balanceOf는 각 주소의 잔액을 추적하는데 사용됩니다. 즉, 각 주소가 얼마의 토큰을 보유하고 있는지 기록하는 역할을 합니다.

3. 생성자 (Constructor)

constructor(uint initialSupply) public {
    balanceOf[msg.sender] = initialSupply;
}
  • 생성자(constructor)는 계약이 배포될 때 한 번만 실행됩니다. initialSupply라는 파라미터를 받아 배포자(msg.sender)의 주소에 해당하는 잔액을 초기화합니다. 이로 인해 계약을 배포한 주소는 지정된 양의 토큰을 처음으로 보유하게 됩니다.

4. 토큰 전송 함수 (Transfer)

function transfer(address _to, uint256 _value) public returns (bool success) {
    require(balanceOf[msg.sender] >= _value, "잔액 부족");
    require(balanceOf[_to] + _value >= balanceOf[_to], "오버플로우 오류");

    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;

    return true;
}
  • transfer 함수는 사용자 간에 토큰을 전송할 수 있도록 하는 핵심 함수입니다. 이 함수는 두 가지 주요 작업을 수행합니다:

    1. 잔액 체크: 먼저 전송자가 충분한 토큰을 보유하고 있는지 확인합니다. require(balanceOf[msg.sender] >= _value) 문을 사용하여 잔액 부족인 경우 전송을 중단합니다.
    2. 오버플로우 방지: 두 번째 require 문에서는 수신자의 잔액이 증가한 후 오버플로우가 발생하지 않는지 체크합니다. 이 과정은 수신자의 주소에 너무 많은 토큰이 추가되어 잔액이 음수로 되는 상황을 방지합니다.
  • 전송이 성공하면, 전송자의 잔액은 차감되고 수신자의 잔액은 증가합니다. 마지막으로 true를 반환하여 전송이 성공했음을 나타냅니다.

5. 에러 처리

이 계약에서는 require 문을 사용하여 에러를 처리합니다.

  • 첫 번째 require 문에서는 전송자가 보유한 토큰이 전송하려는 금액보다 많을 경우에만 전송이 가능하도록 합니다. 잔액이 부족하면 "잔액 부족" 메시지를 출력합니다.
  • 두 번째 require 문은 수신자의 잔액이 오버플로우되지 않도록 체크하며, 오버플로우가 발생할 경우 "오버플로우 오류"라는 메시지를 출력합니다.

6. 최종 결론

이번에 배운 YHToken 계약은 간단한 토큰을 구현하는 데 필요한 기본적인 요소들을 담고 있습니다. balanceOf 매핑을 사용하여 각 주소의 잔액을 추적하고, transfer 함수를 통해 안전하게 토큰을 전송할 수 있습니다. 이 계약은 기본적인 토큰 시스템의 원리를 이해하는 데 좋은 예시가 될 수 있습니다.

Solidity와 스마트 계약 개발에 대한 더 깊은 이해를 위해서는 ERC-20 같은 표준을 참고하고, 다양한 기능을 추가하여 실습을 계속하는 것이 중요합니다.


오늘 배운 내용을 통해 Solidity로 스마트 계약을 작성하고 배포하는 과정에서 중요한 개념들을 익혔습니다. 스마트 계약 개발에 대한 추가 질문이 있으면 언제든지 댓글로 남겨주세요!

728x90