본문 바로가기
블록체인교육/솔리디티

실물자산(RWA) 토큰화 및 KYC(신원 인증) 기반 송금제어 스마트컨트랙트

by Danny_Kim 2026. 10. 9.

실물자산 토큰화 및 KYC 기반 송금제어 스마트컨트랙트 샘플 코드입니다.

교육용이니 참고용으로만 활용하세요!

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// KYC 화이트리스트 기반 실물자산(부동산/채권) 토큰
contract RWAToken {
    string public name = "Real Estate Asset Token"; // 토큰 이름 (예: 부동산 조각투자 토큰)
    string public symbol = "REA";
    uint8 public decimals = 18;
    uint256 public totalSupply;

    address public bankOwner; // 금융기관(관리자) 주소

    // 고객들의 토큰 잔고를 기록하는 장부
    mapping(address => uint256) public balanceOf;

    // ★ [핵심] KYC(신원 인증)를 통과한 고객인지 기록하는 화이트리스트 장부
    mapping(address => bool) public isWhitelisted;

    // 이벤트 로그 (블록체인에 기록을 남김)
    event Transfer(address indexed from, address indexed to, uint256 value);
    event KYCAdded(address indexed account);
    event KYCRemoved(address indexed account);

    // 오직 관리자(은행)만 실행할 수 있도록 제한하는 권한 설정
    modifier onlyOwner() {
        require(msg.sender == bankOwner, "Only bank admin can call this");
        _;
    }

    constructor(uint256 initialSupply) {
        bankOwner = msg.sender; // 컨트랙트를 배포한 은행을 관리자로 설정
        
        // 은행 자신은 화이트리스트에 기본으로 등록
        isWhitelisted[msg.sender] = true;
        
        // 초기 자산 발행
        totalSupply = initialSupply * (10 ** uint256(decimals));
        balanceOf[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }

    // -----------------------------------------------------------
    // [관리자 기능] KYC(신원 인증) 관리
    // -----------------------------------------------------------

    // 1. 고객 신원 확인 후 화이트리스트에 추가 (계좌 개설 승인)
    function addKYC(address account) public onlyOwner {
        isWhitelisted[account] = true;
        emit KYCAdded(account);
    }

    // 2. 문제 발생 시 고객의 자격 박탈 (계좌 동결)
    function removeKYC(address account) public onlyOwner {
        isWhitelisted[account] = false;
        emit KYCRemoved(account);
    }

    // -----------------------------------------------------------
    // [사용자 기능] 통제된 토큰 전송 (Transfer)
    // -----------------------------------------------------------

    // 3. 토큰 송금: 보내는 사람과 받는 사람 모두 KYC를 통과해야만 송금 가능
    function transfer(address to, uint256 amount) public returns (bool) {
        require(balanceOf[msg.sender] >= amount, "Insufficient token balance");
        
        // ★ [핵심 규제 로직] 송금인과 수취인의 KYC 상태 검증
        require(isWhitelisted[msg.sender], "Sender is not KYC verified");
        require(isWhitelisted[to], "Receiver is not KYC verified");

        // 잔고 변경
        balanceOf[msg.sender] -= amount;
        balanceOf[to] += amount;
        
        emit Transfer(msg.sender, to, amount);
        return true;
    }
}

🔑🔑🔑 추천 링크 🔑🔑🔑

  1. 쉽게 이해하고 따라하는 블록체인 마스터 과정
  2. 알트코인 투자 정석 및 2026 암호화폐 시장 주목할 섹터

댓글