Shaffoflik va isbotlanadigan adolatni ta’minlash maqsadida har bir ko‘p o‘yinchili o‘yin uchun 10 million SHA256 xeshidan iborat zanjir yaratdik: zanjir server siridan boshlanib, SHA256 natijasini 10 million marta qayta-qayta SHA256 ga uzatish orqali hosil qilingan.
Platform uchun yakuniy xeshning SHA256 qiymati: eeb4d340bfaed702601b9a08faba2f8088c4810c3e3a883293accaf25053b883
Crash uchun yakuniy xeshning SHA256 qiymati: c46f0705f6ba4df891ce44accda8f89f5a6fa8b987eb7c7b445280cf6cabfbc6
Battle uchun yakuniy xeshning SHA256 qiymati: 63cb1eb64ec4eb4de02f6bad85e42365d08f37497a1b7e907bd0b9183f27e1b3
Uni shu yerda e’lon qilish orqali muqobil SHA256 zanjirini tanlash imkoniyatini butunlay yo‘q qilamiz. Endi o‘yin serveri ushbu xeshlar zanjirini teskari tartibda bosib o‘tadi va bu qiymatlardan o‘yin natijalarini isbotlanadigan adolatli tarzda hisoblash uchun foydalanadi.
1. Maxfiy boshlang‘ich xesh: Har bir ko‘p o‘yinchili o‘yin turining o‘z maxfiy boshlang‘ich xeshi bor (uni faqat server biladi) va u noyob xeshlar zanjirining ildizini tashkil qiladi.
2. Xeshlar zanjirini yaratish: Boshlang‘ich maxfiy xeshga SHA256 ni takroran qo‘llash orqali 10 000 000 ta xeshdan iborat zanjir hosil qilamiz.
func HashSeed(seed string) string {
hash := sha256.Sum256([]byte(seed))
return hex.EncodeToString(hash[:])
}
func CalculateHashChain(firstHash string) []string {
hashes := make([]string, 10_000_000)
for i := int64(0); i <= 10_000_000; i++ {
firstHash = HashSeed(firstHash)
hashes[i] = firstHash
}
return hashes
}
3. Teskari tartibda ishlatish: Zanjirdagi yakuniy xeshni hammaga ochiq e’lon qilamiz. Har bir o‘yin raundi xeshlarni teskari tartibda ishlatadi: 1-raundda hash[10_000_000] ishlatiladi 2-raundda hash[9_999_999] ishlatiladi va hokazo…
4. Bunday tuzilma kelajakdagi xeshlarni soxtalashtirishni imkonsiz qiladi va shu bilan birga istalgan kishiga barcha oldingi xeshlarni tekshirish imkonini beradi.
Oldindan bilib bo‘lmaslik: Kelajakdagi o‘yin natijalarini hatto server ham bila olmaydi yoki ularga ta’sir qila olmaydi.
Tekshirish mumkinligi: O‘yinchilar faqat ochiq e’lon qilingan yakuniy xesh yordamida istalgan oldingi raundning yaxlitligini tekshira oladi.
O‘yinlarni ajratish: Har bir o‘yin turining o‘z zanjiri bor, bu esa o‘yinlararo manipulyatsiyalarning oldini oladi.
Yakka o‘yinchi o‘yinlarida isbotlanadigan adolatni ta’minlash uchun platformamiz natija boshlang‘ich qiymatini (seed) yaratishda uchta asosiy tarkibiy qismga asoslangan tizimdan foydalanadi:
1. Mijozning boshlang‘ich qiymati (Client Seed): Bu foydalanuvchi boshqaradigan boshlang‘ich qiymat. U foydalanuvchi ro‘yxatdan o‘tganda avtomatik yaratiladi, lekin foydalanuvchi uni istalgan vaqtda o‘zgartirishi mumkin. Mijozning boshlang‘ich qiymati o‘zgartirilganda serverning yangi boshlang‘ich qiymatini yaratish jarayoni ishga tushadi.
2. Serverning boshlang‘ich qiymati (Server Seed): Bu qiymat server tomonidan foydalanuvchiga oshkor etilmaydigan ichki parametrlar asosida yaratiladi. U mijozning joriy boshlang‘ich qiymatiga yagona tarzda bog‘langan. Mijozning har bir boshlang‘ich qiymatiga serverning tegishli boshlang‘ich qiymati mos keladi. Foydalanuvchi mijozning boshlang‘ich qiymatini o‘zgartirganda, tekshirish uchun serverning oldingi boshlang‘ich qiymati ochib beriladi.
3. Nonce: Tikishning vaqt tamg‘asiga (millisekundlarda) asoslangan noyob son. U hatto takroriy harakatlar ham turli natijalar berishini ta’minlaydi.
Bu uchta qiymat birlashtiriladi va HMAC-SHA256 yordamida xeshlanib, o‘yinning yakuniy boshlang‘ich qiymati hosil qilinadi; so‘ngra u o‘yin natijasini aniqlash uchun ishlatiladi.
func GenerateUserGameSeed(userSeed string, userServerSeed string, nonce int64) (string, error) {
data := fmt.Sprintf("%s:%s:%d", userServerSeed, userSeed, nonce)
mac := hmac.New(sha256.New, []byte(data))
gameSeed := hex.EncodeToString(mac.Sum(nil))
return gameSeed, nil
}
Har qanday tikishdan oldin server o‘zining joriy boshlang‘ich qiymatining xeshlangan ko‘rinishini taqdim etadi.
Foydalanuvchi mijozning boshlang‘ich qiymatini o‘zgartirgach, avval ishlatilgan serverning boshlang‘ich qiymati ochib beriladi.
Bu foydalanuvchilarga serverning oldingi boshlang‘ich qiymati bilan yaratilgan barcha natijalar izchil va adolatli bo‘lganini tekshirish imkonini beradi.