Crash 라운드 동안 온체인에서는 무슨 일이 일어나나요?
모든 Crash 라운드는 세 개의 온체인 트랜잭션으로 이루어지며, 순서는 다음과 같습니다.- 커밋: 베팅이 열리기 전에 백엔드가 무작위 32바이트 비밀값을 생성하고 그 SHA-256 해시를 온체인에 게시합니다(
start_new_round명령어). 이것이 커밋이며, 이 순간부터 오직 그 비밀값만 라운드를 정산할 수 있습니다. 커밋은 트랜잭션의CrashRoundPrepared이벤트에 공개됩니다. - 베팅: 플레이어들이 베팅합니다. 비밀값은 숨겨진 채로 남아 있으며, 커밋이 있으므로 바꿔치기할 수 없습니다.
- 라운드 시작 / 엔트로피 기록: 라운드가 시작되면(
start_game명령어) 프로그램은 Solana의SlotHashessysvar에서 가장 최근 슬롯 해시를 읽어 라운드에 저장합니다. 앱에서는 이 값을 라운드의 블록 해시라고 부릅니다. 이제 크래시 지점은 완전히 결정됩니다(저장된 슬롯 해시와 커밋된 비밀값만으로 정해지는 순수 함수이기 때문입니다). 다만 비밀값을 모르는 사람은 아직 계산할 수 없습니다. 이 값은CrashGameStarted이벤트에 공개됩니다. - 라운드 진행: 배수가 올라가고 플레이어들이 캐시아웃합니다.
- 공개: 백엔드가 비밀값을 제출합니다(
crash명령어). 프로그램은sha256(secret)이 커밋과 같은지 온체인에서 검증하고(일치하지 않으면 트랜잭션이 실패합니다), 크래시 지점을 직접 계산한 뒤 라운드를 확정합니다.CrashRoundFinalized이벤트에 비밀값, 슬롯 해시, 최종 크래시 지점이 게시됩니다.
크래시 지점의 정확한 공식은 무엇인가요?
크래시 지점은 정확히 다음과 같이 도출됩니다(온체인 프로그램이 실행하는 산술 그대로이며, 정수 연산이므로 예상치 못한 반올림이 없습니다).- 연결 순서는 blockhash가 먼저, 그다음 secret입니다.
X는 SHA-256 출력의 처음 4바이트를 빅 엔디언으로 읽은 값입니다.- 나눗셈은 모두 내림(정수) 나눗셈입니다.
max(10000, …)하한 덕분에 배수는 절대 1.00x 아래로 내려가지 않으며,X의 상한은 분모가 터무니없이 작아지는 것을 막습니다.
계산 예시
X = 0xABCD1234(2,882,343,476)이고 현재 하우스 엣지 1.5%(edge_bps = 150)일 때:
분포는 어떤 모양인가요?
이 공식은 균등 분포인X를 전형적인 크래시 곡선으로 변환합니다. 라운드가 최소 배수 m에 도달할 확률은 대략 다음과 같습니다.
보장되는 것과 보장되지 않는 것
프로그램이 강제하는 것:- 커밋이 온체인에 올라간 뒤에는 운영자가 라운드의 비밀값을 바꿀 수 없습니다. 해시가 일치하지 않는 비밀값으로는 공개 트랜잭션이 실패합니다.
- 라운드가 시작되면(슬롯 해시 저장) 크래시 지점은 확정됩니다. 일찍 캐시아웃하든, 늦게 하든, 많은 플레이어가 한꺼번에 하든 아무것도 바뀌지 않습니다. 결과는 배수가 올라가기 시작하기 전에 이미 정해졌습니다.
- 크래시 지점은 백엔드가 보고하는 것이 아니라 프로그램이 계산합니다. 잘못된 값은 온체인에 기록될 수 없습니다.
- 검증에 필요한 모든 것(커밋, 슬롯 해시, 비밀값, 최종 크래시 지점)이 온체인 이벤트에 영구적으로 게시됩니다.
- 시작 타이밍. 운영자는 라운드가 시작되기 전에 비밀값을 알고 있으며, 백엔드가 라운드 시작 트랜잭션을 언제 제출할지 정합니다. 최근 슬롯 해시는 공개되어 있으므로, 이론적으로는 후보 슬롯마다 나올 배수를 미리 계산하고 시작 시점을 조절해 어떤 슬롯 해시가 기록될지에 영향을 줄 수 있습니다. 이 방식은 이를 막지는 못하지만 관찰할 수 있게 만듭니다. 라운드 시작 타이밍은 공개되어 있고, 체계적인 편향이 있다면 누구나 대량으로 다시 계산할 수 있는 공개된 크래시 지점 통계에 드러납니다.
- 취소. 라운드가 시작된 뒤에는 운영자가 플레이어보다 먼저 결과를 알게 되며, 불리한 라운드를 공개하는 대신 취소할 수도 있습니다. 여기에는 두 가지 엄격한 제한이 있습니다. 취소하면 모든 베팅액이 전액 환불되며(프로그램에는 몰수 경로가 없습니다), 모든 취소는 공개 이벤트를 발생시킵니다. 취소 빈도가 곧 온체인 신호입니다. 취소는 비밀값을 잃어버린 경우(예: 커밋과 공개 사이에 백엔드가 멈춘 경우)를 위한 복구 경로로 존재하며, 사실상 사용되지 않을 것으로 예상됩니다.