Block-Sena Buku Putih Teknis
Keamanan dan Transparansi

Dapat diaudit, undian on-chain dapat dihakimi oleh siapa pun

Di Block-Sena, pengundian menggunakan dua fase commit-reveal aliran, dikombinasikan dengan sebuah blokhash masa depan Dan prevrandao. Hal ini membuat hasilnya bersifat deterministik setelah eksekusi, dapat diaudit di blockchain, dan tahan terhadap manipulasi manual atas nomor yang ditarik.

6 tanggal 30 Permainan dasar dengan 6 pilihan unik dan seri 6 nomor unik
6 dan 10 Tiket pilihan ganda dengan kuota kemenangan kombinatorial (4/5/6 hit)
Multi-Token Pembayaran per token dengan penyelesaian independen dan carry-over yang dapat diaudit

Ringkasnya

Block-Sena adalah lotere on-chain yang mana pembelian tiket, pengunci putaran, pelaksanaan pengundian, dan hadiah distribusi dicatat di blockchain. Protokol menggunakan aliran dua fase: blockSenaPauseDraw (mengunci putaran dan mencatat komitmen) dan blockSenaDrawPay (mengungkapkan, menarik, dan membayar).

Sasaran

Menjamin proses yang dapat diaudit dan diproduksi dengan aturan pembayaran yang transparan untuk setiap putaran.

Auditabilitas

Siapapun yang dapat memverifikasi masukan (komit, garam, blok target), perhitungan benih, nomor yang ditarik, dan peristiwa penyelesaian.

Pengungkapan Komitmen (2 Fase)

Fase 1: Jeda + Komit

Fungsinya blockSenaPauseDraw(usdValuePoolSnapshot, commitHash) mengunci putaran untuk pembelian baru, menetapkan blok target masa depan, dan hanya menyimpan garam rahasia hash.

Tahap 2: Buka + Undian + Bayar

Fungsinya blockSenaDrawPay(garam) memvalidasi itu keccak256(garam) == commitHash, menggunakan blok target blokhash, menghasilkan 6 nomor unik, dan mengeksekusi pembayaran.

Jendela blockhash teknis

Itu blokhash hanya dapat dibaca untuk ~256 blok. Jika habis masa berlakunya, putaran tersebut membutuhkan pengaturan ulang operasional. Penyetelan ulang ini merupakan tindakan pengamanan yang jarang terjadi dengan batas waktu on-chain, dan setiap penggunaan tetap bersifat publik on-chain.

Komitmen Garam

commitHash = keccak256(abi.encodePacked(garam))
Garam tidak ditemukan di fase 1. Hanya hash yang dipublikasikan. Pada fase 2, garam yang terungkap harus tetap sama dengan komitmennya.

Blok Sasaran

targetBlock = blok.angka + 5
Pengundian menggunakan hash dari blok masa depan. Pada saat commit, blockhash ini belum ada, jadi tidak ada yang mengetahui masukan ini sebelumnya.

Aliran Gambar (21:00 UTC -> +5 blok -> DrawPay)

Alur operasional Block-Sena terpisah dengan jelas penutupan tiket dari generasi 6 angka. Pemisahan ini menghilangkan risiko pembelian tiket setelah hasilnya diketahui atau mencoba menyesuaikan tiket agar sesuai dengan nomor yang ditarik.

1) 21:00 UTC (jendela operasional) -> blockSenaPauseDraw

Fungsinya blockSenaPauseDraw(usdValuePoolSnapshot, commitHash) mengunci putaran, memblokir pembelian baru, mencatat komitHash, mendefinisikan targetBlock = blok.angka + 5, dan menyimpan kumpulan snapshot dalam USD.

2) Tiket tersingkir sebelum ada keacakan

Setelah itu PauseDraw, tidak ada tiket baru yang dapat memasuki babak itu. Pada saat itu, blockhash(targetBlock) masih belum ada, jadi 6 angka terakhirnya belum bisa diprediksi atau dihitung.

3) +5 blok (setelah blok target) -> blockSenaDrawPay

Fungsinya blockSenaDrawPay(garam) memvalidasi garam terhadap komitmen, membaca target blok blokhash, menghasilkan 6 nomor unik, dan mengeksekusi pembayaran per token. Jika dipanggil sebelum blok target, transaksi akan mengembalikan on-chain.

4) Auditabilitas publik setiap saat

Siapa pun yang dapat memverifikasi penjelajahan: the blockSenaPauseDraw terima kasih, sasaran blok, itu blockSenaDrawPay tx, garam terungkap, nomor yang ditarik, dan peristiwa penyelesaian/pembayaran.

Apa yang dicegah oleh desain ini dalam praktiknya

Hal ini tidak mungkin untuk membeli tiket setelah melihat 6 nomor putaran, karena putarannya sudah terkunci blockSenaPauseDraw sebelum pengundian dilaksanakan.

Hal ini tidak mungkin untuk mengetahui 6 angka pada lock time, karena rumusnya tergantung di blok masa depan (sasaran blok) yang belum ada pada saat itu.

Hal ini tidak mungkin untuk melaksanakan pengundian sebelum waktu teknis, karena blockSenaDrawPay membutuhkan on-chain bahwa blok saat ini sudah melewati sasaran blok.

Tentang ResetDraw (skenario langka)

blockSenaResetDraw ada hanya untuk mencegah jebakan terjebak secara permanen jika terjadi kegagalan infrastruktur yang berkepanjangan (misalnya: pemadaman RPC, pemeliharaan layanan, pemadaman jaringan/infra, atau masalah operasional yang berkelanjutan) dan DrawPay tidak dapat dieksekusi sebelumnya blockhash(targetBlock) masa.

Dalam aliran normal, perilaku yang diharapkan adalah mengeksekusi DrawPay beberapa blok setelahnya PauseDraw (target pada +5 blok). Reset adalah perlindungan keaktifan, bukan bagian dari aliran penarikan normal.

Rumus Undian Matematika (6 angka unik)

Benih undian berasal dari kombinasi blok masa depan, garam yang dikomit, dan data bulat. Dari situ, kontrak menghasilkan angka dari 1 hingga 30, membuang duplikat hingga mencapai 6 angka unik.

Dari segi keamanan operasional: karena tiket sudah dibekukan di PauseDraw fase sebelum blok berikutnya ada, undian tidak dapat "dibuat" untuk mencocokkan tiket yang dimasukkan kemudian, dan tidak ada peserta yang dapat bertaruh pada putaran yang sama setelahnya mengetahui hasilnya.

Menggambar Benih

seed = keccak256(abi.encodePacked(blockhash(targetBlock), garam, blok.prevrandao, roundId))
Input nyata yang digunakan dalam kontrak: blockhash(targetBlock), garam, blok.prevrandao, Dan currentRoundId.

Generasi Setiap Nomor

angka = (keccak256(seed, nonce) mod 30) + 1
Jika nomor tersebut sudah ditarik pada putaran itu, maka nomor tersebut dibuang dan tidak ada bertambah. Proses berulang hingga diperoleh 6 nomor unik.

Prosedur ini mencegah pengulangan angka pada hasil akhir dan menjaga pengundian dalam rentang yang valid 1..30.

Penting (transparansi) Hasil putaran akhir bersifat deterministik dan dapat diproduksi dengan data on-chain. Operasional apa pun upaya intervensi (misalnya, penyetelan ulang putaran) meninggalkan jejak publik dan dapat diaudit on-chain.

Tiket Pilihan Ganda (6 hingga 10 nomor) dan Kuota Kombinatorial

Di Block-Sena, tiket dapat berisi dari 6 sampai 10 angka. Tiket ini mewakili banyak kombinasi setara dari 6 angka. Perhitungan hadiah didasarkan pada kuota pemenang (kombinasi), bukan hanya “orang”.

Kombinasi Total untuk Tiket dengan Angka k

kombo(k) = C(k, 6)
Contoh: jika k = 10, Kemudian C(10,6) = 210 kombinasi yang setara.

Memenangkan kuota berdasarkan tingkatan (4/5/6)

kaitkan tiket dengan k angka dan X pertandingan di dalam 6 nomor yang ditarik.

q6 = C(x, 6)
q5 = C(x, 5) * C(k - x, 1)
q4 = C(x, 4) * C(k - x, 2)
Kontrak menjumlahkan kuota ini per dompet dan membayarnya dalam bentuk agregat per token (lebih hemat bahan bakar).

Contoh (tiket 10 nomor dengan 6 nomor yang ditarik di dalam 10)

q6 = 1, q5 = 24, q4 = 90. Tiket yang sama dapat dimenangkan secara bersamaan di level ketiga.

Pembayaran Multi-Token (Penyelesaian Per Token)

Setiap kumpulan token (misalnya, asli, USDC, USDT) diselesaikan secara independen. Kontrak penentuan dan pemenang berdasarkan putaran dan secara tidak langsung, mempertahankan riwayat yang tepat RoundTokenStats.

Pemisahan Tingkat

Tingkat 6 pukulan = 80% dari kumpulan token
Tingkat 5 pukulan = 15% dari kumpulan token
Tingkat 4 pukulan = 5% dari kumpulan token

Hadiah per pemenang kuota

hadiahPerWinnerX = lantai(prizeBucketX / kuotasX)
Pembagian menggunakan aritmatika bilangan bulat on-chain. Sisa pembulatan (debu) tetap menjadi carry-over untuk putaran selanjutnya.

Jika tidak ada pemenang

Jumlah untuk level tersebut tidak hilang: menjadi carry-over untuk token tersebut pada putaran berikutnya.

Jika ada beberapa pemenang

Hadiahnya dibagi berdasarkan kuota kemenangan. Dompet yang sama dapat menerima beberapa kuota yang digabungkan menjadi satu pembayaran per token.

Cara Mengaudit Putaran (Langkah demi Langkah)

  1. Temukan blockSenaPauseDraw terima kasih dan catat komitHash Dan sasaran blok.
  2. Setelah blok target, temukan blockSenaDrawPay tx dan baca yang dikirimkan garam.
  3. Hitung ulang keccak256(garam) dan pastikan itu cocok dengan komitHash.
  4. Membaca blockhash(targetBlock) di penjelajahan dan prevrandao dari blok draw tx.
  5. Produksi ulang benih dan rutinitas pembuatan 6 angka (buang duplikatnya) dan bandingkan dengan Gambar Dieksekusi.
  6. Jika terjadi kegagalan operasional yang jarang terjadi, periksalah DrawReset (roundId, targetBlock, reset blok) untuk memvalidasi batas waktu dan mengatur ulang ketertelusuran.
  7. Memeriksa RoundTokenSettled acara untuk kumpulan, pembayaran per tingkat, dan per token carry-over.
  8. Konfirmasikan transfer asli/ERC20 untuk memvalidasi pembayaran kepada pemenang.

Jaminan, Transparansi dan Batasan Operasional

Block-Sena dirancang sedemikian rupa sehingga hasilnya bulat dapat diaudit, dapat direproduksi, dan transparan. Pengungkapan komitmen yang dikombinasikan dengan blok masa depan secara signifikan mengurangi kemungkinan manipulasi hasil manual.

Secara teknis, modellah yang menentukan hasilnya tidak dapat diprediksi pada waktu kunci, karena putaran ditutup sebelumnya blockhash(targetBlock) digunakan dalam benih ada. Hal ini membuat formula tetap publik dan dapat diaudit tanpa mengizinkan taruhan selanjutnya berdasarkan hasil.

Apa yang dijamin on-chain

Aturan penarikan, perhitungan kuota, pembagian tingkat pembayaran (80/15/5), riwayat per token, peristiwa, dan ketertelusuran setiap langkah.

Operasi darurat

Ada fungsi draw reset untuk skenario teknis yang jarang terjadi (misalnya, blockhash yang disebabkan oleh kegagalan infra/jaringan yang berkepanjangan). Ini hanya dapat dieksekusi dengan putaran terkunci dan setelah batas waktu on-chain. Setiap penggunaan bersifat publik, dicatat on-chain, dan dapat diaudit di penjelajahan.

Reset tidak menghapus dana, menghapus tiket, atau mengubah pool. Itu hanya membuka siklus putaran untuk memungkinkan upaya undian baru untuk putaran yang sama dalam skenario kegagalan yang jarang terjadi.

Dana hadiah tetap ada dalam kontrak hingga pengundian dan pembayaran otomatis kepada pemenang. Jika tidak ada pemenang dalam satu tingkat, nilai tetap diperhitungkan sebagai carry-over untuk putaran berikutnya. Pemiliknya tidak mempunyai fungsi untuk menarik dana yang sudah diperhitungkan dalam kumpulan hadiah.

Itu rescueAll fungsi ada hanya untuk menyelamatkan surplus yang tidak terhitung (misalnya, kesalahan transfer langsung), perhitungan saldo riil - kumpulan yang diperhitungkan. Itu tidak mencapai dana hadiah sudah diperhitungkan dalam pool.

Dengan kata lain: Block-Sena tidak meminta kepercayaan tetapi. Ini memberikan aliran yang dapat diamati, diproduksi secara matematis, dan persyaratan on-chain oleh siapa pun dan kapan pun.