Sözümüze güvenmek zorunda olmadığın zarlar
Oyun başlamadan gizli bir sayıyı kilitler ve parmak izini yayımlarız. Oyun bitince sayının kendisini yayımlarız. Bu iki an arasında her zar zaten belirlenmiştir — sonrasında herkes hepsini yeniden hesaplayıp hiçbir şeyin oynamadığını görebilir.
Defteri açİyi bir rastgele sayı üretecinin düzeltemediği kısım
Zarlarımız işletim sisteminin kriptografik üretecinden gelir — banka girişini koruyan kaynağın aynısı, çoğu oyunun kullandığı kestirme yol değil. Bu, sayıların ne kadar rastgele olduğunu çözer. Oyuncuların asıl sorduğu soruya dair hiçbir şey çözmez.
Dürüstçe atılmış bir zarla kasten seçilmiş bir zar sonradan bakınca aynı görünür. İkisi de bir kayıttaki sayıdan ibarettir.
Yani işe yarar soru "üreteciniz iyi mi?" değil, "kontrol edebilir miyim?" Aşağıdaki her şey, tek kelimemize inanmanı istemeden bu cevabı evet yapmak için var.
Öncesinde mühür, sonrasında açılış
Dört adım. İkisini kendin yapabilirsin ve bizi yakalayacak olanlar tam da o ikisi.
- 1
Mühürle
İlk atıştan önce sunucu 32 baytlık gizli bir sayı çeker — sunucu tohumu — ve SHA-256 parmak izini iki oyuncuya da yayımlar. Parmak izi hiçbir şey vermez ama tohum artık sabittir: başka her tohum başka bir parmak izi üretir.
commit0df0916cb0…2904e706 - 2
Karıştır
Uygulaman da kendi rastgele tohumunu üretip masaya oturduğunda gönderir. Her zara iki oyuncunun tohumu birden girer; yani atışları işimize gelen bir tohumu önceden arayamayız — mühürlediğimiz anda senin ne ekleyeceğini bilmiyoruz.
clientSeeda26460084a0ef89b:d4f28bac6efd1b6e - 3
Türet
Her zar, tohumların ve atış numarasının HMAC-SHA256’sından okunur. Hiçbir şey saklanmaz, hiçbir şey seçilmez: aynı üç girdi hep aynı zarı verir, başka hiçbir girdi onu vermez.
die(n) = (HMAC-SHA256(serverSeed, "clientSeed:n:round")[0] < 252) % 6 + 1 - 4
Aç
Oyun bitince sunucu tohumunu yayımlarız. Özetini al, ilk atıştan önce sana verilen parmak iziyle karşılaştır, sonra her zarı yeniden hesapla. Tek bir atışı bile seçmiş bir sunucu bu iki kontrolden birinde düşer.
serverSeed5cde3365be…7b6b2bd5
Yukarıdaki değerler, herkesin bakabileceği bitmiş bir oyunun — #148 numaralı oyunun — gerçek kanıtıdır. O numarayı aşağıdaki kutuya yaz ve doğru çıkışını izle.
Bir oyunu kontrol et — burada, şimdi
Bir oyun numarası yaz. Sayfa kanıtını çeker, sonra tohumu yeniden özetler ve her zarı senin tarayıcının kriptografisiyle hesaplar.
Ya da üç değeri kendin yapıştır
Açıklanan tohum parmak iziyle uyuşuyor
Zarlar yeniden üretildi
Bu numarayla kanıt yok. Oyunlar bitiş sırasına göre numaralanır ve yalnızca biten oyunun yayımlanmış tohumu olur.
Kanıt getirilemedi. Bu bir bağlantı sorunu, başarısız bir kontrol değil — hiçbir şey çürütülmedi.
Bu bir oyun numarası değil ya da yapıştırılan değerler iki adet 64 karakterlik özet ve bir istemci tohumu değil.
Hesaplanıyor…
Neden hiçbir yüz azıcık bile daha olası değil
Bir bayt 0 ile 255 arası bir sayıdır — 256 olasılık. 256 altının katı değildir; 6 × 42 ve 4 artar. Baytın altıya bölümünden kalanı alırsan dört yüz sessizce 256’da 43 şans alır, diğer ikisi 42. Küçücük bir yanlılık, ama bir milyon atışta gerçek bir avantaj. Bu yüzden o dört değer atılır.
252 = 6 × 42. Her yüze tam olarak aynı sayıda bayt düşer, yani her yüz tam olarak altıda birdir.
Kanıt nerede biter
Bu sitedeki iki tür zar zincirin kapsamı dışındadır. Atlanmak yerine burada yazılıdır, çünkü sessiz bir deliği olan adillik iddiası, hiç iddia etmemekten daha değersizdir.
- TelegramBot sohbetinde atılan zarlarTelegram’ın kendi zar animasyonuyla atarsan o sayı Telegram’dan gelir, bizden değil; hiçbir tohumumuz onu yeniden üretmez. Yayımlanan kanıt hangi konumların böyle olduğunu tam olarak listeler, defter de oraya zar yüzü yerine Telegram simgesini koyar. Tümüyle denetlenebilir bir oyun için uygulamada at.
- AlıştırmaBilgisayara karşı oyunlarÇevrimdışı alıştırma oyunu kendi cihazında zar atar; tohum da yok kanıt da. Rakip yok, bahis yok; kanıtlanacak bir şey de riskte olan bir şey de yok.
Geri kalan her şey — çevrimiçi 1v1, arkadaş odaları ve turnuvalar, ücretsiz ya da bahisli — yukarıdaki zincirde çalışır.
Aynı kontrol, bu sayfa olmadan
On iki satır ve hiçbir kütüphane. Bir oyunun üç değeriyle birlikte herhangi bir tarayıcı konsoluna yapıştır; bu sayfanın söylediğinin aynısını söyler — yöntemi, yalnız sonucu değil, yayımlamanın anlamı da bu.
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;
}
}Her kanıt /fair/<id> adresinde herkese açık — anahtar yok, hesap yok, oyuncu adı yok, tutar yok. Sadece zarlar.
İnsanların gerçekten sorduğu sorular
Üst üste dört oyun kaybettim. Zarlar bana mı karşı?+
Olamaz. Biten bir oyunun her zarı, o oyun başlamadan önce, önceden mühürlenmiş bir tohumla belirlenmişti; hepsini yukarıda yeniden hesaplayabilirsin. Seriler kasıtlı hissettirir ama değildir: iki zarla, rakibinin dört oyun üst üste senden iyi atması insanların sandığından çok daha sık olur.
Sunucu kritik anda bir atışı seçebilir mi?+
İki kontrolden birini kırması gerekirdi. Ya oyundan önce sana verdiği parmak izine özetlenmeyen bir tohum yayımlar — bunu herkes görür — ya da gerçeğini yayımlar; o zaman da o tohumun ürettiği zarlar oynadığın zarlardır ve seçilecek bir şey yoktur.
Ya uygulamam kendi tohumunu hiç göndermediyse?+
Yerine rastgele bir tohum üretilir, zincir hep düzgün kalır. Bu yalnızca senin katkını zayıflatır; mühür ve yukarıdaki bütün kontroller yerinde durur.
Açıklanmış bir tohum bir sonraki oyunumu etkiler mi?+
Hayır. Rövanş dahil her oyun için yeni bir tohum çekilir ve yeni bir parmak izi yayımlanır. Yayımlanmış bir tohum başka bir atışı asla belirlemez.
Bazı zarlarda neden Telegram simgesi var?+
Onlar bot sohbetinde Telegram’ın zar animasyonuyla atıldı; yani Telegram’dan geldiler ve hiçbir tohumumuz onları yeniden üretmez. Gizlenmek yerine işaretlenirler ve zincirimizin o konumda üreteceği sayı bilerek gösterilmez — o, kimsenin atmadığı bir zardır.