Mainnet Beta Stall — Postmortem

Solana Indonesia
5 min readDec 23, 2020

--

Pada hari Jumat, 4 Desember pukul 20:46 WIB, jaringan Beta Mainnet Solana menghentikan konfirmasi block baru, yang mengakibatkan pemadaman sementara. Tim developer inti dan komunitas validator Solana segera bertindak dan berhasil memulai ulang jaringan dalam waktu 6 jam. Prestasi ini membutuhkan konsensus dari 393 validator di banyak zona waktu berbeda; sementara komunitas dengan cepat mendiagnosis masalah tersebut, sebagian besar waktu pemadamaan disebabkan karena menunggu stake weight yang cukup untuk kembali online.

Untuk lebih jelasnya, tidak ada dana yang terancam akibat penghentian jaringan, dan tidak ada exchang trading terdesentralisasi yang berisiko karena reboot. Seperti disebutkan sebelumnya, jaringan Solana menyematkan bendera Beta untuk menunjukkan bahwa jaringan tersebut masih baru.

Penyebab

Validator mem-boot dua mesin mereka dan mulai mentransmisikan beberapa block berbeda untuk slot yang sama, akhirnya membuat 3 partisi jaringan minoritas yang belum dikonfirmasi. Serangkaian upaya propagasi block simultan yang sangat spesifik ini menyebabkan jaringan terhenti karena partisi tidak dapat mengunduh block berbeda yang disarankan satu sama lain. Kemacetan ini terjadi karena masalah yang terjadi di jalur propagasi/perbaikan block yang mana block duplikat untuk slot yang sama tidak dapat diperbaiki antar partisi. Jika partisi serupa dibuat oleh pemimpin yang sama, dengan waktu yang sama, pola voting yang sama oleh semua validator, tapi pada dua slot yang berbeda, jaringan pada akhirnya akan memperbaiki block yang hilang di semua partisi dan konsensus akan mampu beroperasi. Demikian pula, jika ada satu block rusak yang diproduksi oleh pemimpin, jaringan akan berhasil mengenalinya dan tidak memasukkannya dalam konsensus.

Untuk lebih jelasnya: kesalahan ini disebabkan oleh masalah yang sebelumnya diketahui dalam kode perbaikan dan pemrosesan block. bug ini dipicu karena bug yang sebelumnya tidak dikenali di Turbine dan bagaimana bug ini menyebarkan kesalahan ini. Secara umum, algoritma konsensus Solana, dan jaringan seperti yang telah berfungsi, sepenuhnya mampu menangani block yang hilang atau rusak yang disarankan oleh pemimpin, tidak membuat asumsi mengenai pemimpin yang tidak salah, dan menangani perselisihan konsensus hingga ⅓ dari kesalahan validator.

Ini adalah masalah ketersediaan data pada Mainnet Beta yang dapat menyebabkan kesalahan.

Bug Ketersediaan Data

Struktur data internal yang melacak block dan status yang dihitung untuk block itu menggunakan nomor slot PoH, yang merupakan u64, sebagai pengidentifikasi untuk status dan block yang menempati slot itu. Ini adalah pemetaan salah yang sudah ada jauh sebelum Mainnet Beta diluncurkan dan kami sedang dalam proses memfaktorkannya.

Validator yang mengirimkan dua block berbeda berhasil menyebarkan block ke dua partisi berbeda, A dan B, sementara partisi ketiga mendeteksi kesalahan. ke 3 partisi ini adalah partisi minoritas, tidak ada yang cukup berbobot untuk mencapai konsensus sendiri. Setelah tiga partisi dibuat, node di partisi yang berbeda tidak dapat memperbaiki dan mengunduh block A, B dari satu sama lain, karena kode intake block mereka tidak dapat membedakan block A dengan block B untuk slot yang sama menyebabkan setiap partisi yang memiliki blok A atau blok B untuk mengasumsikan bahwa sisi lain memiliki block yang sama. Karena transisi status berbeda, semua fork yang ada di block pada slot 53180935 ditolak oleh partisi lain.

Konsensus vs Ketersediaan Data

Tower, algoritma konsensus Solana, toleran terhadap fork yang dihasilkan oleh pemimpin tunggal untuk slot yang sama. Toleransi terhadap voting validator yang berbeda pada fork yang berbeda, block yang hilang, kedatangan fork di slot atau time ordering apa pun dan akhirnya terjadi status yang konsisten, selama kurang dari ⅓ validator melakukan kesalahan.

Kegagalan Turbin yang Tak Terduga

Turbin adalah protokol propagasi block yang memiliki probabilitas tinggi untuk berhasil menyebarkan block dan kesalahan dalam berbagai kondisi jaringan yang berlawanan. Inilah yang memungkinkan Mainnet Beta menangani 50 juta block dan 7 miliar transaksi ( 20% yang merupakan transaksi aplikasi pihak ketiga) sejak Maret. Sejauh yang kami tahu, Solana telah menangani lebih banyak transaksi berturut-turut tanpa henti daripada blockchain publik lainnya. Dengan probabilitas tinggi, Turbin memungkinkan sebagian besar validator untuk mengamati setidaknya beberapa shred duplikat untuk block yang sama sebelum divoting, memungkinkan jaringan untuk melepaskan block yang salah secara real-time sebelum voting. Selama Mainnet Beta, jaringan telah turun lebih dari 3 juta block karena kegagalan dan partisi produsen block, termasuk kejadian serupa yang menyebabkan penghentian pada 4 Desember. Meskipun Turbin memiliki tingkat keberhasilan yang tinggi, itu tidak memberikan jaminan bahwa semua kesalahan disebarkan sebelum partisi dapat dibuat. Tower dirancang untuk menangani hingga ⅓ kesalahan validator berdasarkan stake weight terlepas dari apakah Turbin berhasil atau tidak menanganinya.

Kegagalan ini disebabkan oleh pengoptimalan di Turbin. Turbin berhenti menyebarkan shred untuk slot yang sama dan shred indeks hanya sekali dari block mana pun per validator. Perbaikan untuk kegagalan ini dapat telusuri di sini.

Pemulihan

Validator berhenti menghasilkan root setelah slot 53180900, dan block terakhir yang dikonfirmasi secara optimis ada di slot 53180935. 32 block antara slot 53180900 dan 53180935 tidak berisi transfer. Satu-satunya transaksi non-voting di block tersebut adalah Serum “market cranks”, yang memeriksa apakah ada trading yang mungkin di lakukan, tapi tidak ditradingkan sendiri; hasil dari crank ini bersifat deterministik dan pada akhirnya akan menghasilkan hasil yang sama persis, apa pun yang terjadi. Kebetulan perdagangan Serum terakhir ada di slot 53180900. Setelah diskusi, komunitas validator merasa nyaman menggunakan prosedur pemulihan yang telah teruji yang menggunakan slot yang di-root sebagai titik hard fork dan pada akhirnya mencapai konsensus untuk melanjutkan propagasi jaringan pada slot 53180900, kehilangan optimisme status yang dikonfirmasi hingga slot 53180935. Partner utama kami, termasuk Serum diberitahu sebelum hard fork terjadi dan tidak keberatan. Jika ada transfer, trading, atau transaksi lain selain voting dan crank kosong di antara slot 53180900 dan 53180935, kami akan memulihkan jaringan dengan semua block yang dikonfirmasi secara optimis juga, tapi memilih untuk menghindari risiko operasional yang tidak perlu.

Resolusi

Resolusi ada dalam beberapa tahap:

  1. Memperbaiki Turbin yang akan membuat deteksi kesalahan dapat dilakukan lebih awal. Ini bukan perbaikan menyeluruh tapi meningkatkan kemungkinan deteksi awal untuk jenis partisi ini. Telah dikirimkan sebagai update 1.4 mainnet beta.
  2. https://github.com/solana-labs/solana/pull/13992
  3. https://github.com/solana-labs/solana/pull/13976
  4. Sebarkan kesalahan pertama yang terdeteksi melalui gosip. Ini bukan perbaikan menyeluruh, tapi karena Turbin hanya mengirimkan data sekali tanpa berhenti, pada akhirnya gosip akan menyebarkan kesalahan ke semua validator.
  5. Perbaiki layanan, replay, blocktree, dan bankforks untuk melacak block dengan hash, bukan nomor slot. Ini adalah perbaikan menyeluruh. Jika sejumlah block untuk slot yang sama membuat partisi, mereka diperlakukan tidak berbeda dari partisi dengan block yang menempati slot berbeda. Node akan dapat memperbaiki semua kemungkinan fork dan konsensus akan dapat menyelesaikan partisi.
  6. https://github.com/solana-labs/solana/pull/9698
  7. https://github.com/solana-labs/solana/pull/13995
  8. Pengoperasian pemulihan TdS yang mencakup block optimis. Pastikan komunitas validator kami memiliki pengalaman operasional dalam menangani prosedur reboot baru yang tidak melakukan hardfork pada block yang dikonfirmasi secara optimis.

Fase pertama telah dirilis sebagai bagian dari 1.4 upgrade ke mainnet-beta. Exchange dan partner lainnya berjalan seperti biasa. Kami memperkirakan patch pertama akan diluncurkan dalam waktu seminggu, dan pemfaktoran ulang berikutnya akan mengambil siklus rilis penuh.

Kami ingin mengucapkan terima kasih SEBESAR-BESARNYA kepada lebih dari 390 validator yang pada hari Jumat menanggapi dengan cepat, bergabung dengan diskusi komunitas, dan mencapai lebih dari 80% konsensus jaringan untuk membantu membuat jaringan kembali aktif dan berjalan secepat mungkin. Ini adalah properti yang disayangkan dari algoritma konsensus terdistribusi bahwa mengidentifikasi bug tidak cukup untun mem-backup jaringan, tapi tidak dapat dipisahkan dari desentralisasi dan tahan sensor sebagai definisi blockchain.

Kesimpulan

Kami berterima kasih atas dukungan di Twitter dan dari komunitas Solana global. Komunitas bersatu dalam situasi yang sulit, dan jaringan Solana sekarang lebih tangguh daripada sebelum adanya bug.

Kami meluncurkan Mainnet Beta karena kami memiliki tingkat kepercayaan yang tinggi terhadap keamanan sistem, kinerja, dan algoritma konsensus. Kami tahu ada kemungkinan untuk terjadinya bug yang dapat menyebabkan kegagalan. Ketiga partisi tersebut, meskipun ada, tidak di-root atau dikonfirmasi secara optimis oleh Tower, jadi mereka tidak menyelesaikan transaksi apa pun. Semua dana aman.

--

--

Solana Indonesia
Solana Indonesia

Written by Solana Indonesia

Pembaruan, pengumuman, dan penjelasan; Pelajari lebih lanjut tentang teknologi, validator, partner dan komunitas Solana.

No responses yet