تاسی که لازم نیست حرف ما را دربارهٔ آن باور کنی
پیش از شروع بازی یک عدد سرّی را قفل میکنیم و اثر انگشتش را منتشر میکنیم. وقتی بازی تمام شد، خودِ عدد را منتشر میکنیم. بین این دو لحظه هر تاس از قبل تعیین شده است — و بعد از آن هرکسی میتواند همه را دوباره حساب کند و ببیند چیزی جابهجا نشده.
دفتر تاسآن قسمتی که یک تولیدکنندهٔ تصادفی خوب هم حلش نمیکند
تاسهای ما از تولیدکنندهٔ رمزنگاری سیستمعامل میآیند — همان منبعی که ورود به حساب بانکی را محافظت میکند، نه میانبری که بیشتر بازیها استفاده میکنند. این تکلیف «چقدر تصادفی است» را روشن میکند. اما دربارهٔ سؤالی که بازیکنها واقعاً میپرسند هیچ نمیگوید.
تاسی که صادقانه انداخته شده و تاسی که عمداً انتخاب شده، بعدش عین هم به نظر میرسند. هر دو فقط یک عددند در یک گزارش.
پس سؤال بهدردبخور این نیست که «تولیدکنندهٔ شما خوب است؟» بلکه این است که «من میتوانم بررسی کنم؟» هر چه پایینتر میآید برای این است که جواب بله باشد، بدون اینکه لازم باشد حرف ما را باور کنی.
قبلش مهر، بعدش باز
چهار قدم. دو تای آنها را خودت میتوانی انجام بدهی، و همان دو تا هستند که دست ما را رو میکنند.
- 1
مهر
پیش از اولین تاس، سرور یک عدد سرّی ۳۲ بایتی میسازد — بذر سرور — و اثر انگشت SHA-256 آن را به هر دو بازیکن میدهد. اثر انگشت چیزی لو نمیدهد، ولی از این لحظه بذر قفل است: هر بذر دیگری اثر انگشت دیگری میسازد.
commit0df0916cb0…2904e706 - 2
آمیختن
اپ تو هم بذر تصادفی خودش را میسازد و موقع نشستن سر میز میفرستد. بذر هر دو بازیکن در تکتک تاسها اثر دارد. پس نمیتوانیم از قبل دنبال بذری بگردیم که تاسهایش به نفع ما باشد — لحظهای که مهر میزنیم، نمیدانیم تو چه چیزی قرار است اضافه کنی.
clientSeeda26460084a0ef89b:d4f28bac6efd1b6e - 3
استخراج
هر تاس از دل HMAC-SHA256 بذرها و شمارهٔ آن تاس بیرون کشیده میشود. چیزی ذخیره نمیشود و چیزی انتخاب نمیشود: همان سه ورودی همیشه همان تاس را میدهد، و هیچ ورودی دیگری آن را نمیدهد.
die(n) = (HMAC-SHA256(serverSeed, "clientSeed:n:round")[0] < 252) % 6 + 1 - 4
باز کردن
وقتی بازی تمام شد، بذر سرور را منتشر میکنیم. هشاش کن و با اثر انگشتی که پیش از اولین تاس گرفتی مقایسه کن، بعد همهٔ تاسها را دوباره حساب کن. سروری که حتی یک تاس را انتخاب کرده باشد، یکی از این دو بررسی را رد میشود.
serverSeed5cde3365be…7b6b2bd5
مقدارهای بالا اثبات واقعی بازی #148 است، بازیای تمامشده که هر کسی میتواند نگاهش کند. همان شماره را در جعبهٔ پایین بگذار و ببین درست درمیآید.
یک بازی را بررسی کن — همینجا، همین حالا
شمارهٔ یک بازی را بنویس. صفحه اثباتش را میگیرد، بعد بذر را دوباره هش میکند و همهٔ تاسها را با رمزنگاری خودِ مرورگر تو حساب میکند.
یا سه مقدار را خودت بچسبان
بذر منتشرشده با اثر انگشت میخواند
تاسهای بازتولیدشده
اثباتی با این شماره نیست. بازیها به ترتیب پایانشان شماره میگیرند و فقط بازی تمامشده بذر منتشرشده دارد.
اثبات گرفته نشد. این یک مشکل اتصال است، نه بررسی ردشده — چیزی نقض نشده.
این شمارهٔ بازی نیست، یا مقدارهای چسباندهشده دو هش ۶۴ کاراکتری و یک بذر کاربر نیستند.
در حال محاسبه…
چرا هیچ وجهی حتی ذرهای محتملتر نیست
یک بایت عددی است از ۰ تا ۲۵۵ — ۲۵۶ حالت. ۲۵۶ مضرب شش نیست؛ ۶ × ۴۲ است با ۴ باقیمانده. اگر باقیماندهٔ تقسیم بایت بر شش را برداری، چهار وجه بیسروصدا ۴۳ شانس از ۲۵۶ میگیرند و آن دو تای دیگر ۴۲. سوگیری ریزی است، و در یک میلیون تاس تبدیل به برتری واقعی میشود. پس آن چهار مقدار دور ریخته میشوند.
۲۵۲ = ۶ × ۴۲. هر وجه دقیقاً به همان تعداد بایت میرسد، پس هر وجه دقیقاً یکششم است.
اثبات تا کجا میرود
دو نوع تاس در این سایت زیر پوشش این زنجیره نیستند. اینجا نوشته شدهاند بهجای اینکه حذف شوند، چون ادعای انصافی که یک سوراخ بیصدا داشته باشد از هیچ ادعایی کمارزشتر است.
- تلگرامتاسی که در چت ربات انداخته میشوداگر با انیمیشن تاس خود تلگرام بیندازی، آن عدد از تلگرام میآید نه از ما؛ هیچ بذری از ما آن را بازتولید نمیکند. اثبات منتشرشده دقیقاً میگوید کدام موقعیتها اینطور بودهاند و دفتر تاس بهجای وجه تاس، نماد تلگرام را آنجا نشان میدهد. برای بازی کاملاً قابل بررسی، در اپ تاس بینداز.
- تمرینبازی با کامپیوتربازی تمرینی آفلاین روی دستگاه خودت تاس میاندازد، بدون بذر و بدون اثبات. حریفی در کار نیست و شرطی هم نیست، پس چیزی برای اثبات و چیزی برای از دست دادن وجود ندارد.
هر چیز دیگری — ۱v۱ آنلاین، اتاق دوستانه و تورنومنت، رایگان یا شرطی — روی همین زنجیره اجرا میشود.
همین بررسی، بدون این صفحه
دوازده خط و بدون هیچ کتابخانهای. در کنسول هر مرورگری بچسبانش همراه با سه مقدار یک بازی، دقیقاً همان چیزی را میگوید که این صفحه میگوید — و انتشار روش، نه فقط نتیجه، اصلاً برای همین است.
const enc = new TextEncoder();
const hex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');
// 1. the seed we revealed must hash to the commitment you were given first
const commitOk = hex(await crypto.subtle.digest('SHA-256', enc.encode(serverSeed))) === commit;
// 2. every die, re-derived from that seed
const key = await crypto.subtle.importKey(
'raw', enc.encode(serverSeed), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
async function die(n) {
for (let round = 0; round < 16; round++) {
const mac = new Uint8Array(
await crypto.subtle.sign('HMAC', key, enc.encode(`${clientSeed}:${n}:${round}`)));
for (const b of mac) if (b < 252) return (b % 6) + 1;
}
}هر اثبات بهصورت عمومی روی /fair/<id> هست — بدون کلید، بدون حساب، بدون نام بازیکن و بدون مبلغ. فقط تاسها.
سؤالهایی که واقعاً پرسیده میشود
چهار بازی پشتسرهم باختم. تاسها با من لج کردهاند؟+
نمیتوانند لج کرده باشند. هر تاس یک بازی تمامشده، پیش از شروع همان بازی و با بذری که از قبل مهر شده تعیین شده بود، و میتوانی همه را در بالا دوباره حساب کنی. باخت پشتسرهم حس هدفمند بودن میدهد ولی نیست: با دو تاس، اینکه حریف چهار بازی پیاپی بهتر بیاورد خیلی بیشتر از آنچه آدم فکر میکند اتفاق میافتد.
ممکن است سرور در لحظهٔ حساس یک تاس را انتخاب کند؟+
باید یکی از دو بررسی را میشکست. یا بذری منتشر میکند که به اثر انگشتِ پیش از بازی نمیخورد — که هر کسی میبیند — یا بذر واقعی را منتشر میکند، که در آن صورت تاسهایی که آن بذر میسازد همان تاسهایی است که بازی کردی و چیزی برای انتخاب کردن نبوده.
اگر اپ من اصلاً بذری نفرستاده باشد چه؟+
یک بذر تصادفی جایش ساخته میشود تا زنجیره همیشه سالم باشد. این فقط سهم خودت را ضعیف میکند؛ مهر و همهٔ بررسیهای بالا سر جایشان هستند.
بذری که منتشر شده روی بازی بعدی من اثر دارد؟+
نه. برای هر بازی — حتی بازی مجدد با همان حریف — بذر تازهای کشیده و اثر انگشت تازهای منتشر میشود. بذری که یک بار منتشر شده هرگز تاس دیگری را تعیین نمیکند.
چرا بعضی تاسها نماد تلگرام دارند؟+
آنها با انیمیشن تاس تلگرام در چت ربات انداخته شدهاند، پس از تلگرام آمدهاند و هیچ بذری از ما بازتولیدشان نمیکند. علامتگذاری شدهاند نه پنهان، و عددی که زنجیرهٔ ما در آن موقعیت میساخت عمداً نشان داده نمیشود — آن تاسی نیست که کسی انداخته باشد.