🎲
공정성 증명

공정성 증명 안내

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

SHA-256 해시 적용

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이 공정한 이유는 무엇인가요?