잔액 및 지갑: 다중 지갑 아키텍처
1) 다중 지갑과 목표
하나의 "밸런스 = 숫자" 항목은 iGaming의 현실을 다루지 않습니다. 실제 지갑 (현금), 보너스 펀드, 베팅 풀, 프리 스핀, 컴퓨터 포인트, 때로는 통화 지갑 (EUR/USD/BRL) 과 같은 별도의 지갑/하위 계정이 필요합니다.
아키텍처의 목표는 다음과 같습니다
돈 정확도 (이중 입력, 감사 가능성).
쓰기 정책 (예: 첫 번째 보너스/베이거, 현금).
속도 (p95 API는 250-400ms, 실시간으로 베팅/정산).
안전 및 규정 준수 (KYC/AML, 책임있는 플레이 제한, 규제 기관).
규모: 최고 → 수만 개의 작업/초, 수십억 개의 게시물/월.
2) 데이터 모델: "Ledger + Subwallets"
최소 엔티티
계정: 플레이어/브랜드/마켓.
테이블의 예 (단순화)
sql
-대차 대조표 계정 이중 입력 (비즈니스 포함)
계정 (id, owner _ user _ id, 유형, 통화, 상태 등)
-게시 (이중 입력, 비즈니스 거래 참조)
(PHP 3 = 3.0.6, PHP 4)
-홀드 (매장량)
보유 (id, 계정 _ id, m액 _ minor, 통화, 이유, 만료 _ at, 주, 연산 _ id, 생성 _ at)
-쓰기 정책 (우선 순위)
(PHP 3 = 3.0.6, PHP 4)
-교차 환율 fx _ rates (ccy _ from, ccy _ to, rate, pelluction, 유효한 _ from)규칙: 진실은 거래 저널 ('ledger _ entries') 에 있습니다. 현재 잔액은 집계 (구체화 된 스냅 샷) 이거나 저널에서 계산됩니다 (비싸지 만 사실 만).
3) 지갑의 종류와 행동
4) 상각 정책 및 우선 순위
자금 출처에 대한 알고리즘을 명확하게 공식화합니다
예 (슬롯/카지노):1. 먼저 WAGER에서 작성하십시오 (베팅이 활성화 된 경우).
2. 그런 다음 BONUS에서 지칠 때까지.
3. 나머지는 CASH에서 온 것입니다.
예 (스포츠):1. 첫 번째 CASH (규제/세금).
2. 그런 다음 BONUS (freebet) 를 WAGER로 번역합니다.
"정책 결정" 을 Postings의 속성으로 저장하여 지원 및 감사에서 "왜 그들이 작성했는지" 확인하십시오.
5) 돈과 운영의 수명주기
예금
1. 'POST/지갑/보증금' → 보류중인 항목 (PSP 소시지받은 편지함) 을 만듭니다.
2. Webhook PSP (HMAC 서명, 'operation _ id' 에 의한 demempotency) → 크레딧 CASH, 카테고리 = 'DEPOSIT'.
3. 'wallet _ uptaided' 이벤트를 게시합니다.
요금
1. 'POST/bet/place' → 소스 계정 (CASH/BONUS/WAGER) 에 홀드 (예비) 를 생성합니다.
2. 요율을 확인할 때, 홀드 → 직불 소스의 이전, 공급자의 서비스 "결제" 계정의 신용은 → 입니다.
3. 취소시-릴리스 보류.
정산 (결과)
게인: 공급자의 "결제" 계정의 직불 결제 → 신용 CASH 또는 정책 WAGER → BONUS → CASH.
손실: 플레이어에게 크레딧없이 트랜잭션 → 공급자의 "비용" 을 닫습니다.
1. KYC/AML 확인, 책임있는 플레이 제한.
2. 인출 금액을 유지하십시오.
3. PSP의 성공 → 최종 직불 CASH → 신용 계정 "결제".
4. PSP → 릴리즈 홀드가 실패했습니다
6) 이념과 정확히 한 번의 "의미 내"
고유 인덱스를 사용하는 Everywhere 'operation _ id' (UUI/강화 ULID). 과거 트랜잭션의 → 상태를 다시 요청하십시오.
PSP/게임 제공 업체 웹 후크: '이벤트 _ id + 서명' 으로 dedupe가있는받은 편지함 테이블. 처리 - demotent 작업자 (전송 패턴).
클라이언트 용 HTTP에 대한 Idempotency-Key; TTL을 24-72 시간 이상 저장하십시오.
7) 보유 및 보유
홀드는 상각이 아니라 사용 가능한 잔액의 "동결" 입니다.
규칙:- 수명 유지: 초 → 분 (속도) 또는 시간 (출력).
- 홀드는 부분적으로 또는 완전히 소멸 될 수 있습니다 (부분 정착).
- 만료되는 경우-자동 릴리스 및 이벤트.
- (PHP 3 = 3.0.6, PHP 4)
8) 통화, FX 및 반올림
통화 금액-작은 단위 (센트), 유형-정수.
은행 반올림 (반올림에서 짝수) 또는 T & C.
FX: 지갑을 나누는 것이 좋습니다. 별도의 작업으로 변환합니다:- '직불 EUR, 신용 FX _ EURUSD' 및 '직불 FX _ EURUSD, 신용 USD' -감사에 투명합니다.
- 분쟁에서 코스를 자동으로 "도달" 하는 것은 금지되어 있습니다. 모든 규칙은 FX 정책에 있습니다.
9) 책임있는 플레이와 한계
예금/베팅/손실/세션 제한 (일/주/월), 냉각, 자체 제외.
보류/직불 전에 사전 확인으로 구현되었습니다.
실패 로그-별도의 감사 로그에서 지원 및 규제 기관이 사용할 수 있습니다.
10) 지갑 주위의 사기 방지 신호
장치 클러스터/ASN, 빈번한 작은 퇴적물 → 큰 인출, 세척 패턴.
BIN/국가/장치에 의한 '예금/내부' 에 대한 속도 제한.
수신자 블록 목록 (지갑/IBAN), "노새" 목록.
지갑 이벤트 → 채점 기능 저장소 (로그인/예금/비율).
11) 일관성과 성능
트루 vs 캐시
진실은 원장에 있습니다. "밸런스 가져 오기" API의 경우 구체화 된 스냅 샷 ('user _ id + wallet _ style → balance _ minor, 버전') 을 유지하십시오.
쓰기: 데이터베이스의 트랜잭션 → 캐시를 무효화합니다.
"무거운" 흐름 (실시간) 에서는 철회/큰 내기 전에 짧은 TTL 1-5 s + 필수 진실 점검이 적절합니다.
스케일링
'user _ id' (모듈/순위) 에 따라 CASH vs BONUS를위한 별도의 파편 풀.
핫 키 (VIP/봇) -' user _ id '로 통합을 요청하십시오.
비동기 집계 (백그라운드에서 '게시' → "스냅 샷 업데이트" 작성).
12) API 계약 (의사)
균형
http
GET/v1/지갑? 유형 = CASH, BONUS
→ 200 {"지갑": [
{"유형": "CASH", "통화": "EUR", "사용 가능": 12050, "보류": 500, 버전 ": 1942}, {" 유형 ":" BONUS "," 통화 ":" EUR "," 사용 가능 ": 3000," wager _ req ": 15000}
]}내기 (보류)
http
POST/v1/베팅/장소
{"bet _ id": "b _ 123", "마운트": 500, "통화": "EUR", "source _ policy": "kazino _ basic", "idempotency _ key": "ik _ abc"}
→ 201 {"상태": "HELD", "hold _ id": "h _ 789", "만료": 30}정착
http
POST/v1/베팅/정착
{"bet _ id": "b _ 123", "결과": "WIN", "지불": 1250}
→ 200 {"상태": "SETTLED", "cash _ delta": + 1250}http
POST/v1/인출
{"relater _ id": "w _ 456", "m액": 10000, "통화": "EUR", "방법": "sepa", "demempotency _ key": "ik _ def"}
→ 202 {"state": "PENDING", "nethern _ chek _ sec": 2, "state _ url": "/v1/retrowals/w _ 456 "}13) 게시물의 예 (이중 입력)
예금 €100 (PSP 수수료 €1, commis. 계정-별도)
직불: PSP _ Settlements (EUR) 10000
크레딧: 사용자. CASH (EUR) 10000
직불: 사용자. CASH (EUR) 100 (수수료 이동)
크레딧: PSP _ Fees (EUR) 100BONUS에서 €5로 내기 (WAGER로 이전)
직불: 사용자. BONUS (EUR) 500
크레딧: 사용자. WAGER (EUR) 500 (베팅으로 이동)
직불: 사용자. 웨이저 (EUR) 500
크레딧: 공급자. 결제 (EUR) 500 (작성된 요금)€12를 이기십시오. 5 → CASH에서
직불: 공급자. 정착 (EUR) 1250
크레딧: 사용자. CASH (EUR) 1250기록 보류 (HOLD 서비스 계정을 통한 실현)
직불: 사용자. CASH (EUR) 500
크레딧: 사용자. HOLD (EUR) 500 (보류에 의해 생성)
-정착시
직불: 사용자. HOLD (EUR) 500
크레딧: 공급자. 정착 (EUR) 500
-취소시
직불: 사용자. HOLD (EUR) 500
크레딧: 사용자. CASH (EUR) 50014) 감사, 불변성 및 준수
로그에 대한 WORM/면역 (객체 저장/WAL 아카이브).
메타 로그 액세스: 한계를 읽거나 변경 한 사람, 수동 조정 사람 (정당화를 통한 "조정 게시" 를 통해서만).
GDPR/규제 기관: 5-10 년 동안의 거래 저장 (관할권 별), 플레이어의 합의 투명성 (상각/베팅 기록).
15) 결함 내성 및 DR
다중 AZ 필수; 지갑을위한 DR- 영역: 영역에서 동기화 복제, async-영역으로; PITR이 활성화되었습니다.
체크리스트에 의해서만 수동으로 대기를 촉진하십시오 (분할 뇌 제외).
매주 점검 복원 (테스트 복원), 제어 보고서의 양 조정.
16) 지갑 관찰 가능성
SLI: 'depost _ success _ ratio', 'relat _ success _ ratio', 'bet _ hold _ latency _ p95', 'relation _ latency _ p95'.
계정: 'ledger _ postings _ rate', 'db _ comections _ shature', 'queu _ lag _ secons', 'hold _ maneed _ rate'.
경고: 시장에서 PSP 성공 감소, 'hold _ maneed _ rate' 성장, 게임 제공 업체가 동기화되지 않음 (확인> N 분 없음).
17) 테스트 및 품질 관리
PSP/게임 제공 업체 (웹 후크/서명) 와의 계약 테스트.
부동산 기반 자금 테스트: 각 게시에서 자동 이체 합계 = = 크레딧 합계.
퍼즈/카오스: PSP/제공자 지연, 웹 후크 반복, 네트워크 플래피.
로드: 버스트 베팅 (60-120 초), 담그기 (4-8 시간), '큐 _ lag' 및 p99 제어.
18) 생산 준비 점검표
- 이중 원장 항목, 'operation _ id' 로 게시를 통한 모든 작업.
- 명확한 지출 정책 및 우선 순위 주문 (게시와 함께 유지).
- TTL/부분 결제/만료, 베팅/철회와의 통신을 보유합니다.
- 받은 편지함/전송, HMAC 웹 후크, 모든 경계에서의 demempotency.
- 개별 CASH/BONUS/WAGER/FS/POINTS 지갑; 통화로 나눕니다.
- FX 및 사소한 반올림; 변환 - 별도의 작업.
- 보류/직불 할 책임있는 플레이 제한; 실패 감사.
- 캐시 읽기 (짧은 TTL) + 중요한 조치를 취하기 전에 진실 점검이 필요했습니다
- PITR/백업/DR 스크립트; 수동 홍보, 정기적 인 DR 연습.
- 대시 보드/경고 SLI + 기술; WORM 로그 및 액세스 로그.
- 로드/카오스 테스트; PSP/공급자와의 조정 보고서.
요약 다시 시작
다중 지갑 아키텍처는 "많은 잔액 번호" 가 아니라 이중 입장, 지출 정책, 예약 및 감사 및 플레이어를위한 투명한 흔적이있는 금융 시스템입니다. 통나무, 사용 보유 및 demmpotence, 별도의 지갑 및 통화, 자동화 조정 및 DR.에 진실을 유지하십시오. 이렇게하면 지갑이 UX에 빠르며 돈이 정확하고 피크로드 및 규제 점검에 내성이 있습니다.
