
Cara Mengatasi Error Blockhash di Solana
Apa Itu Blockhash?
Untuk memahami blockhash, Anda harus memahami slot dan blok terlebih dahulu.
- Slot adalah periode waktu ketika validator dapat menghasilkan blok
- Blok adalah kumpulan transaksi + metadata yang diproses oleh validator. Metadata di setiap blok menautkannya ke blok sebelumnya sehingga membentuk sebuah rantai.
Penting untuk dipahami bahwa slot berlangsung antara 400 hingga 600 milidetik dan dalam setiap slot, validator dapat mengusulkan blok baru. Jika blok tidak dibuat, nomor slot akan bertambah dan validator lain akan mencoba membuat blok baru. Artinya, tidak semua slot memiliki blok terkait, tetapi semua blok memiliki slot tempat blok tersebut diusulkan.
Jadi, apa itu blockhash? Blockhash adalah nilai hash unik dari semua entri ledger blockchain yang dibuat selama sebuah slot. Nilai ini dihitung dari ID entri terakhir blok. Setiap blok yang dihasilkan membuat blockhash unik. Blockhash ini digunakan sebagai cap waktu.
Apa saja tingkat komitmen Solana?
Konsep penting lain yang perlu dipahami adalah tingkat komitmen. Tingkat komitmen ini mengukur konfirmasi jaringan untuk blok tertentu. Tiga opsinya adalah processed, confirmed, dan finalized.
Saat validator mengirimkan blok ke chain, blok tersebut akan berada dalam status processed. Setelah jumlah validator yang diperlukan (66% validator) memberikan suara untuk menyertakan blok tersebut, blok akan ditambahkan ke chain dan tingkat komitmennya berubah menjadi confirmed. Setelah 31 blok tambahan dibangun di atas blok tersebut, tingkat komitmennya berubah menjadi finalized.
Mengapa error blockhash terjadi?
Semua transaksi menyertakan blockhash terbaru yang berfungsi sebagai cap waktu, dan transaksi tersebut kedaluwarsa ketika blockhash tidak lagi dianggap cukup baru. Validator yang memproses transaksi akan memeriksa “BlockhashQueue” (daftar 300 blockhash terakhir) untuk memastikan blockhash transaksi masih cukup baru. Jika blockhash tidak ada dalam daftar, transaksi akan ditolak. Karena slot biasanya berlangsung antara 400 hingga 600 milidetik, blockhash tetap valid selama 60–90 detik.
Blockhash not found (Transaction simulation failed: Blockhash not found)
Error “ Blockhash not found" terjadi ketika blockhash yang disertakan dalam transaksi dianggap tidak valid saat validator memproses transaksi. Penyebabnya bisa karena blockhash terlalu lama atau, dalam beberapa kasus, terlalu baru.
Penyebab paling umum error ini adalah blockhash yang disertakan dalam transaksi tidak ada dalam antrean 300 blockhash terakhir yang digunakan validator sebagai pembanding. Hal ini akan memicu error blockhash not found. Transaksi dapat kedaluwarsa ketika transaksi dibuat dan diproses dalam jangka waktu yang ditentukan. Hal ini dapat terjadi karena pengguna membutuhkan waktu lama untuk menandatangani transaksi. Ada juga situasi ketika transaksi yang valid dikirimkan, tetapi tidak disertakan dalam blok saat ini. Saat transaksi tersebut dapat disertakan dalam blok berikutnya, blockhash transaksi sudah terlalu lama.
Dalam situasi seperti ini, ketika transaksi secara efektif telah kedaluwarsa, error Block height exceeded (TransactionExpiredBlock heightExceededError) sering muncul. Untuk memahami error ini dengan lebih baik, Anda perlu memahami arti block height. Block height mengacu pada jumlah blok di bawah blok saat ini. Jika blok saat ini adalah blok 1000, block height-nya adalah 1000. Saat transaksi dibuat, block height maksimum yang berlaku untuk transaksi tersebut akan dicatat. Jika selama pemrosesan transaksi diketahui bahwa block height saat ini lebih tinggi daripada block height valid maksimum transaksi, error tersebut akan ditampilkan.
Situasi lain yang dapat menyebabkan “blockhash not found error” adalah ketika blockhash transaksi lebih baru daripada blockhash yang digunakan untuk memeriksa masa berlaku transaksi tersebut. Hal ini cukup membingungkan, jadi berikut contohnya: Anda membuat transaksi dan menyertakan blockhash untuk blok tertentu, misalnya blok 1000, lalu langsung mengirimkannya ke RPC. RPC mungkin mendapatkan blockhash untuk blok sebelumnya, yang dalam kasus ini dapat berupa blok 999 (karena RPC menggunakan tingkat komitmen yang lebih tinggi atau node RPC tertinggal dari jaringan). Akibatnya, blockhash dalam transaksi tidak akan ditemukan. Ini adalah situasi yang tidak biasa, tetapi dapat terjadi dalam dua skenario:
1. Tingkat komitmen tidak cocok
Saat transaksi dibuat, tingkat komitmen confirmed digunakan. Namun, saat RPC menghitung validitasnya, RPC secara default menggunakan komitmen finalized.
Hal ini dapat menyebabkan blockhash yang digunakan untuk pemeriksaan lebih lama daripada blockhash transaksi karena blok finalized berada 31 blok “di belakang” blok terbaru.
Jika tingkat komitmen processed digunakan untuk mengambil blockhash bagi transaksi pada fork minoritas yang akhirnya dibuang, blockhash tersebut akan menjadi tidak valid dan tidak akan ditemukan selama pemrosesan.
2. RPC tidak cocok
Jika dua RPC yang berbeda digunakan untuk mendapatkan blockhash dan mengirim transaksi, keterlambatan pada RPC yang mengirim transaksi dapat menyebabkan blok yang digunakannya untuk memeriksa validitas lebih lama daripada blok yang digunakan saat membuat transaksi.
Cara Memperbaiki Error Blockhash
Ada beberapa langkah yang dapat dilakukan untuk menangani setiap situasi yang disebutkan di atas.
1. Pastikan transaksi dikirimkan dengan blockhash yang tidak terlalu lama:
Gunakan tingkat komitmen confirmed saat mengambil blockhash untuk transaksi karena tingkat ini memastikan blockhash yang disertakan lebih baru dibandingkan tingkat komitmen finalized.
Anda juga dapat menggunakan tingkat komitmen processed untuk mendapatkan blockhash yang sedikit lebih baru, tetapi sekitar 5% blok processed tidak mencapai status finalized oleh cluster. Artinya, blockhash transaksi akan menjadi bagian dari fork yang dibuang dan tidak lagi valid.
2. Pastikan blockhash transaksi tidak lebih baru daripada blockhash yang digunakan untuk memeriksa validitas transaksi:
Selalu atur preflightCommitment (bahkan saat menggunakan skipPreflight) ke tingkat komitmen yang sama dengan yang digunakan untuk mengambil blockhash transaksi. Hal ini membantu Anda mencegah blockhash transaksi menjadi lebih baru daripada blockhash yang digunakan untuk memeriksa validitas transaksi.
Untuk menangani node RPC yang tertinggal saat mengirim transaksi, Anda perlu terus mengirim ulang transaksi ke RPC. Pengiriman ulang dapat dilakukan pada interval tertentu sehingga jika RPC tertinggal, RPC tersebut pada akhirnya akan menyusul dan mendeteksi bahwa transaksi telah kedaluwarsa.
Jika permintaan simulateTransaction digunakan, parameter replaceRecentBlockhash harus diatur. Flag ini menginstruksikan RPC untuk mengganti blockhash transaksi yang disimulasikan dengan blockhash yang akan selalu valid untuk simulasi.
3. Terus coba ulang transaksi selama blockhash masih valid:
Saat transaksi dibuat dan blockhash terbaru diambil, Anda harus mencatat lastValidBlockHeight untuk blockhash tersebut. Anda kemudian dapat terus mencoba ulang transaksi dengan blockhash tersebut hingga block height saat ini melampaui block height valid transaksi. Panggilan RPC getBlockHeight dapat digunakan untuk terus memeriksa apakah transaksi masih valid. Setelah block height saat ini lebih tinggi daripada height lastValidBlock transaksi, blockhash baru harus diambil dan digunakan.
Semoga postingan blog ini membantu Anda memahami error blockhash dengan lebih baik dan mengurangi frekuensi terjadinya error tersebut. Jika memiliki pertanyaan lebih lanjut, silakan bergabung dengan komunitas Discord kami atau kirimkan pesan langsung kepada kami di X.
Referensi Tambahan:
Artikel Terkait
Berlangganan Helius
Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan


