증명 가능한 공정성(Provably Fair) 쉽게 이해하기
dond.win이 Deal or No Deal의 어떤 라운드도 조작되지 않았음을 증명하는 방법: 케이스를 고르기 전에 공개되는 SHA-256 커밋, 셔플에 섞이는 내 클라이언트 시드, 라운드 종료 후 공개되는 두 시드, 그리고 25개 케이스를 전부 다시 계산하는 검증 페이지.
증명 가능한 공정성이 해결하는 문제
일반적인 온라인 게임에서는 운영자가 정직하게 섞었고, 내가 고른 뒤에 큰 상금을 옮기지 않았다고 믿을 수밖에 없습니다. 증명 가능한 공정성(Provably Fair)은 그 믿음을 계산으로 대체합니다. 운영자는 내가 행동하기 전에 셔플 결과를 미리 확약하고, 내 입력이 셔플에 영향을 주게 하며, 끝난 뒤 모든 것을 공개해 직접 확인할 수 있게 합니다.
한 라운드에서 일어나는 일
- 커밋. 내가 케이스를 고르기 전에 서버가 비밀 서버 시드를 생성하고 그 SHA-256 해시를 공개합니다. 이 해시는 게임 안에 커밋으로 표시됩니다. 나중에 시드를 바꾸면 해시가 달라지므로 서버는 시드를 바꿀 수 없습니다.
- 내 입력. 나에게는 클라이언트 시드가 있습니다. 기본값은 무작위이며, 라운드 시작 전에 베팅 패널에서 직접 입력할 수도 있습니다. 서버는 이 값을 예측할 수 없습니다.
- 셔플. 25개 상금 래더를 Fisher-Yates로 섞습니다. 난수 바이트는 서버 시드를 키로, 클라이언트 시드를 메시지로 하는 HMAC-SHA256으로 만듭니다. 어느 한쪽이 혼자서 배치를 정할 수 없습니다.
- 공개. 라운드가 끝나면 커밋과 내 클라이언트 시드 옆에 서버 시드가 공개됩니다.
- 검증. 서버 시드를 해시해 커밋과 비교합니다. 두 시드로 셔플을 다시 실행해 모든 케이스를 내가 본 것과 비교합니다. 검증 페이지가 이 두 가지를 브라우저 안에서 수행하며, 어떤 데이터도 외부로 전송하지 않습니다.
정확한 알고리즘
- commitment = SHA-256(utf8(serverSeed)), 16진수 인코딩.
- block[i] = HMAC-SHA256(key = serverSeed, msg = clientSeed + “:” + i), i = 0, 1, 2 …
- 각 block에서 빅 엔디언 32비트 정수 8개를 얻습니다. r = 값 / 2^32. block을 다 쓰면 다음 block을 사용합니다.
- 고정된 래더에 대한 Fisher-Yates: i를 24부터 1까지 줄여 가며 j = floor(r × (i + 1))을 구하고 ladder[i]와 ladder[j]를 맞바꿉니다. k번 케이스에는 ladder[k]가 들어갑니다.
누구나 어떤 프로그래밍 언어로든 몇 줄이면 구현할 수 있고, 같은 배치가 나옵니다.
증명하는 것과 증명하지 않는 것
배치가 내가 고르기 전에 확정되었고 서버 혼자 정한 것이 아님을 증명합니다. 내가 본 모든 제안이 실제 보드에서 계산되었다는 것도 증명합니다. 확률을 바꾸지는 않습니다. 래더와 수수료는 정해진 그대로이며 이 역시 공개되어 있습니다. 여기서 공정하다는 것은 화면에 보이는 게임이 실제로 진행되는 게임과 같다는 뜻입니다.
지난 라운드 확인하기
시드와 커밋은 라운드 종료 화면과 내 기록에 표시됩니다. 언제든 검증 페이지에 붙여 넣어 확인할 수 있습니다.
자주 묻는 질문
dond.win의 Deal or No Deal은 조작되나요?
모든 라운드의 배치는 내가 케이스를 고르기 전에 SHA-256 해시로 커밋되고, 내 클라이언트 시드와 섞이며, 라운드가 끝나면 공개됩니다. 검증 페이지에서 25개 케이스를 전부 직접 다시 계산할 수 있습니다. 조작된 배치는 이 검증을 통과하지 못합니다.
클라이언트 시드는 무엇이고, 바꿔야 하나요?
셔플에 대한 내 몫의 입력입니다. 기본값은 무작위이며 그것만으로도 서버가 배치를 마음대로 정하지 못합니다. 직접 값을 설정하면 나만 고른 값으로 그 라운드를 재현할 수 있습니다.
서버가 하우스에 유리한 시드를 고를 수 있나요?
커밋하는 시점에는 최종 배치를 알 수 없습니다. 내 클라이언트 시드가 그 뒤에 섞이기 때문입니다. 나중에 시드를 바꿀 수도 없습니다. 해시가 더 이상 일치하지 않기 때문입니다.
라운드를 검증하려면 별도 프로그램이 필요한가요?
아니요. 검증 페이지가 브라우저에서 SHA-256과 HMAC-SHA256을 실행합니다. 이 두 함수가 있는 프로그래밍 언어라면 무엇으로든 직접 확인할 수 있습니다.