결제 시스템 설계 (Payment System Design)
작성일: 2025년 12월 26일 상태: 설계 확정 (Implementation Ready)
이 문서는 Vivid AI 플랫폼의 Vivid Token (VT) 충전을 위한 결제 시스템의 아키텍처와 흐름을 정의합니다.
1. 개요 및 방식 선정
Vivid AI는 Web3 지갑 연동을 기반으로 하며, 개발 속도와 유지보수성, 그리고 수수료 효율성을 고려하여 "온체인 송금 + 백엔드 검증 (On-chain Transaction + Backend Verification)" 방식을 채택했습니다.
선정 이유
- 신속한 구현: 별도의 스마트 컨트랙트(Sale Contract) 개발 및 감사(Audit) 비용 없이, 표준 코인 전송 로직만으로 구현 가능합니다.
- 수수료 절감: 플랫폼 이용 수수료(Platform Fee)가 없으며, 가스비(Gas Fee) 외의 추가 비용이 발생하지 않습니다.
- 유연성: 백엔드에서 환율이나 프로모션 로직을 변경하기 용이합니다.
2. 결제 프로세스 흐름 (Workflow)
3. 데이터 모델 설계
3.1. PaymentHistory Entity
결제 내역을 기록하고 중복 처리를 방지하기 위한 엔티티입니다.
| 필드명 | 타입 | 설명 | 제약조건 |
|---|---|---|---|
id | UUID | 고유 ID | PK |
userId | UUID | 결제한 사용자 ID | FK (Users) |
txHash | String | 블록체인 트랜잭션 해시 | Unique, Index |
amount | Decimal | 실제 지불한 코인 금액 | Precision: 18, Scale: 8 |
currency | String | 지불 통화 심볼 (예: ETH, USDT) | |
vtAmount | Integer | 충전된 VT 양 | |
status | String | 상태 (PENDING, SUCCESS, FAILED) | |
createdAt | Date | 생성 일시 |
4. 백엔드 구현 명세
4.1. PaymentsModule
verifyTransaction메서드:ethers.js또는viem라이브러리를 사용하여 RPC 노드와 통신합니다.- Race Condition 방지: 동일한
txHash에 대한 동시 요청을 막기 위해 데이터베이스의 Unique Constraint를 적극 활용하거나 Redis Lock을 고려합니다.
4.2. 환경 변수 (Environment Variables)
백엔드 .env 파일에 다음 설정이 추가되어야 합니다.
# Payment Configuration
# 결제 대금을 수령할 회사의 지갑 주소
TREASURY_WALLET_ADDRESS=0x1234...abcd
# 블록체인 네트워크 RPC URL (이미 존재할 수 있음)
BLOCKCHAIN_RPC_URL=https://...
5. 프론트엔드 구현 명세
5.1. Subscribe Page
- 패키지 목록: 하드코딩된 VT 패키지 또는 백엔드에서 불러온 설정값 표시.
- Wagmi Hooks:
useSendTransaction: 실제 코인 전송 트리거.useWaitForTransactionReceipt: 트랜잭션이 블록에 담길 때까지 대기.
- UX: 트랜잭션 대기 중 로딩 인디케이터 및 성공/실패 토스트 메시지 필수.
6. 보안 고려사항
- Double Spending 방지:
txHash컬럼에 Unique Index를 걸어, 하나의 트랜잭션으로 두 번 충전하는 것을 원천 차단합니다. - 수신자 주소 검증: 트랜잭션의
to주소가 반드시TREASURY_WALLET_ADDRESS와 일치하는지 백엔드에서 엄격하게 확인합니다. - 금액 오차 허용 범위: 부동소수점 연산 시 아주 미세한 오차가 발생할 수 있으므로, 검증 시 적절한 허용 오차(Epsilon)를 고려하거나 라이브러리의 BigNumber 기능을 사용합니다.