VRF (검증 가능한 랜덤 함수)
우리의 가챠 머신은 **검증 가능한 랜덤 함수(VRF)**를 사용하여 모든 추첨이 증명 가능하게 공정하고 변조 방지됨을 보장합니다. 서버나 사용자 모두 결과를 조작할 수 없으며 - 누구나 독립적으로 검증할 수 있습니다.
작동 방식
VRF는 서버와 클라이언트 모두의 엔트로피를 결합하여 결정론적이고 검증 가능한 랜덤 숫자를 생성합니다. 완전한 흐름은 다음과 같습니다:
sequenceDiagram participant User participant Client App participant Server participant Blockchain User->>Client App: 가챠 추첨 시작 Client App->>Server: 새 추첨 세션 요청 Server->>Server: initialEntropy 생성 (nanoid) Server-->>Client App: pullId + initialEntropy 반환 Client App->>Client App: clientEntropy 생성 (random) Client App->>Blockchain: pullId|clientEntropy와 함께 결제 전송 Blockchain-->>Server: 결제 확인됨 Server->>Server: 엔트로피 결합 및 서명 Server->>Server: 해시 → finalEntropy Server->>Server: 랜덤 숫자로 변환 [1-10000] Server->>Server: 티어 범위에 따라 상품 선택 Server-->>Client App: 상품 + VRF 증명 데이터 반환 Client App->>Client App: 서명 및 해시 무결성 검증 User->>User: 독립적으로 결과 검증 가능
VRF 프로세스 단계별 설명
1. 초기 엔트로피 (서버 측)
가챠 추첨을 시작하면 서버는 nanoid를 사용하여 10자 랜덤 문자열을 생성합니다. 이는 결제를 하기 전에 데이터베이스에 커밋되어 서버가 나중에 변경하는 것을 방지합니다.
2. 클라이언트 엔트로피 (사용자 측)
사용자의 기기가 자체 랜덤 데이터를 생성합니다. 이 엔트로피는 블록체인의 결제 트랜잭션에 포함되어 서버가 변경할 수 없는 불변 기록을 생성합니다.
3. 결합 엔트로피
두 엔트로피 소스가 연결됩니다:
combinedEntropy = initialEntropy + clientEntropy4. 서명된 결합 엔트로피
서버는 Ed25519(TweetNaCl 경유)를 사용하여 결합 엔트로피에 서명합니다:
signedCombinedEntropy = Ed25519.sign(combinedEntropy, serverSecretKey)이 서명은 서버가 특정 엔트로피 값을 처리했음을 증명합니다.
5. 최종 엔트로피
서명은 SHA-256을 사용하여 해시되어 최종 엔트로피를 생성합니다:
finalEntropy = SHA256(signedCombinedEntropy)6. 랜덤 숫자 생성
최종 엔트로피는 [1, 10000] 범위의 숫자로 변환됩니다:
randomNumber = (BigInt(finalEntropy) % 10000) + 1이것은 0.01% 정밀도를 가진 균일하게 분포된 랜덤 숫자를 제공합니다.
7. 상품 티어 선택
랜덤 숫자는 구성된 확률 범위에 따라 상품 티어에 매핑됩니다. 각 가챠 머신에는 자체 티어 구성이 있습니다.
왜 이것이 공정한가
flowchart TD
subgraph ServerCantCheat ["서버는 속일 수 없음"]
A[초기 엔트로피가<br/>결제 전에 커밋됨] --> B[클라이언트 엔트로피를<br/>본 후 변경 불가]
end
subgraph UserCantCheat ["사용자는 속일 수 없음"]
C[클라이언트 엔트로피가<br/>블록체인 트랜잭션 내] --> D[초기 엔트로피를<br/>본 후 변경 불가]
end
subgraph Deterministic ["결과는 결정론적"]
E[동일한 입력은 항상<br/>동일한 출력 생성] --> F[누구나<br/>계산 검증 가능]
end
B --> G[공정한 결과]
D --> G
F --> G
서버는 결과를 조작할 수 없습니다 왜냐하면:
- 초기 엔트로피가 결제 전에 데이터베이스에 커밋됩니다
- 서버는 커밋 후까지 클라이언트 엔트로피를 알지 못합니다
- 무엇이든 변경하면 암호화 서명이 무효화됩니다
사용자는 결과를 조작할 수 없습니다 왜냐하면:
- 클라이언트 엔트로피가 블록체인 트랜잭션에 내장되어 있습니다
- 제출되면 변경할 수 없습니다
- 서버의 초기 엔트로피가 이미 고정되어 있습니다
결과는 검증 가능합니다 왜냐하면:
- 모든 엔트로피 값이 추첨 후 반환됩니다
- 서명 검증을 위한 공개 키가 게시되어 있습니다
- 누구나 정확한 계산을 재현할 수 있습니다
결과 검증
각 가챠 추첨 후 완전한 VRF 증명 데이터를 받습니다:
- Initial Entropy - 서버의 랜덤 문자열 (결제 전에 커밋됨)
- Client Entropy - 사용자의 랜덤 데이터 (블록체인 트랜잭션에서)
- Signed Combined Entropy - 서버의 Ed25519 서명
- Final Entropy - 서명의 SHA-256 해시
- Random Number - 파생된 숫자 [1-10000]
- Prize Tier - 추첨이 착지한 티어
앱은 자동으로 검증합니다:
- ✓ 서명이 공개 키와 일치
- ✓ 서명의 해시가 최종 엔트로피와 같음
- ✓ 랜덤 숫자 계산이 올바름
Ed25519 및 SHA-256 구현을 사용하여 수동으로 검증할 수도 있습니다.
기술 사양
| 구성 요소 | 구현 |
|---|---|
| Initial entropy | nanoid(10) - 10자 랜덤 문자열 |
| Signature algorithm | Ed25519 (TweetNaCl) |
| Hash function | SHA-256 |
| Random range | [1, 10000] 포함 |
| Precision | 0.01% (100 베이시스 포인트) |
공개 키
서명 검증을 위한 VRF 공개 키:
i5ScBBvmGh6my9B/X+NpcUIlvRSWz7+U8M7/GprNzYk=이것은 base64로 인코딩된 32바이트 Ed25519 공개 키입니다. 검증에 사용하려면 base64에서 디코딩하여 원시 바이트를 얻은 다음 모든 Ed25519 구현(예: TweetNaCl)을 사용하여 이 키로 서명을 검증하세요.