Kontrak: cara kerjanya dan alasannya
Semua dana dan semua aturan FAIRDRUM berada dalam satu program di jaringan Solana, yaitu kontrak pintar. Situs hanya mengirimkan perintah kepadanya dan menampilkan jawabannya. Di bawah ini: apa yang disimpan kontrak, perintah apa yang dipahaminya, bagaimana angka acak menjadi hasil, serta apa yang bisa dan tidak bisa dilakukan administrator.
Apa itu kontrak dan di mana letaknya
Kontrak pintar adalah program yang dijalankan oleh node jaringan Solana, bukan di server proyek. Kodenya sama untuk semua orang, dan setiap tindakan adalah transaksi publik. Kontrak FAIRDRUM ditulis dalam Rust dengan pustaka Anchor; kode sumbernya terbuka.
Alamat program akan muncul di sini setelah situs terhubung ke kontrak.
Konsekuensi penting: jika situs fairdrum.to hilang, dana pemain tetap berada di kontrak dan dapat ditarik dengan program apa pun yang mampu mengirim perintah penarikan dengan tanda tangan dompet Anda.
Apa yang disimpan kontrak
- Brankas. Satu akun berisi wrapped SOL yang hanya dikuasai oleh program itu sendiri. Semuanya ada di sana: saldo pemain, bank hadiah, jackpot, cadangan, dan bagian administrator yang belum diambil.
- Akun bersama permainan. Catatan tentang bagaimana jumlah di brankas dibagi: bank hadiah, jackpot, mini jackpot, super jackpot, cadangan jumlah awal, bagian administrator, jumlah awal jackpot, penghitung ronde per permainan.
- Akun pemain. Dibuat dengan perintah register, yang dikirim situs bersama setoran pertama, dan terikat pada alamat dompet: saldo permainan, waktu setoran terakhir, ronde yang belum selesai, bagian jackpot yang belum dibayarkan.
- Akun sesi (jika “permainan tanpa tanda tangan” diaktifkan): kunci sementara, masa berlaku, dan batas taruhan.
Pembukuan disusun sedemikian rupa sehingga jumlah semua saldo dan pot sama dengan jumlah di brankas. Sebuah pengujian memeriksa kesamaan ini setelah setiap operasi dari puluhan ribu operasi acak.
Perintah apa saja yang dipahami kontrak
| Perintah | Siapa yang bisa memanggil | Apa yang dilakukan |
|---|---|---|
register | pemain | Membuat akun pemain. Situs mengirimkannya bersama setoran pertama. |
deposit | pemain | Setoran ke saldo permainan. Mencatat waktunya: dari saat itu dihitung 12 jam sampai penarikan bisa dilakukan. |
withdraw | pemain | Penarikan ke dompet sendiri. Ditolak selama belum lewat 12 jam sejak setoran terakhir. |
spin_commit | pemain atau kunci sesinya | Taruhan: memotong ronde dari saldo, mencatat permainan dan peluang yang berlaku, lalu meminta angka acak dari oracle. |
spin_settle | siapa saja | Penyelesaian: membaca angka oracle, menghitung pembayaran, dan mengkreditkannya ke pemain. Siapa saja bisa memanggilnya — hasilnya tidak bergantung pada hal itu. |
spin_expire | siapa saja | Menutup ronde yang tidak dihitung dalam 20 menit. Jika oracle tidak merespons, taruhan dikembalikan sepenuhnya kepada pemain. Jika oracle merespons dan ronde sudah disegel, hadiah biasa dibayarkan tanpa pengundian jackpot. |
spin_seal | siapa saja | Menyegel ronde: mencatat hash blok taruhan selagi masih tersedia (sekitar 3,5 menit). Hanya diperlukan jika oracle menjawab lebih lama dari itu; biasanya dipanggil oleh layanan penjaga. Ronde yang tidak dihitung dan tidak disegel tepat waktu ditutup tanpa hasil. |
skip_nonce | pemain | Menggeser nomor permintaan keacakan berikutnya jika alamat permintaan ternyata sudah terpakai. |
session_open / session_close | pemain | Mengizinkan kunci sementara memasang taruhan dalam batas masa berlaku dan limit; kunci itu tidak bisa menarik maupun menyetor. |
donate | siapa saja | Menyetor SOL ke cadangan jumlah awal jackpot. Tidak ada perintah kebalikannya. |
set_jackpot_starts | administrator | Menetapkan jumlah awal baru untuk jackpot dan super jackpot; mulai berlaku setelah 24 jam. |
rescale_pools | administrator | Memindahkan sebagian cadangan jumlah awal ke bank hadiah permainan. Hanya ke arah ini; pemindahan ke jackpot tidak bisa dilakukan — jackpot terisi sendiri dari cadangan setelah dimenangkan. |
set_paused | administrator | Menghentikan sementara atau melanjutkan penerimaan taruhan baru — untuk berjaga-jaga jika oracle bermasalah. Taruhan yang sudah dipasang tetap diperhitungkan; pembayaran dan penarikan berjalan seperti biasa. |
set_guardian / guard_pause | administrator | Administrator menunjuk pengawal — kunci milik layanan penjaga yang hanya bisa melakukan satu hal: menghentikan sementara penerimaan taruhan baru jika oracle berhenti merespons. Hanya administrator yang dapat mencabut jeda. |
propose_dev_authority / accept_dev_authority | administrator | Pengalihan hak administrator ke kunci lain dalam dua langkah: kunci saat ini menunjuk kunci baru, lalu kunci baru mengonfirmasinya sendiri. |
roll_epoch / checkin | siapa saja | Perintah layanan: memperbarui statistik mingguan dan penanda hari. Tidak memindahkan dana. |
claim_dev | administrator | Mengambil bagian administrator yang sudah terkumpul — dan hanya itu. |
initialize / fund_pools | administrator | Peluncuran satu kali. initialize membuat akun-akun (ditandatangani pemegang hak pembaruan program); fund_pools mencatat bank awal yang disetor ke pot-pot sebanyak satu kali, sedangkan kelebihan di atasnya dicatat di baris terpisah yang dapat diambil administrator dengan perintah promo_pay. |
Perintah yang memindahkan bank hadiah, jackpot, atau saldo pemain kepada administrator tidak ada di dalam kode.
Ronde langkah demi langkah
- Taruhan. Perintah spin_commit memotong ronde dari saldo Anda dan, dalam transaksi yang sama, membuat permintaan angka acak pada oracle ORAO. Alamat permintaan dihitung dari dompet Anda dan nomor ronde, sehingga permintaan milik orang lain tidak bisa diselipkan.
- Angka. Beberapa node ORAO yang independen menandatangani angka acak dan menuliskannya ke jaringan. Sebelum pencatatan itu tidak ada yang mengetahuinya: baik Anda, proyek, maupun satu node tersendiri.
- Penyelesaian. Perintah spin_settle membaca angka dari catatan oracle, memeriksa bahwa itu memang permintaan untuk ronde Anda, lalu menghitung pembayaran. Situs mengirimkannya sendiri; jika halaman ditutup, hal itu dilakukan program penjaga proyek atau Anda sendiri pada kunjungan berikutnya.
- Tampilan. Kartu, ranjau, roket, batu adalah cara menampilkan pembayaran yang sudah dihitung. Klik di dalam permainan tidak memengaruhinya.
Mengapa hasil tidak bisa diketahui lebih dulu dan tidak bisa dipalsukan. Angka akhir ronde adalah angka oracle yang dicampur dengan hash blok tempat taruhan dicatat. Pada saat taruhan, hash ini belum ada, sedangkan angka oracle datang belakangan dan dari pihak ketiga: tidak seorang pun bisa menghitung hasilnya lebih dulu — baik pemain, proyek, maupun oracle itu sendiri. Permainan, jumlah awal jackpot, dan batas atas hadiah dicatat pada saat taruhan; rumus perhitungannya ada di kode terbuka. Penyelesaian yang terlambat tidak pernah lebih menguntungkan daripada yang tepat waktu. Aturan hanya bisa diubah dengan mengganti kode program, dan itu terlihat oleh semua orang (lihat bagian tentang administrator).
Bagaimana angka acak menjadi hasil
Satu ronde terdiri dari 1 sampai 100 taruhan masing-masing 0,01 SOL (di roda sampai 1000). Angka oracle diuraikan menjadi nilai acak independen untuk setiap taruhan, dan untuk setiap taruhan kontrak menjawab pertanyaan berikut secara berurutan:
- Super jackpot, jackpot, mini jackpot? Peluang setiap pot sama dengan kontribusi taruhan ke pot itu dibagi jumlah awal pot. Pot hanya diundi jika isinya sedikitnya 25% dari jumlah awal.
- Hadiah permainan? Setiap permainan punya peluang hadiah sendiri dan tabel sendiri yang terdiri dari enam tingkat berbobot. Misalnya, di roda hadiah keluar pada 10% taruhan. Tabel semua permainan ditampilkan di halamannya masing-masing.
- “Spin lagi”? Dengan peluang 11,6%, taruhan diulang gratis atas biaya bank hadiah.
- Jika tidak, taruhan itu tanpa hadiah. Taruhan tersebut dibagi sama seperti taruhan lainnya: bank hadiah, jackpot, dan bagian administrator.
Tabel tiap permainan berbeda, tetapi pembayaran yang diharapkan sama (dengan ketelitian sampai seperseratus persen; pada bank hadiah mulai 40 SOL, ketika hadiah tidak terbentur batas atas): sekitar 77,5% taruhan berupa hadiah biasa, dan bersama pengulangan “Spin lagi” sekitar 88% dari taruhan berbayar. Kesamaan ini diperiksa oleh kompiler: jika nilai harapan suatu permainan ternyata lebih tinggi daripada roda, atau lebih rendah dengan selisih lebih dari setengah persen, program tidak akan bisa dibangun.
Ke mana kontrak menaruh setiap taruhan
| Ke mana | Bagian dari taruhan berbayar | Untuk apa |
|---|---|---|
| Bank hadiah | ≈88% | hadiah biasa semua permainan |
| Jackpot, mini jackpot, super jackpot, dan jumlah awal | 2% | tiga pot bersama |
| Administrator | 10% | pendapatan proyek; tidak ada yang lain |
Di dalam kode, bagian-bagian ini dicatat dari setiap taruhan yang dieksekusi, termasuk pengulangan gratis; karena itu di sana tertulis 8,84% dan 1,77%: jika dihitung terhadap taruhan berbayar, rata-ratanya 10% dan 2%.
Aturan pembatas dan kegunaannya
- Satu hadiah tidak lebih dari seperempat bank hadiah. Kontrak tidak bisa menjanjikan lebih dari yang dimilikinya, dan satu kemenangan besar tidak mengosongkan bank bagi pemain lain. Bagian yang tidak terbayar tetap berada di bank.
- Penarikan 12 jam setelah setoran terakhir. Aturan ini sama untuk semua orang dan dicatat sebagai konstanta: hanya bisa diubah dengan versi program yang baru.
- Jumlah awal jackpot berubah dengan penundaan 24 jam. Peluang ronde dikunci pada saat taruhan, sehingga tidak bisa diubah “menyesuaikan taruhan yang sudah dipasang”.
- 20 menit untuk perhitungan. Jika oracle tidak merespons, taruhan dikembalikan sepenuhnya kepada pemain: selama angkanya belum ada, tidak seorang pun mengetahui hasilnya, sehingga cara ini tidak bisa dipakai untuk menghindari kekalahan. Jika oracle merespons tetapi perhitungannya terlambat, hadiah biasa dibayarkan, sedangkan jackpot tidak diundi pada ronde ini. Perlindungan brankas. Sebelum setiap pembayaran dan setelah setiap perhitungan, kontrak memeriksa bahwa isi brankas tidak kurang dari kewajibannya kepada pemain dan pot; jika tidak, operasi ditolak. Pengawal. Jika oracle berhenti merespons, penerimaan taruhan baru dihentikan sementara secara otomatis; perhitungan dan penarikan tetap berjalan.
- Jackpot dibayar bertahap: pemenang berhak atas 95% pot, dengan 20% dibayar langsung dan 8% per minggu. Bagian yang belum dibayarkan tercatat di akun pemenang.
- Satu ronde belum selesai per pemain. Selama ronde belum diselesaikan, taruhan baru tidak diterima.
Apa yang bisa dan tidak bisa dilakukan administrator
Bisa
- mengambil bagiannya — 10% dari taruhan berbayar;
- menyetor SOL ke cadangan dan memindahkannya dari cadangan ke bank hadiah;
- mengambil kelebihan yang saat peluncuran berada di brankas di atas bank awal;
- mengubah jumlah awal jackpot — dengan penundaan dan dalam batas yang ditentukan;
- menghentikan sementara penerimaan taruhan baru jika oracle tidak merespons, dan mengalihkan haknya ke kunci lain.
Tidak bisa
- menarik bank hadiah, jackpot, cadangan, atau saldo pemain (sebagai pemain, ia menang dengan ketentuan yang sama seperti semua orang);
- mengubah tabel hadiah, peluang hadiah permainan, dan pembagian taruhan: semuanya konstanta dalam kode;
- mengetahui angka acak suatu ronde sebelum taruhan atau memilihnya;
- menghentikan perhitungan taruhan yang sudah dipasang atau penarikan: jeda hanya berlaku untuk taruhan baru.
Catatan jujur. Program ini memiliki hak pembaruan: selama hak itu belum dicabut, pemegangnya bisa mengganti kode dengan versi baru, dan saat itu semua yang dikatakan di atas berlaku untuk kode yang baru. Status hak ini dan setiap pembaruan terlihat di penjelajah Solana. Tidak ada audit independen atas kontrak.
Cara pengujiannya
- Pengujian kontrak: bagian administrator 10% di setiap permainan, pengembalian semua permainan yang berdekatan pada bank 50 SOL, aturan seperempat bank dan batas atas hadiah pada saat taruhan, kunci penarikan, perubahan jumlah awal yang ditunda, penyelesaian terlambat tidak lebih menguntungkan daripada yang tepat waktu.
- Pemeriksaan keutuhan dana: puluhan ribu operasi acak; setelah setiap operasi, jumlah di brankas dicocokkan dengan jumlah saldo dan pot.
- Simulasi panjang: masing-masing dua juta taruhan untuk setiap permainan — berapa yang dibayarkan kepada pemain, berapa yang diterima administrator.
- Transaksi nyata di node Solana lokal: setoran, penolakan penarikan sebelum waktunya, penyetoran ke cadangan, perubahan jumlah awal.
- Pengujian situs: situs menghitung peluang dengan rumus yang sama seperti kontrak dan mencocokkannya dengan sampel yang dicatat kontrak.
Apa yang belum diuji dan belum dikerjakan dicantumkan apa adanya di halaman “Mengapa FAIRDRUM”. Cara memeriksa sendiri ronde mana pun ada di halaman “Periksa ronde”.
Parameter kontrak dalam satu tabel
- Taruhan satuan
- 0,01 SOL
- Ronde
- sampai 100 taruhan di permainan, sampai 1.000 di roda
- Jumlah permainan (mode)
- 16
- Peluang “Spin lagi”
- 11,6%
- Batas atas satu hadiah
- 1/4 bank hadiah
- Jumlah awal terkecil
- jackpot 0,2 SOL, super jackpot 2 SOL
- Mini jackpot
- dimulai dari 1/10 jackpot
- Untuk pemenang jackpot
- 95% · 5% masuk ke super jackpot
- Untuk pemenang super jackpot
- 90%
- Kunci penarikan
- 12 jam setelah setoran terakhir
- Batas waktu penyelesaian ronde
- 3.000 slot jaringan, sekitar 20 menit
- Biaya jaringan dan oracle
- 0,005 SOL per ronde, bukan dipungut proyek