GasFree4you
Rekayasa teknis·8 menit baca

Error OUT OF ENERGY di TRON: postmortem insiden kami

Insiden 31 jam berdampak pada kurang dari 5% klien. Pelajari penyebab kegagalan transfer TRON, mekanisme Energy di java-tron, dan perbaikan kami.

klien terdampak
<5%
durasi insiden
31 jam
blockchain
TRON

Apa yang terjadi

Kami mendelegasikan Energy yang cukup untuk transfer, tetapi sebagian klien menerima FAILED — OUT OF ENERGY. Insiden berlangsung 31 jam dan berdampak pada kurang dari 5% klien. Postmortem GasFree4you ini menjelaskan perubahan siklus sewa, investigasi kami, dan alasan kami kembali menarik delegasi secara otomatis setelah transfer.

Kami bertanggung jawab atas siklus delegasi. Pilihan bagi klien untuk mengakhiri sewa sendiri seharusnya tidak membuat pesanan berikutnya kekurangan sumber daya.

Cara kerja penyewaan Energy kami

Kami mendelegasikan Energy selama satu jam. Sebelumnya, layanan menariknya segera setelah transfer; Energy yang tidak digunakan ditarik setelah satu jam.

Kemudian kami menyerahkan permintaan penarikan lebih awal kepada klien, ketika transfer selesai atau sumber daya tidak lagi dibutuhkan. Penarikan otomatis setelah satu jam tetap berlaku. Klien meminta penarikan melalui layanan; pemilik stake yang didelegasikan tetap menjalankan transaksi penarikan di blockchain.

Awalnya semua tampak berjalan baik. Namun, klien dapat membiarkan sewa lama tetap aktif dan membuat pesanan baru untuk alamat yang sama. Tumpang tindih kedua siklus inilah yang menjadi masalah.

Energy tersedia. Mengapa kemudian berkurang?

Laporan awal tampak bertentangan: jumlah delegasi cukup dan konsumsi kontrak transfer tidak berubah. Kami membuat alat analisis untuk merekonstruksi Energy yang tersedia pada setiap alamat dari waktu ke waktu.

Kekurangan itu nyata. Delegasi baru menyediakan sumber daya yang cukup, lalu batas satu jam pesanan lama memicu penarikan otomatis. Energy tersedia turun sebelum transfer berikutnya. Catatan bahwa kami baru saja memberikan sumber daya cukup tidak menggambarkan keadaan alamat saat eksekusi.

Urutan kejadian penyebab kegagalan

Urutan operasi pada alamat yang sama menjadi penentu. Pengatur waktu milik sewa lama mengubah sumber daya bersama yang akan digunakan transfer baru.

  1. 01 · Pesanan lama A didelegasikan
  2. 02 · Transfer selesai; klien tidak meminta penarikan A
  3. 03 · Pesanan baru B didelegasikan ke alamat yang sama
  4. 04 · A mencapai satu jam dan ditarik otomatis
  5. 05 · Energy tersedia turun sebelum transfer berikutnya

Cara kerja penarikan delegasi di java-tron

Kami menduga ada bug blockchain dan memeriksa kode Java TRON. Di UnDelegateResourceActuator.java, kami menemukan perhitungan proporsional transferUsage. Mekanisme ini belum diperhitungkan dalam logika pesanan kami.

Penarikan delegasi menghapus stake yang menopang Energy. Batas Energy berkurang sebesar kapasitas sumber daya terkait, sedangkan penggunaan tercatat hanya berkurang sebesar bagian yang dihitung, dibatasi kapasitas stake yang ditarik. Keduanya berbeda.

Penyebut getAllFrozenBalanceForEnergy() mencakup seluruh stake yang menopang Energy alamat: stake sendiri dan delegasi yang diterima, termasuk dari pemilik lain. Rumus ini tidak menandai penggunaan sebagai milik pesanan lama dan tidak mengisolasi pesanan baru sebagai sumber daya yang belum terpakai.

Java · UnDelegateResourceActuator

transferUsage = (long) (receiverCapsule.getEnergyUsage()
    * ((double) (unDelegateBalance) / receiverCapsule.getAllFrozenBalanceForEnergy()));
transferUsage = min(unDelegateMaxUsage, transferUsage);

Kode sumber TRON: java-tron · UnDelegateResourceActuator.java (ENERGY), java-tron · AccountCapsule.getAllFrozenBalanceForEnergy().

Contoh: pesanan baru, Energy tersedia lebih sedikit

Ambil dua delegasi sama besar, masing-masing 100 unit Energy ilustratif. Pesanan lama telah memakai 100 dan pesanan baru menambahkan 100. Sebelum penarikan, batas total 200, penggunaan tercatat 100, dan Energy tersedia 100.

Penarikan separuh stake mengurangi batas sebesar 100, tetapi penggunaan hanya sebesar 50: 100 × 1/2. Batas menjadi 100, penggunaan 50, dan hanya 50 yang tersedia. Panggilan berikutnya yang membutuhkan 80 tidak lagi memiliki sumber daya delegasi yang cukup.

Energy tersedia sebelum dan sesudah penarikan
Sebelum A ditarik
100
Setelah A ditarik
50

Panggilan berikutnya membutuhkan 80 unit ilustratif

Cara kami mengatasi insiden

Kami kembali menarik Energy melalui layanan segera setelah transfer. Kami tidak lagi menunggu permintaan klien atau berakhirnya satu jam sewa. Energy yang belum digunakan tetap memiliki masa sewa satu jam.

Ini menghapus ketergantungan pada tindakan klien untuk menutup sewa yang sudah digunakan. Pelajarannya: pengelolaan pesanan harus memperhatikan keadaan alamat dan urutan operasi di blockchain.

Pemeriksaan untuk FAILED — OUT OF ENERGY

Jika transfer USDT TRC-20 atau panggilan kontrak lain gagal dengan OUT OF ENERGY, pembelian Energy saja tidak menjelaskan hasilnya. Yang menentukan adalah sumber daya saat eksekusi.

  1. Cari TxID dan hasil eksekusi di TRONSCAN. Catat alamat pengirim dan urutan blok.
  2. Bandingkan delegasi dan penarikan, terutama sewa lama yang berakhir sebelum transfer. Sumber daya saat ini tidak menggantikan data historis.
  3. Periksa Energy tersedia, estimasi panggilan, fee_limit, dan apakah TRX dapat menutup kekurangan sumber daya. Pesan error yang sama belum tentu memiliki penyebab yang sama.
  4. Berikan TxID, alamat, dan waktu pesanan kepada dukungan. Investigasi tidak membutuhkan private key atau seed phrase.

Kode sumber TRON: TRON · FeeLimit and Energy cost, TRON · Transaction receipt.

Pelajaran untuk integrasi TRON

Insiden ini menguji pemahaman kami tentang sumber daya TRON. Pesanan terpisah dalam basis data layanan tidak menciptakan cadangan Energy yang terisolasi di blockchain.

Keahlian kami dalam pembayaran dan transfer berkembang melalui investigasi seperti ini: dari laporan klien dan rekonstruksi kejadian hingga pemeriksaan kode sumber dan perubahan perilaku layanan. Kami akan terus membagikan pembahasan teknis TRON melalui contoh konkret di blog.

Pertanyaan tentang OUT OF ENERGY

Mengapa Energy kurang setelah sewa baru?

Dalam insiden kami, delegasi lama ditarik setelah delegasi baru masuk. Ini mengurangi sumber daya bersama pada alamat sebelum transfer berikutnya.

Apakah seluruh jaringan TRON mengalami gangguan?

Tidak. Ini adalah insiden layanan kami yang berdampak pada kurang dari 5% klien. Kode sumber menjelaskan perilaku protokol, bukan membuktikan bug blockchain atau jaringan terhenti.

Apa yang berubah setelah investigasi?

Layanan kembali menarik Energy setelah transfer, tanpa menunggu permintaan klien atau akhir satu jam sewa.

← Semua artikel