공정성 증명 안내
FairPicker의 모든 추첨은 SHA-256 암호화 해시와 Fisher-Yates 알고리즘을 기반으로 수행됩니다. 추첨 과정을 누구나 독립적으로 검증할 수 있도록 모든 입력값을 공개합니다.
사전 조작 불가
추첨 직전 나노초 단위 서버 타임스탬프가 시드에 포함되어 결과를 미리 예측하거나 조작할 수 없습니다.
완전 투명성
모든 입력값(Project ID, Timestamp, Client Seed)과 최종 해시값이 증명서에 공개됩니다.
독립 검증 가능
공개된 값으로 누구나 동일한 SHA-256 해시를 직접 계산하여 추첨 결과를 수학적으로 검증할 수 있습니다.
시드 구성 방식
최종 SHA-256 해시는 아래 세 가지 값을 조합하여 생성됩니다.
Project ID
추첨 고유 식별자
proj_demo_20260226
Server Timestamp
추첨 버튼 클릭 시각 (나노초)
1740534312193847623
Client Seed
주최자가 직접 입력
Event-2026ABCD7F3E
Final Hash (예시)
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
추첨 알고리즘 (Pseudocode)
최종 해시를 시드로 삼아 Fisher-Yates Shuffle을 수행합니다. 각 스텝마다 해시를 재계산하여 예측 불가능성을 극대화합니다.
// 1. 시드 생성
seed_string = project_id + "-" + server_timestamp_ns + "-" + client_seed
final_hash = SHA256(seed_string)
// 2. 시드 숫자화 (BigInt)
seed_number = BigInt("0x" + final_hash)
// 3. Fisher-Yates Shuffle
participants = [p1, p2, p3, ..., pN] // 중복 제거 후 정렬
for i from N-1 down to 1:
j = seed_number % (i + 1)
swap(participants[i], participants[j])
seed_number = SHA256(seed_number) // 매 스텝마다 해시 갱신
// 4. 당첨자 선정
winners = participants[0 .. winnerCount-1]* 실제 구현은 위 로직을 따르며, 추후 오픈소스 공개를 검토 중입니다.
클라이언트 시드란?
클라이언트 시드는 주최자가 추첨 전에 직접 입력하는 임의의 문자열입니다. 이 값이 시드에 포함됨으로써서버 단독으로 결과를 조작하는 것이 원천 차단됩니다.
FairPicker는 클라이언트 시드를 자동 생성(랜덤 16자)해 드리지만, 주최자가 원하는 의미 있는 문자열을 직접 입력할 수도 있습니다.
자주 묻는 질문
추첨 결과를 사후에 변경하거나 재추첨할 수 있나요?
해시값 검증을 직접 해보고 싶어요.
서버 타임스탬프를 FairPicker가 마음대로 조작할 수 있지 않나요?
Fisher-Yates Shuffle이 공정한 이유는 무엇인가요?