Заровете
И петте игри тук висят на едни и същи два зара. Тази страница показва откъде идват числата им, защо никой не може да ги избира — ние най-малко от всички — и как сам да го провериш.
Защо съществува тази страница
31–45 % от всички оплаквания в отзивите за големите приложения за табла са за заровете — повече, отколкото за която и да е друга тема.
Подозрението не е мнение на малцина. То стои в отзивите на всеки език, който този сайт говори: заровете са нагласени, противникът получава точно зара, който му трябва, след покупка губиш следващата игра. Всеки, който играе онлайн, е мислил това изречение — и най-често не е имало кой да го вземе насериозно.
Обичайният отговор е сертификат: одитор потвърждава, че генераторът на случайни числа е наред. Това значи „вярвай на одитора“ — точно там, където не искаш да вярваш на никого. Затова тук няма печат, а сметка, която можеш сам да повториш, за всяка завършена игра.
Защо нито едно хвърляне не се избира впоследствие
Всяка игра определя хвърлянията си, преди те да паднат. В началото сървърът публикува контролна сума, а чак накрая числото, от което са изчислени всички хвърляния — ако двете не си съответстват, това се доказва.
-
Преди играта: запечатаният плик
Сървърът тегли начална стойност от 32 случайни байта и публикува само нейния отпечатък — контролна сума, от която началната стойност не може да се пресметне обратно. От този момент тя е закована; никой не може да я подмени, без отпечатъкът да престане да съвпада.
-
И двамата играчи добавят по нещо свое
Всеки от вас внася собствен идентификатор и той влиза във всяко хвърляне. Точно тази стъпка липсва в обещанията само с контролна сума — а без нея всичко останало би било театър: сървър, който избира и вашите стойности, може да пробва начални стойности, докато хвърлянията му харесат, и чак тогава да публикува отпечатъка.
-
Котва отвън
Към това идва и число от drand — публичен източник на случайност, произвеждан съвместно от няколко независими оператора. Посоченият рунд е такъв, какъвто в момента на запечатването още не е съществувал. Така се затваря последната пролука: дори сървърът и двамата играчи да бяха в сговор, не биха могли да изберат хвърлянията предварително.
-
Играта тече
Всяко хвърляне се пресмята от тези части, по поредния номер на хвърлянето. Нищо не се решава в мига, в който натиснеш чашката — било е определено още преди играта да започне.
-
След играта: пликът се отваря
Сървърът публикува началната стойност. Сега се проверява и едното, и другото: съвпада ли с отпечатъка отпреди и дава ли точно хвърлянията, които са паднали? Ако едното не излиза, това вече не е подозрение, а доказателство — и то такова, което всеки може да проведе, без да ни пита.
1 Отпечатък 2·3 Обвързано с 5 Начална стойност
Сметката, изложена открито
Ето я цялата. Няма втора, скрита част — тук стои всичко, от което едно хвърляне има нужда.
Всяко хвърляне е HMAC-SHA256(начална стойност, обвързване ‖ номер). Байтовете от 252 нагоре се изхвърлят, за да останат и шестте страни еднакво вероятни; останалото е остатъкът при деление на шест, плюс едно.
Началната стойност е ключът, обвързването е съобщението: номер на мача, номер на играта, идентификаторите на двамата играчи и котвата — всяко парче с дължината си отпред. Дължините не са украшение. Без тях идентификаторите „ab“ и „c“ биха дали същото съобщение като „a“ и „bc“, и един играч би могъл да свърже две различни двойки с един и същ поток от зарове.
Защо четири от 256 стойности се изхвърлят
256 не се дели на шест. Ако просто се вземе остатъкът, стените от 1 до 4 излизат в 43 от 256 случая, а 5 и 6 — само в 42; това е превес от около два и половина процента, лесно доказуем при сто хиляди хвърляния. Точно това би бил скандалът, който тази страница иска да предотврати. Затова четирите най-горни байтови стойности се изхвърлят и се тегли наново, и всичките шест стени остават еднакво вероятни.
използват се, поравно върху шест стени изхвърлят се, тегли се наново
Три начина сам да го провериш
Всичко, което е нужно за проверката, е публично — и нито един от трите пътя не минава през нас.
-
Преизчислено в твоя браузър
Всяка завършена игра има собствена страница под „Провери заровете“: отпечатък, обвързване, начална стойност и всички хвърляния. Твоето устройство пресмята там наново с крипто функцията на собствения ти браузър — присъдата идва от твоята машина, не от нашата.
-
nard.gg — проверка на заровете
Този файл преизчислява заровете на една партия от публикуваните стойности. Не съдържа нищо наше освен самата сметка — нищо не се зарежда, нищо не се свързва, нищо не се брои.
Изтегли програмата за проверка — един файл, без мрежа, без нас. Запази я и я пускай срещу всеки публикуван запис, когато поискаш.
-
На ръка или със собствен инструмент
Формулата по-горе е пълната спецификация, а HMAC-SHA256 го има във всеки език за програмиране. Който иска, си написва проверяващата програма в двайсет реда и не му трябва от нас нищо освен публикуваните числа. Точно затова стоят там.
Какво не обещаваме
От запечатването нататък сървърът знае хвърлянията на текущата игра предварително. Това би отпаднало само ако двете страни се обвързваха преди всяко отделно хвърляне и разкриваха след това — което струва по едно отиване и връщане на ход и кани просто да откажеш разкриването. Не го правим. И го пишем тук, вместо да го премълчим.
Затова пък важи: за всяка игра се тегли собствена начална стойност, независима от всички останали — от едната не следва нищо за следващата. И доказателството стои открито за всяка завършена игра, не при поискване, а от само себе си.
Тридесет и шестте хвърляния
А защо въпреки това усещаш, че заровете са срещу теб? Защото случайността в малки количества изглежда неравна. Два зара падат по трийсет и шест начина и който има нужда от точно определен, често го чака дълго. Двете таблици тук показват това — първата колко хвърляния изобщо достигат дадено разстояние, втората колко неравно изглежда истинската случайност в малки числа.
Два зара падат по тридесет и шест еднакво вероятни начина. Избери разстояние и таблицата показва кои от тях водят пулка толкова далече — по свободен път, без затворени полета между тях.
Нищо не е избрано — таблицата показва и тридесет и шестте хвърляния.
21 различни хвърляния, 6 от тях дупли. Броенето пак е в тридесет и шести: всяка дупла пада веднъж, всяко друго хвърляне — два пъти.
Хвърли сам
Тази таблица хвърля в твоя браузър, с неговата собствена случайност. След тридесет и шест хвърляния половината квадратчета са още празни — това не е повреда, така изглежда случайността.
Общо хвърляния 0
Дупла
Когато и двата зара показват едно и също число, то се играе четири пъти вместо два. Дупла пада в шест от тридесет и шест хвърляния — тоест на всеки шести ход.
Затова дуплата стига по-далече от всяко друго хвърляне: 6–6 пренася двадесет и четири полета.
Първото хвърляне
В началото всеки хвърля по един зар; започва по-високият и играе точно тези две числа. При равенство се хвърля отново. Затова първият ход на една игра никога не е дупла — остават 30 от тридесет и шестте хвърляния.