yeonghoon.kim

  • 게시판
  • 갤러리

ChloeToken 테스트넷 배포

김영훈 2026.03.02 18:30 조회 수 : 232

Sepolia 테스트넷에 ERC-20 토큰 배포.

ChloeToken.

구성.

Caddy WAF
Traefik
Frontend
Backend FastAPI
PostgreSQL
Ethereum RPC
Sepolia Testnet

컨트랙트.

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

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

contract ChloeToken is ERC20, Ownable {
    uint256 public constant INITIAL_SUPPLY = 1_000_000 * 10**18;

    constructor() ERC20("ChloeToken", "CHT") Ownable(msg.sender) {
        _mint(msg.sender, INITIAL_SUPPLY);
    }

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

    function burn(uint256 amount) public onlyOwner {
        _burn(msg.sender, amount);
    }
}

OpenZeppelin ERC20 사용.
Ownable로 owner 권한 관리.
초기 발행 1,000,000 CHT.

Docker 구성.

services:
  postgres:
    image: postgres:15-alpine
    
  backend:
    build: ./backend
    environment:
      - SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/...
      - ADMIN_PRIVATE_KEY=${ADMIN_PRIVATE_KEY}
    
  frontend:
    build: ./frontend

Traefik 라우팅.

labels:
  - "traefik.http.routers.chloetoken.rule=Host(`chloetoken.yeonghoon.kim`)"
  - "traefik.http.routers.chloetoken.entrypoints=web"

Caddy WAF.

chloetoken.yeonghoon.kim {
  @allowed remote_ip [관리자 IP]/32 [회사 IP]/26
  
  handle @allowed {
    reverse_proxy traefik:8080
  }
  
  handle {
    respond "Forbidden" 403
  }
}

토큰 전송 요청.

{
  "to_address": "0x[수신자_주소]",
  "amount": "100.5",
  "memo": "Test Transfer #1"
}

백엔드 처리.

to_address 검증.
관리자 개인키로 서명.
Ethereum RPC 전송.
거래 영수증 확인.
PostgreSQL에 거래 내역 저장.

응답.

{
  "transactionHash": "0x...",
  "from": "0x...",
  "to": "0x...",
  "value": "100.5",
  "blockNumber": 6054789,
  "status": "success"
}

메모 필드.

class TransferRequest(BaseModel):
    to_address: str
    amount: float
    memo: Optional[str] = None

transaction = db_models.Transaction(
    tx_hash=receipt['transactionHash'].hex(),
    from_address=settings.ADMIN_ADDRESS,
    to_address=request.to_address,
    amount=request.amount,
    memo=request.memo,
    status="confirmed"
)

처음엔 프론트에서 개인키를 받으려 했음.

const privateKey = document.getElementById('privateKey').value;

이건 위험해서 폐기.

백엔드 환경변수로 변경.

ADMIN_PRIVATE_KEY = os.getenv('ADMIN_PRIVATE_KEY')

프론트에서 RPC 직접 호출도 해봤음.

const balance = await ethers.provider.getBalance(address);

이후 백엔드 API로 변경.

const response = await fetch('/api/v1/balance/' + address);

상태.

컨트랙트 배포.
프로덕션 배포.
IP 접근 제한.
거래 메모 기능.
토큰 발행 테스트.
owner 권한 이전 검토.
Etherscan 검증 검토.

개인키는 프론트에 두면 안 됨.
서명은 백엔드에서 처리.
접근은 IP로 제한.

  • 추천 0

  • 비추천 0
이 게시물을
목록

댓글 0

번호 제목 글쓴이 날짜 조회 수
공지 2025 일본 여행 계획 김영훈 2024.10.10 4119
공지 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) 김영훈 2024.03.10 3752
17 ARM Kubernetes 구축 1 - VNC & KVM 설치 김영훈 2026.02.14 70
16 ARM Kubernetes 구축 3 - 모니터링 스택 Prometheus Grafana 김영훈 2026.02.16 179
15 ARM Kubernetes 구축 5 - 실전 업그레이드 경험기 v1.29→v1.35 김영훈 2026.02.18 238
14 ARM Kubernetes 구축 4 - 외부 접근 환경 VPN MetalLB Ingress 김영훈 2026.02.18 246
13 ARM Kubernetes 구축 7 - 클러스터 무중단 업그레이드 v1.29→v1.35 김영훈 2026.02.20 252
12 ARM Kubernetes 구축 8 - 실전 보안 RBAC 네트워크 정책 Pod 보안 김영훈 2026.02.20 194
11 ARM Kubernetes 구축 6 - 무중단 업그레이드 김영훈 2026.02.20 208
10 비트코인 자동매매 봇 대시보드 김영훈 2026.02.21 144
9 Apache RewriteRule 쿼리스트링 처리 김영훈 2026.02.28 258
8 Redis 대기열 시스템 김영훈 2026.03.01 212
» ChloeToken 테스트넷 배포 김영훈 2026.03.02 232
6 Tech Support 플랫폼 김영훈 2026.03.04 80
5 WAF 운영 6주 분석 김영훈 2026.03.13 199
4 JSON-LD 학습 - 메일과 Calendar 자동 인식 김영훈 2026.03.28 151
3 7일간의 일본 여행 일정 짜기: 신칸센 + JR 패스 + Google Calendar 활용 프로젝트 김영훈 2026.03.28 128
2 교토 4박 5일 여행 일정: Google Calendar로 관리하는 일정짜기 김영훈 2026.04.05 124
1 OpenClaw 복원과 GLM-5.1 전환 김영훈 2026.04.07 145
쓰기 태그
 첫 페이지 7 8 9 10 11 12 13 14 15 16 끝 페이지