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%씩 나오게 됩니다. 이는 수학적으로 보장됩니다.