100% 검증 가능

Provably Fair

SAFECODE 주사위 게임은 암호학적 검증이 가능하며, 운영자도 결과를 조작할 수 없는 구조입니다.

🤔 왜 Provably Fair인가요?

일반적인 온라인 게임에서는 운영자가 결과를 조작할 수 있습니다. 하지만 Provably Fair 시스템은 수학적으로 조작이 불가능하도록 설계되었습니다.

❌

일반 게임

운영자가 결과를 마음대로 조작 가능. 사용자는 확인할 방법이 없음.

✅

Provably Fair

모든 결과를 수학적으로 검증 가능. 운영자도 조작 불가능.

핵심 원리

게임 결과는 서버 시드와 클라이언트 시드, 그리고 논스(Nonce) 세 가지를 조합하여 계산됩니다. 이 중 하나라도 바뀌면 결과가 완전히 달라집니다.

⚙️ 어떻게 작동하나요?

게임 시작 전: 서버 시드 해시 공개

서버는 비밀 시드(랜덤 문자열)를 생성하고, 그 해시값만 미리 공개합니다. 원본 시드는 아직 비밀입니다. 이렇게 하면 서버가 나중에 시드를 바꿀 수 없습니다.

사용자가 클라이언트 시드 설정

사용자는 자신만의 시드를 직접 입력할 수 있습니다. 이 시드도 결과 계산에 포함되므로, 서버가 결과를 예측하거나 조작할 수 없습니다.

게임 진행: 결과 계산

게임이 진행될 때마다 서버시드 + 클라이언트시드 + 논스를 조합하여 결과를 계산합니다. 논스는 게임마다 1씩 증가합니다.

시드 교체 시: 원본 공개

사용자가 새 시드를 요청하면, 이전 서버 시드의 원본이 공개됩니다. 이를 통해 모든 이전 게임이 공정했는지 검증할 수 있습니다.

💡 쉽게 비유하면:
봉인된 봉투에 답을 미리 적어두고, 봉투의 사진(해시)만 보여준 뒤 게임을 진행합니다. 나중에 봉투를 열어 원래 답이 맞는지 확인할 수 있습니다.

🎲 주사위 결과는 어떻게 계산되나요?

주사위 결과(1~6)는 다음과 같이 계산됩니다:

// 1. 세 가지 값을 콜론(:)으로 연결 combined = "서버시드:클라이언트시드:논스" // 2. HMAC-SHA256 해시 생성 hash = HMAC_SHA256(combined, 서버시드) // 3. 해시의 앞 8자리를 10진수로 변환 number = hexToDecimal(hash의 앞 8자리) // 4. 6으로 나눈 나머지 + 1 = 주사위 결과 결과 = (number % 6) + 1 // 1, 2, 3, 4, 5, 6 중 하나

왜 이 방식이 공정한가요?

💻 직접 JavaScript로 검증하기

이 페이지를 사용하지 않아도, 브라우저 개발자 도구(F12)의 콘솔에서 아래 코드로 직접 검증할 수 있습니다.

// 브라우저 콘솔(F12)에 붙여넣기 async function verify(serverSeed, clientSeed, nonce) { const enc = new TextEncoder(); const key = await crypto.subtle.importKey( 'raw', enc.encode(serverSeed), {name:'HMAC',hash:'SHA-256'}, false, ['sign'] ); const sig = await crypto.subtle.sign('HMAC', key, enc.encode(serverSeed+':'+clientSeed+':'+nonce)); const hex = [...new Uint8Array(sig)].map(b=>b.toString(16).padStart(2,'0')).join(''); return (parseInt(hex.slice(0,8),16) % 6) + 1; } // 사용 예시 (서버시드, 클라이언트시드, 논스) verify('서버시드원본','클라이언트시드',1).then(r=>console.log('주사위:',r));

✅ 어디서든 동일한 시드와 논스를 입력하면 항상 같은 결과가 나옵니다.

🔍 직접 검증해보세요

새 시드 생성 시 이전 시드의 원본이 공개됩니다.
각 게임마다 1씩 증가하는 번호입니다.
🎲
주사위 결과: -
서버 시드 해시:
-

결합 해시:
-

❓ 자주 묻는 질문

서버가 유리한 결과가 나오도록 시드를 미리 계산할 수 있나요? ▼
불가능합니다. 서버 시드의 해시는 게임 전에 이미 공개되어 있고, 클라이언트 시드는 사용자가 직접 설정합니다. 서버가 클라이언트 시드를 미리 알 수 없으므로, 원하는 결과가 나오는 시드를 선택하는 것은 불가능합니다.
왜 서버 시드 원본을 바로 공개하지 않나요? ▼
서버 시드 원본이 공개되면, 사용자가 다음 게임 결과를 미리 계산할 수 있게 됩니다. 따라서 시드가 교체될 때까지 원본은 비밀로 유지하고, 해시값만 공개합니다.
클라이언트 시드를 바꾸면 어떻게 되나요? ▼
클라이언트 시드를 바꾸면 이후 게임의 결과가 완전히 달라집니다. 원하는 시드로 자유롭게 변경할 수 있으며, 이는 사용자가 결과에 영향을 미칠 수 있는 방법입니다.
Nonce는 무엇인가요? ▼
Nonce는 "Number used once"의 약자로, 같은 시드 조합에서 각 게임을 구분하기 위한 번호입니다. 게임을 할 때마다 1씩 증가합니다. 이를 통해 같은 시드로도 매번 다른 결과를 얻을 수 있습니다.
결과가 정말 공정한가요? 1~6이 균등하게 나오나요? ▼
네, 암호학적 해시 함수는 출력값이 균등하게 분포됩니다. 충분한 게임 수가 진행되면 1~6 각 숫자가 약 16.67%씩 나오게 됩니다. 이는 수학적으로 보장됩니다.