아크시티 게임의 뽑기(가챠), 합성, 거래 기록이 공정하게 운영되고 있는지 누구나 독립적으로 검증할 수 있는 오픈소스 코드입니다.
| 검증 항목 | 방법 |
|---|---|
| 뽑기 확률 | 서버가 공개한 확률표와 이 코드의 확률표가 동일한지 비교 |
| 뽑기 결과 | seed + nonce를 입력하면 결과를 재현 → 서버 결과와 대조 |
| 시드 무결성 | Commit-Reveal 방식으로 서버가 결과를 미리 조작할 수 없음을 증명 |
| 거래 기록 | Merkle Tree + Polygon 블록체인 앵커링으로 기록 변조 불가 |
| 확률표 변조 | 확률표 해시가 Polygon에 기록됨 → 서버가 몰래 확률을 바꾸면 해시 불일치 |
gacha_engine.py ← 서버에서 실제 사용하는 뽑기 엔진 (동일 사본)
merkle_tree.py ← 거래 기록 Merkle Tree 검증 로직
verify.py ← 커맨드라인 검증 도구
python verify.py --rate-hash출력 예시:
ArkCity 확률표
버전: v1.0
해시: a1b2c3d4...
[뽑기 확률]
일반 92.869%
고급 6.633%
희귀 0.474%
영웅 0.024%
전설 합성 전용 (뽑기 불가)
[합성 성공률]
일반→고급 18.0%
고급→희귀 18.0%
희귀→영웅 11.0%
영웅→전설 11.0%
천장: 20회 실패 시 천장 수령 가능
대시보드(https://netrons.co.kr/game/dashboard)의 소환검증 탭에서 seed와 nonce를 확인한 후:
python verify.py --seed <서버시드> --nonce <클라이언트논스>결과가 대시보드에 표시된 등급/캐릭터와 일치하면 공정한 뽑기입니다.
서버가 뽑기 전에 커밋한 해시와 실제 시드가 일치하는지:
python verify.py --seed-hash <커밋해시> --seed <서버시드>1. 서버가 시드(seed)를 생성하고, SHA-256 해시만 클라이언트에 전달 (커밋)
2. 클라이언트가 논스(nonce)를 생성하여 서버에 전달
3. 서버가 seed + nonce를 결합하여 난수 생성 → 등급/캐릭터 결정 (리빌)
4. seed를 공개하여 클라이언트가 결과를 검증
서버는 커밋 시점에 이미 시드를 확정했으므로, 클라이언트의 논스를 본 후 시드를 바꿀 수 없습니다. 클라이언트의 논스는 서버가 예측할 수 없으므로, 서버가 원하는 결과를 미리 만들 수 없습니다.
- 10분마다 모든 거래 기록의 Merkle Root를 Polygon 메인넷에 기록
- 앵커링 지갑: 대시보드에서 확인
- 기록된 트랜잭션은 Polygonscan에서 누구나 확인 가능
- 트랜잭션의 Input Data와 대시보드의 Root Hash가 일치하면 기록이 원본 그대로임
서버는 확률표의 SHA-256 해시를 Polygon에 주기적으로 기록합니다.
python verify.py --rate-hash로 이 코드의 확률표 해시를 확인- 대시보드 블록체인 탭에서 기록된 확률표 해시 확인
- 두 값이 일치하면 → 서버가 이 코드와 동일한 확률표를 사용 중
MIT License — 자유롭게 사용, 수정, 배포 가능