
Cara Mengubah Ide Anda Menjadi Program Solana (Kontrak Pintar)
Mari merancang program Solana. Ekosistem Solana menawarkan banyak artikel untuk memahami model pemrograman Solana dan membuat program demo sederhana yang sangat baik bagi pemula untuk mempelajari Solana dan Anchor. Namun, program nyata memiliki pertimbangan yang lebih kompleks.
Dalam artikel ini, kita akan membahas program nyata yang ingin dibuat, termasuk:
- Mendefinisikan data kita sebagai akun Solana
- Membuat relasi antara data kita
- Menyimpan token di dalam program kita
- Menggunakan indeks untuk mempercepat pembacaan
- Menggunakan sharding untuk mempercepat penulisan
Contoh ini bertujuan membantu Anda memahami cara memodelkan ide Anda sendiri sebagai program dan akun Solana.
Catatan: Artikel ini mengasumsikan bahwa Anda telah memahami dasar-dasar Anchor.
Contoh Program Solana — Membangun Pasar Prediksi
Program yang akan kita rancang hari ini adalah pasar prediksi yang mirip dengan Polymarket, Hedgehog, atau Drift BET. Jika belum mengenal pasar prediksi, pasar ini memungkinkan orang bertaruh pada berbagai hasil dari suatu peristiwa. Taruhannya dapat berupa tim mana yang memenangi Superbowl, siapa yang memenangi Oscar ‘Sutradara Terbaik’, apakah pemerintah akan mengumumkan sesuatu pada waktu tertentu, atau peristiwa dunia nyata lainnya dengan hasil tertentu. Jika orang bertaruh pada hasil yang menang, mereka akan menerima kemenangan dari kumpulan taruhan.
Arsitektur Pasar Prediksi
Berikut arsitektur inti pasar prediksi dan hubungan antara setiap elemennya:
- Terdapat beberapa peristiwa.
- Setiap peristiwa memiliki beberapa hasil. Pada akhirnya, salah satu hasil tersebut akan ditetapkan sebagai hasil yang menang.
- Pengguna memasang beberapa taruhan pada setiap hasil. Saat pengguna memasang taruhan, dana mereka ditambahkan ke pool kemenangan untuk peristiwa tersebut.
Saat peristiwa ‘diselesaikan’ (yaitu ketika kita mengetahui hasil yang menang):
- Pengguna yang bertaruh pada hasil yang menang dapat mengklaim kemenangan mereka
- Pemenang akan menerima bagian dari pool kemenangan (setelah dikurangi komisi bandar)
- Bagian setiap pemenang dari pool kemenangan akan didasarkan pada proporsi taruhan mereka atas hasil yang menang.
1. Merancang Aplikasi Kita sebagai Akun Solana
Jika kita merancang program ini untuk menggunakan basis data relasional, kita akan mempertimbangkan:
- Item data serupa yang disimpan sebagai baris dalam tabel
- Kunci utama yang digunakan untuk mengidentifikasi setiap data secara unik
- Kolom tabel yang menentukan atribut dan tipe yang diharapkan untuk setiap item data
Di Solana, konsep-konsep ini kurang lebih dipetakan menjadi:
- Item data serupa disimpan menggunakan tipe akun yang sama
- Alamat digunakan untuk mengidentifikasi setiap data secara unik
- Struktur (kunci dan tipe data) menentukan atribut setiap item
Berikut data yang sama, ditampilkan dalam tabel basis data tradisional dan sebagai akun Solana:
2. Memetakan Relasi Antardata
Relasi antar-item data bekerja dengan cara yang sangat berbeda di Solana. Basis data tradisional menggunakan relasi (yaitu hubungan logis antartabel). Solana menangani relasi satu-ke-banyak sebagai vektor alamat, dengan setiap alamat berisi akun yang memuat item tersebut.
Sebagai contoh, peristiwa memiliki 'hasil' berupa vektor alamat hasil. Anchor menampilkannya sebagai Vec<Pubkey>, meskipun alamat PDA (seperti hasil kita) sebenarnya bukan kunci publik.
3. Menyimpan Token
Tidak seperti basis data tradisional, program Solana juga dapat menyimpan dana—bukan sekadar angka saldo—di dalam akun.
Dalam contoh kita, peristiwa tersebut memerlukan akun token untuk pool kemenangannya. PDA peristiwa akan memiliki akun pool kemenangan. Saat pengguna memasang taruhan, mereka mengirim token ke akun ini. Namun, yang lebih penting, saat mereka mengklaim taruhan, program kita akan menandatangani transaksi sebagai akun peristiwa untuk memindahkan token keluar dari pool kemenangan.
4. Mengurangi Upaya Pembacaan
Program kita harus terasa seresponsif mungkin bagi pengguna. Sebagai developer, kita juga ingin menghindari pembayaran yang tidak perlu untuk pembacaan akun yang tidak diperlukan. Kita dapat membuat program lebih responsif sekaligus lebih efisien dengan total berjalan dan indeks.
Menghitung Total Berjalan
Saat pengguna mengklaim kemenangan, kita perlu mengetahui secara tepat jumlah yang dipertaruhkan pada setiap hasil. Pasar prediksi menentukan pembayaran kepada pengguna yang menang berdasarkan rumus pool kemenangan × jumlah taruhan ÷ total taruhan pada hasil yang menang.
Saat ini, kita hanya menyimpan jumlah setiap taruhan di akun taruhan tersebut. Untuk mendapatkan total taruhan pada hasil tertentu, kita harus membaca setiap akun taruhan dan menjumlahkan nilainya.
Sebagai gantinya, mari tambahkan kolom ke setiap hasil—total_amount—dan tingkatkan nilainya saat pengguna memasang taruhan. Dengan begitu, saat pengguna menang, kita dapat menentukan jumlah pembayaran dengan mudah tanpa harus membaca setiap taruhan pada hasil tersebut.
Menggunakan Indeks
Kita juga perlu menemukan semua taruhan dari akun pengguna tertentu. Kita dapat mengambil setiap akun taruhan menggunakan getProgramAccounts(), lalu memfilter akun yang petaruhnya ditetapkan ke alamat pengguna tersebut. Meskipun getProgramAccounts() cepat dari Helius membuat proses ini jauh lebih cepat dibandingkan penyedia RPC lain, indeks merupakan alternatif yang umum.
Jadi, mari buat indeks untuk menyimpan taruhan setiap pengguna. Saat pengguna memasang taruhan baru, kita akan membuat item ini jika belum ada dan menambahkan taruhan tersebut ke daftar taruhan pengguna:
Kita juga akan menambahkan tag ke setiap peristiwa agar dapat dengan mudah menemukan semua peristiwa dengan tag 'olahraga', ‘politik’, 'eropa', 'as', 'politik', dan sebagainya. Kita akan membuat indeks lain untuk itu:
Sekarang kita dapat dengan mudah mengambil semua peristiwa yang relevan dengan melihat akun tag peristiwa.
5. Mengurangi Kontensi Penulisan
Ingat bahwa setiap peristiwa memiliki satu akun token yang menyimpan taruhan untuk peristiwa tersebut? Setiap kali pengguna menambahkan taruhan baru, token akan dipindahkan ke akun ini. Dengan kata lain, akun tersebut akan ditulisi.
Solana cepat karena memproses operasi secara paralel. Namun, pembaruan saldo pada satu akun tidak dapat dilakukan secara paralel—prosesnya harus dilakukan secara berurutan karena setiap akun harus memiliki satu saldo pada waktu tertentu.
Jika peristiwa baru diumumkan dan menerima banyak taruhan masuk, banyak penulisan akan terjadi pada akun token peristiwa secara bersamaan, sehingga transaksi program kita mungkin terasa lambat. Ini disebut kontensi penulisan—beberapa transaksi bersaing untuk mengakses akun tersebut.
Salah satu cara untuk memungkinkan pemrosesan paralel dalam kasus ini adalah melalui sharding. Sebuah sumber daya dibagi menjadi beberapa bagian—yang disebut shard—dan dapat diakses secara paralel.
Cara Kerja Sharding
Pembayaran masuk dikirim ke shard win_pool terpisah berdasarkan nilai byte terakhir dari kunci publik petaruh, menggunakan makro shard_num(). Ini memastikan pembayaran masuk diproses dengan cepat.
Kemudian, handler instruksi admin dapat menggabungkannya ke dalam satu akun pool kemenangan, memastikan kita memiliki likuiditas dalam akun yang sama untuk membayar para pemenang.
Kita juga perlu mempertimbangkan kontensi penulisan jika peristiwa populer telah diselesaikan dan semua pemenang mengklaim kemenangan mereka secara bersamaan. Kita juga perlu memindahkan dana dari pool kemenangan secepat mungkin.
Opsi terbaik di sini adalah menghindari proses klaim. Sebagai gantinya, jika kita mengirimkan dana secara berurutan segera setelah peristiwa diselesaikan, pengguna tidak perlu menghadapi proses klaim yang lambat—kemenangan mereka sudah akan disetorkan ke akun masing-masing.
Namun, Anda harus benar-benar memiliki pengguna sebelum mencemaskan kerumunan pengguna yang memasang taruhan atau mengklaim kemenangan mereka. Jika Anda sedang merencanakan program Solana dan belum meluncurkannya, pengoptimalan untuk menangani lalu lintas pengguna dalam jumlah besar yang belum Anda miliki tidak diperlukan. Pertimbangkan kompleksitas tambahan dari pengoptimalan besar seperti ini jika Anda tidak membutuhkannya saat peluncuran, sambil menyadari bahwa Anda mungkin perlu menerapkannya saat program menjadi lebih populer.
Kesimpulan
Dalam artikel ini, kita telah membahas secara mendalam pembuatan aplikasi dunia nyata di Solana. Kini Anda memiliki pengetahuan praktis tentang cara mendefinisikan akun Solana, membangun relasi data, menyimpan token, dan mengoptimalkan performa menggunakan indeks serta sharding.
Jika memiliki pertanyaan lanjutan, silakan hubungi @helius di X atau bergabunglah dengan Discord Helius. Kami akan mengembangkan contoh pasar prediksi ini lebih lanjut di masa mendatang, jadi pastikan Anda mengikuti akun tersebut untuk mendapatkan pembaruan.
Dengan keterampilan baru ini, sekarang saatnya mengubah ide Anda menjadi program Solana dan mewujudkannya dalam ekosistem Solana. Selamat membuat kode! Terima kasih kepada Ichigo yang telah meninjau artikel ini dan kepada r0bre yang telah menunjukkan teknik sharding akun yang digunakan.
Referensi Tambahan
Artikel Terkait
Berlangganan Helius
Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan


