Show GN: 만든 사람도 결과를 미리 모르는 사다리타기 (drand 예약 추첨)

4 days ago 16

카톡방에서 사다리타기 링크를 돌리면 늘 「조작 아니냐」는 말이 나옵니다. 실제로 흔히 쓰는 사다리 공유 사이트를 열어 보니, 링크에 사다리 모양이 통째로 들어 있어서 만든 사람이 원하는 결과가 나올 때까지 다시 섞은 뒤 그 링크만 보낼 수 있었습니다. 받는 사람은 알 방법이 없고요.

그래서 결과를 「미래의 공개 난수」에 묶었습니다.

[어떻게 동작하나]

  • 링크를 만들 때 추첨 시각(기본 1분 뒤)을 정하고, 그 시각에 해당하는 drand quicknet 라운드 번호 R 을 링크에 넣습니다.
  • 결과 = sha256(정렬한 이름 ‖ 결과 칸 ‖ 라운드 R 의 BLS 서명)을 시드로 한 피셔-예이츠 셔플입니다.
  • R 은 아직 생성되지 않은 라운드라서 링크를 만든 사람도, 사이트 운영자도 결과를 미리 알 수 없습니다.
  • 시각이 되면 모든 사람의 브라우저가 drand 에서 같은 서명을 받아 같은 사다리를 그립니다. 서명은 브라우저에서 quicknet 공개키로 직접 검증하고(@noble/curves), 다른 미러와도 대조합니다. 서버를 거치지 않아서 운영자가 값을 바꿔 끼울 수 없습니다.
  • 「검증」을 펼치면 라운드 번호·서명·해시 입력 원문·시드를 보여 주고 다시 계산해 볼 수 있습니다.

[보장하지 못하는 것 — 화면에도 그대로 적었습니다]

  • 만든 사람이 서로 다른 라운드로 링크를 여러 개 만들어 두고, 결과가 나온 뒤 유리한 것만 보내는 「사후 선택」은 막을 수 없습니다. 이때 증거는 링크를 받은 시각(카톡 메시지 시각)입니다. 그래서 추첨 시각이 지난 뒤 처음 연 링크에는 「사후 열람」 경고를 띄웁니다.
  • drand 노드 과반이 공모하는 경우는 이론상 한계로 적어 뒀습니다.

[그 밖에]

  • 이름은 URL 의 # 뒤에만 들어가서 서버·로그·애널리틱스로 가지 않습니다.
  • 같은 엔진으로 돌림판(항목 100개), 당첨자 추첨(명단 1,000줄, 예비 당첨자), 커피 내기 경주(결과를 먼저 정하고 경주는 그 결과에 맞춰 연출 — 물리 시뮬레이션은 기기마다 결과가 달라져서 안 썼습니다)도 만들었습니다.
  • Next.js, 로그인 없음, 무료입니다.

drand 를 웹 추첨에 쓰는 방식이나 「사후 선택」을 더 줄일 아이디어가 있으면 의견 부탁드립니다.

Read Entire Article




피플앤툴즈 네트워크
🛍 샵