Swipenor: skoru istemci hesaplarsa sunucu neye güvenir?
Kaydırmalı doğru/yanlış bilgi yarışması; asıl mesele oyun değil, istemcinin ürettiği skoru imzayla doğrulanabilir kılmak.
Şu an ne yapıyor
Kaydırmalı doğru/yanlış bilgi yarışması bir mobil uygulama olarak çekirdek döngüsüyle uçtan uca çalışıyor; skoru istemci üretse de server_nonce ve HMAC imzasıyla sunucu tarafında doğrulanıyor. swipenor.com uygulamanın tanıtım sayfasıdır, oyunun kendisi değil.
- Başlangıç
- Temmuz 2026 — Devam ediyor
Tür
Teknolojiler
Mekanik basit: kart gelir, sağa kaydırırsan “Doğru”, sola kaydırırsan “Yanlış”. Yaş grubuna göre içerik (4–9, 10–17, 18+), doğru cevapta puan, seri tutturunca bonus, global ve yaş bazlı sıralama. Basit olmayan kısım, skorun kime ait olduğu.
Skoru istemci hesaplıyorsa sunucu neye bakar
Oyun döngüsü 60 fps’te istemcide dönüyor (reanimated worklet’leri + gesture-handler); skoru da doğal olarak istemci hesaplıyor. Sunucunun bu sayıya körlemesine inanması ise sıralama tablosunu ilk gün çöpe çevirir.
Denenen model signed-client: oturum başında sunucu bir server_nonce
üretiyor, istemci skoru bu nonce ile HMAC’leyip imzalıyor, API hem makuliyet
kontrolü yapıyor hem imzayı doğruluyor. Puan sabitleri de istemciye gömülü
değil — doğru cevap 100 puan, seri eşiği 3, seri bonusu +25 — hepsi GET /config ile sunucudan geliyor ki istemci ile sunucu birbirinden sapmasın.
Puan sabitlerinin sunucudan gelmesi de imzanın devamı. İstemcide sabit tutulsalardı imza yine doğrulanırdı ama doğrulanan sayı yanlış olabilirdi: eski sürümde kalmış bir istemci, seri bonusunu kendi bildiği değerle hesaplayıp geçerli bir imzayla gönderirdi. Sabitler tek yerde durunca doğrulama da anlamlı oluyor.
Dört depo, tek şema sahibi
Dört ayrı depo tek klasörde: game (Expo SDK 57, React Native, TypeScript),
api (Laravel 13, PostgreSQL 16, Redis), admin (Filament, API ile
paylaşılan veritabanı üzerinde çalışır) ve Astro ile yazılmış tanıtım sayfası. Çekirdek döngü uçtan uca
çalışıyor: kaydırma, puanlama, seri bonusu, global/yaş sıralaması.
Şema sahipliği tek noktada tutuluyor. Admin paneli Filament ile yazıldı ve API ile aynı veritabanına bakıyor, ama migration çalıştırmıyor: şemayı yalnız API değiştiriyor. İki uygulamanın da migrate edebildiği bir kurulumda hangi sürümün hangi tabloyu tanımladığı ilk çakışmada belirsizleşir ve o belirsizlik üretimde geri alınamaz. Panelin şemaya yazma yetkisi bu yüzden hiç açılmadı.
İmza modelinin sınavı yayında
Açık uçlar oyunun kendisinde değil, etrafında: reklam entegrasyonu ve tek seferlik “reklamları kaldır” satın alması, mağaza materyalleri ve yayın süreci. İmza modelinin gerçek kullanıcıya karşı ne kadar dayandığını da ancak yayında göreceğim.