검증
모든 경품 이벤트 추첨을 어떻게 확인할 수 있는가
추첨은 주최자와 우리를 포함해 그 누구도 당첨자를 고르거나 예측할 수 없을 때에만 공정합니다. GetSocialExport가 당첨자를 어떻게 추첨하는지, 그리고 누구나 증명서로부터 추첨을 어떻게 확인할 수 있는지를 여기서 정확히 설명합니다.
추첨의 네 단계
- 참가자 명단이 잠깁니다. 주최자의 확장 프로그램이 댓글을 수집하고, 경품 이벤트 규칙을 적용한 뒤, 자격을 갖춘 참가자 명단을 당사 서버로 전송합니다. 명단은 고정된 순서로 정렬되고 그 SHA-256 지문이 시간과 함께 기록됩니다. 그 이후로는 이름 하나만 바꿔도 지문이 달라집니다.
- 미래의 난수가 선택됩니다. 그 순간 서버는 약 30초 뒤에야 공개될 drand 라운드를 선택합니다. drand는 League of Entropy(Cloudflare, Protocol Labs, 대학 등)가 운영하는 공개 난수 비컨입니다. 그 숫자는 예측하거나 조작할 수 없으며, 각각에는 누구나 확인할 수 있는 서명이 담겨 있습니다.
- 당첨자가 계산됩니다. 라운드가 공개되면 경품 이벤트 코드, 추첨 번호, 명단 지문, 난수로부터 시드가 만들어집니다. 당첨자는 그 시드에서 SHA-256으로 편향 없이 선택되며, 규칙에 정해진 보너스 응모권을 가진 참가자에게만 추가 가중치가 부여됩니다.
- 모든 것이 공개됩니다. 증명서에는 당첨자, 지문, 라운드, 시드, 명단이 잠긴 시각, 사유가 적힌 모든 재추첨, 그리고 (주최자가 비공개로 설정하지 않은 한) 참가자 명단 전체가 표시됩니다.
증명서에서 확인할 수 있는 것
아무 증명서나 열어(QR 코드를 스캔해) 보면, 브라우저가 우리를 신뢰할 필요 없이 스스로 확인합니다.
- 공개된 참가자 명단이 추첨 전에 기록된 지문과 일치합니다.
- 난수가 drand에서 온 것이며, League of Entropy의 유효한 BLS 서명이 있습니다.
- 명단이 그 난수가 존재하기 전에 잠겼습니다.
- 추첨을 다시 계산하면 정확히 같은 당첨자가 나옵니다.
또한 주최자가 명단을 비공개로 두더라도, 참여하셨나요?에 이름을 입력하면 자신이 추첨에 포함되어 있었는지 확인할 수 있습니다.
증명서가 증명하지 못하는 것
추첨 자체는 증명 가능한 방식으로 공정합니다. 증명서는 주최자가 합리적인 규칙을 적용했는지, 상품을 전달했는지까지는 증명할 수 없습니다. 참가자 명단은 주최자 본인의 확장 프로그램에서 오는 것이며, 그렇기에 참가자가 확인할 수 있도록 공개되고, 그렇기에 모든 재추첨이 그 사유와 함께 표시됩니다.
기술적 세부 사항
- 알고리즘:
socialexport-draw-v1. 표준 명단: 참가자마다 한 줄,id⇥이름⇥응모권, id 순으로 정렬해 줄바꿈으로 연결; 지문 = 그 텍스트의 SHA-256. - 난수: drand 네트워크
quicknet, 체인52db9ba70e0cc0f6…, 3초마다 한 라운드, G1 위의 BLS 서명(RFC 9380). - 시드: 알고리즘 이름, 경품 이벤트 코드, 추첨 번호, 명단 지문, 라운드, 난숫값을 줄바꿈으로 연결한 것의 SHA-256.
- 선택: SHA-256(시드 ‖ 카운터)로 64비트 숫자를 생성; 범위의 가장 큰 배수를 넘는 값은 버림(모듈로 편향 없음); 선택할 때마다 당첨자와 그 응모권을 제거합니다.
- 증명서는 각 명단이 언제 기록되었는지 증명하기 위해 당사 서버(ECDSA P-256)가 서명합니다. 공개 키:
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQdshCP/QsGG2k29W80CHSmWbwYpBNgrrIjTf0qPyQuB8cXXLxsCRaty97SO44XaM3aYr6PMwI4dYc/MnSQ3/aw==
