Sözleşme: nasıl ve neden çalışır
FAIRDRUM'un tüm fonları ve tüm kuralları Solana ağındaki tek bir programda, yani akıllı sözleşmede durur. Site ona yalnızca komut gönderir ve yanıtı gösterir. Aşağıda sözleşmenin ne sakladığı, hangi komutları anladığı, rastgele sayıdan sonucun nasıl çıktığı ve yöneticinin neyi yapıp neyi yapamadığı anlatılır.
Sözleşme nedir ve nerede durur
Akıllı sözleşme, projenin sunucusunda değil, Solana ağının düğümlerinde çalışan bir programdır. Kodu herkes için aynıdır ve her işlem herkese açık bir işlemdir. FAIRDRUM sözleşmesi Rust ile, Anchor kütüphanesi kullanılarak yazılmıştır; kaynak kodu açıktır.
Site sözleşmeye bağlandığında programın adresi burada görünecek.
Önemli bir sonuç: fairdrum.to sitesi ortadan kalksa bile oyuncuların fonları sözleşmede kalır ve cüzdanınızın imzasıyla çekim komutunu gönderebilen herhangi bir programla çekilebilir.
Sözleşme ne saklar
- Saklama hesabı. Wrapped SOL tutan ve yalnızca programın kendisinin tasarruf ettiği tek bir hesap. Her şey buradadır: oyuncu bakiyeleri, ödül bankası, jackpotlar, rezerv ve yöneticinin henüz almadığı pay.
- Ortak oyun hesabı. Saklama hesabındaki tutarın nasıl bölündüğünün kaydı: ödül bankası, jackpot, mini jackpot, süper jackpot, başlangıç tutarı rezervi, yöneticinin payı, jackpotların başlangıç tutarları, oyunlara göre tur sayaçları.
- Oyuncu hesabı. Sitenin ilk yatırmayla birlikte gönderdiği register komutuyla oluşturulur ve cüzdan adresine bağlıdır: oyun bakiyesi, son yatırma zamanı, tamamlanmamış tur, jackpotun ödenmemiş kısmı.
- Oturum hesabı (“imzasız oyun” açıksa): geçici anahtar, süre ve bahis limiti.
Muhasebe, tüm bakiyelerin ve havuzların toplamı saklama hesabındaki tutara eşit olacak şekilde kurulmuştur. Bir test, on binlerce rastgele işlemin her birinden sonra bu eşitliği doğrular.
Sözleşme hangi komutları anlar
| Komut | Kim çağırabilir | Ne yapar |
|---|---|---|
register | oyuncu | Oyuncu hesabını oluşturur. Site bu komutu ilk yatırmayla birlikte gönderir. |
deposit | oyuncu | Oyun bakiyesine yatırma. Zamanı kaydeder: çekime kadar olan 12 saat bu andan itibaren sayılır. |
withdraw | oyuncu | Kendi cüzdanınıza çekim. Son yatırmadan itibaren 12 saat geçmeden reddedilir. |
spin_commit | oyuncu veya oturum anahtarı | Bahis: turu bakiyeden düşer, oyunu ve geçerli olasılıkları kaydeder, oracle'dan rastgele bir sayı ister. |
spin_settle | herkes | Hesaplama: oracle'ın sayısını okur, ödemeyi hesaplar ve oyuncunun bakiyesine yazar. Herkes çağırabilir; sonuç buna bağlı değildir. |
spin_expire | herkes | 20 dakika içinde hesaplanmamış turu kapatır. Oracle yanıt vermediyse bahis oyuncuya eksiksiz iade edilir. Oracle yanıt verdiyse ve tur sabitlendiyse, jackpot çekilişi yapılmadan olağan ödülleri öder. |
spin_seal | herkes | Turu sabitler: bahis bloğunun hash'ini, erişilebilir olduğu sürece (yaklaşık 3,5 dakika) kaydeder. Yalnızca oracle daha geç yanıt verirse gerekir; genellikle nöbetçi servis çağırır. Zamanında hesaplanmamış ve sabitlenmemiş tur sonuçsuz kapatılır. |
skip_nonce | oyuncu | İsteğin adresi dolu çıkarsa bir sonraki rastgelelik isteğinin numarasını kaydırır. |
session_open / session_close | oyuncu | Geçici bir anahtarın süre ve limit dahilinde bahis yapmasına izin verir; anahtar ne çekim ne de yatırma yapabilir. |
donate | herkes | Jackpotların başlangıç tutarı rezervine SOL koyar. Bunun tersini yapan bir komut yoktur. |
set_jackpot_starts | yönetici | Jackpot ve süper jackpot için yeni başlangıç tutarları belirler; 24 saat sonra yürürlüğe girer. |
rescale_pools | yönetici | Başlangıç tutarı rezervinin bir kısmını oyunların ödül bankasına aktarır. Yalnızca bu yönde; jackpotlara aktarılamaz, onlar kazanıldıktan sonra rezervden kendiliğinden dolar. |
set_paused | yönetici | Yeni bahislerin kabulünü durdurur veya yeniden başlatır: oracle arızası durumu için. Yapılmış bahisler hesaplanır; ödemeler ve çekim her zamanki gibi çalışır. |
set_guardian / guard_pause | yönetici | Yönetici bir bekçi atar: bu, nöbetçi servisin anahtarıdır ve yalnızca tek bir şey yapabilir — oracle yanıt vermeyi bıraktıysa yeni bahislerin kabulünü durdurmak. Duraklatmayı yalnızca yönetici kaldırabilir. |
propose_dev_authority / accept_dev_authority | yönetici | Yönetici yetkilerinin başka bir anahtara iki adımda devri: mevcut anahtar yenisini belirtir, yeni anahtar bunu kendisi onaylar. |
roll_epoch / checkin | herkes | Yardımcı komutlar: haftalık istatistiği ve gün işaretini günceller. Fon hareket ettirmez. |
claim_dev | yönetici | Yöneticinin birikmiş payını alır, yalnızca onu. |
initialize / fund_pools | yönetici | Bir defalık başlatma. initialize hesapları oluşturur (programın güncelleme yetkisinin sahibi imzalar); fund_pools konulan başlangıç bankasını bir kez havuzlara yazar, bunu aşan fazlalığı ise yöneticinin promo_pay komutuyla alabileceği ayrı bir satıra yazar. |
Ödül bankasını, jackpotları veya oyuncu bakiyelerini yöneticiye aktaran bir komut kodda yoktur.
Adım adım tur
- Bahis. spin_commit komutu turu bakiyenizden düşer ve aynı işlemde ORAO oracle'ında bir rastgele sayı isteği oluşturur. İsteğin adresi cüzdanınızdan ve tur numarasından hesaplanır; bu yüzden başkasının isteği yerine konulamaz.
- Sayı. Birkaç bağımsız ORAO düğümü rastgele sayıyı imzalar ve ağa yazar. Bu kayda kadar onu kimse bilmez: ne siz, ne proje, ne de tek bir düğüm.
- Hesaplama. spin_settle komutu sayıyı oracle'ın kaydından okur, isteğin tam olarak sizin turunuza ait olduğunu doğrular ve ödemeyi hesaplar. Site bu komutu kendisi gönderir; sayfa kapalıysa bunu projenin nöbetçi programı ya da bir sonraki girişinizde siz yaparsınız.
- Gösterim. Kartlar, mayınlar, roket, taşlar zaten hesaplanmış ödemeyi göstermenin bir yoludur. Oyundaki tıklamalar onu etkilemez.
Sonuç neden önceden öğrenilemez ve sahtesi üretilemez. Turun nihai sayısı, oracle'ın sayısının, bahsin kaydedildiği bloğun hash'iyle karıştırılmış hâlidir. Bahis anında bu hash henüz yoktur, oracle'ın sayısı ise daha sonra ve üçüncü bir taraftan gelir: sonucu önceden kimse hesaplayamaz — ne oyuncu, ne proje, ne de oracle'ın kendisi. Oyun, jackpotların başlangıç tutarları ve ödül tavanı bahis anında kaydedilir; hesaplama formülü ise açık koddadır. Geciken hesaplama hiçbir zaman zamanında yapılandan daha avantajlı olmaz. Kurallar yalnızca programın kodu değiştirilerek değiştirilebilir, bunu da herkes görür (yöneticiyle ilgili bölüme bakın).
Rastgele sayıdan sonuç nasıl çıkar
Bir tur, her biri 0,01 SOL olan 1 ila 100 bahisten oluşur (çarkta 1000'e kadar). Oracle'ın sayısı her bahis için bağımsız bir rastgele değere açılır ve sözleşme her bahis için sırayla şu soruları yanıtlar:
- Süper jackpot, jackpot, mini jackpot? Her havuzun olasılığı, bahsin o havuza katkısının havuzun başlangıç tutarına bölümüne eşittir. Bir havuz, yalnızca içinde başlangıç tutarının en az %25 kadarı varken çekilişe girer.
- Oyun ödülü? Her oyunun kendi ödül olasılığı ve ağırlıklı altı kademeli kendi tablosu vardır. Örneğin çarkta bahislerin %10 kadarında ödül çıkar. Tüm oyunların tabloları kendi sayfalarında gösterilir.
- “Bir daha”? %11,6 olasılıkla bahis, ödül bankası hesabına ücretsiz olarak tekrarlanır.
- Aksi halde bahis ödülsüzdür. Diğer her bahis gibi bölünür: ödül bankası, jackpotlar ve yöneticinin payı.
Oyunların tabloları farklıdır, ama beklenen ödeme hepsinde aynıdır (yüzdenin yüzde biri hassasiyetiyle; ödül bankası 40 SOL ve üzerindeyken, yani ödüller tavana takılmadığında): bahsin yaklaşık %77,5'i olağan ödüller olarak, “Bir daha” tekrarlarıyla birlikte ise ödenmiş bahislerin yaklaşık %88'i. Bu eşitliği derleyici denetler: herhangi bir oyunun beklentisi çarktakinden yüksek ya da yarım yüzde puandan fazla düşük çıkarsa program derlenmez.
Sözleşme her bahsi nereye koyar
| Nereye | Ödenmiş bahisteki pay | Neden |
|---|---|---|
| Ödül bankası | ≈88% | tüm oyunların olağan ödülleri |
| Jackpot, mini jackpot, süper jackpot ve başlangıç tutarı | 2% | üç ortak havuz |
| Yönetici | 10% | projenin geliri; başka geliri yoktur |
Kodda paylar, ücretsiz tekrarlar dahil gerçekleşen her bahis üzerinden yazılmıştır; bu yüzden orada %8,84 ve %1,77 yazar: ödenmiş bahislere göre hesaplandığında bu ortalama %10 ve %2 eder.
Sınırlayıcı kurallar ve neden gerekli oldukları
- Tek bir ödül, ödül bankasının dörtte birini aşamaz. Sözleşme elindekinden fazlasını vadedemez ve tek bir büyük kazanç bankayı diğerleri için boşaltmaz. Ödenmeyen kısım bankada kalır.
- Çekim, son yatırmadan 12 saat sonra. Kural herkes için aynıdır ve sabit olarak yazılmıştır: yalnızca programın yeni bir sürümüyle değiştirilebilir.
- Jackpotların başlangıç tutarları 24 saat gecikmeyle değişir. Turun olasılıkları bahis anında sabitlenir; bu yüzden “yapılmış bir bahse göre” değiştirilemez.
- Hesaplama için 20 dakika. Oracle yanıt vermediyse bahis oyuncuya eksiksiz iade edilir: sayı yokken sonucu kimse bilmez, bu yüzden kaybedilen bir bahisten bu yolla vazgeçilemez. Oracle yanıt verdiyse ama hesaplama geciktiyse olağan ödüller ödenir, bu turda jackpot çekilişi ise yapılmaz. Saklama hesabı koruması. Her ödemeden önce ve her hesaplamadan sonra sözleşme, saklama hesabındaki tutarın oyunculara ve havuzlara borçlu olduğundan az olmadığını denetler; aksi halde işlem reddedilir. Bekçi. Oracle yanıt vermeyi bıraktıysa yeni bahislerin kabulü otomatik olarak durdurulur; hesaplamalar ve çekim çalışmaya devam eder.
- Jackpot taksitle ödenir: kazanana havuzun %95 kadarı düşer; bunun %20 kadarı hemen, kalanı haftada %8 olarak ödenir. Ödenmemiş kısım kazananın hesabına yazılıdır.
- Oyuncu başına tek tamamlanmamış tur. Tur hesaplanmadan yeni bahis kabul edilmez.
Yönetici neyi yapabilir, neyi yapamaz
Yapabilir
- kendi payını almak: ödenmiş bahislerin %10'u;
- rezerve SOL koymak ve bunları rezervden ödül bankasına aktarmak;
- başlatma sırasında saklama hesabında başlangıç bankasını aşan fazlalığı almak;
- jackpotların başlangıç tutarlarını gecikmeyle ve belirlenmiş sınırlar içinde değiştirmek;
- oracle yanıt vermiyorsa yeni bahislerin kabulünü durdurmak ve yetkilerini başka bir anahtara devretmek.
Yapamaz
- ödül bankasını, jackpotları, rezervi veya oyuncu bakiyelerini çekmek (oyuncu olarak herkesle aynı koşullarda kazanır);
- ödül tablolarını, oyunların ödül olasılığını ve bahis paylarını değiştirmek: bunlar kod sabitleridir;
- turun rastgele sayısını bahisten önce öğrenmek veya seçmek;
- yapılmış bahislerin hesaplanmasını veya çekimi durdurmak: duraklatma yalnızca yeni bahisleri kapsar.
Dürüst bir çekince. Programın bir güncelleme yetkisi vardır: iptal edilmediği sürece sahibi kodu yeni bir sürümle değiştirebilir ve o zaman yukarıda söylenenlerin tümü artık yeni kod için geçerli olur. Bu yetkinin durumu ve her güncelleme Solana gezgininde görülür. Sözleşmenin bağımsız denetimi yoktur.
Nasıl test edildi
- Sözleşme testleri: her oyunda %10 yönetici payı, 50 SOL bankada tüm oyunların birbirine yakın getirisi, bankanın dörtte biri kuralı ve bahis anındaki ödül tavanı, çekim kilidi, başlangıç tutarlarının ertelenmiş değişimi, geç hesaplamanın zamanında yapılandan avantajlı olmaması.
- Fonların korunumu denetimi: on binlerce rastgele işlem; her birinden sonra saklama hesabındaki tutar, bakiyelerin ve havuzların toplamıyla karşılaştırılır.
- Uzun koşular: her oyun için ikişer milyon bahis; oyunculara ne kadar ödendi, yönetici ne kadar aldı.
- Yerel bir Solana düğümünde gerçek işlemler: yatırma, süresinden önce çekimin reddi, rezerve para koyma, başlangıç tutarlarının değişimi.
- Site testleri: site olasılıkları sözleşmeyle aynı formüllerle hesaplar ve sözleşmenin kaydettiği örneklerle karşılaştırır.
Test edilmemiş ve yapılmamış olanlar, “Neden FAIRDRUM” sayfasında süslemeden sayılmıştır. Herhangi bir turu kendiniz nasıl doğrulayacağınız “Turu doğrula” sayfasındadır.
Sözleşme parametreleri tek tabloda
- Birim bahis
- 0,01 SOL
- Tur
- oyunlarda 100 bahse kadar, çarkta 1.000 bahse kadar
- Oyun (mod) sayısı
- 16
- “Bir daha” olasılığı
- 11,6%
- Tek ödülün tavanı
- ödül bankasının 1/4 kadarı
- En küçük başlangıç tutarı
- jackpot 0,2 SOL, süper jackpot 2 SOL
- Mini jackpot
- jackpotun 1/10 kadarıyla başlar
- Jackpotu kazanana
- 95% · %5 süper jackpota gider
- Süper jackpotu kazanana
- 90%
- Çekim kilidi
- son yatırmadan sonra 12 saat
- Turun hesaplanma süresi
- 3.000 ağ slotu, yaklaşık 20 dakika
- Ağ ve oracle ücreti
- tur başına 0,005 SOL; projenin aldığı bir ücret değil