Lompat ke konten

Cara memulihkan celah nonce dompet

Temukan nonce akun EVM pertama yang hilang, tentukan apakah perlu mengganti atau membatalkannya, dan cegah transaksi mengantre di berbagai dompet atau perangkat.

Diperbarui

Hanya untuk tujuan edukasi; bukan merupakan nasihat investasi atau rekomendasi investasi. Investasi dapat mengakibatkan kerugian.

Jawaban langsung

Pada chain yang kompatibel dengan EVM, transaksi dari satu externally owned account (EOA) dieksekusi menurut urutan nonce. Jika nonce berikutnya yang dapat dieksekusi hilang atau macet, transaksi dengan nonce lebih tinggi dapat tetap mengantre meskipun biayanya tinggi. Pulihkan nonce terendah yang belum selesai terlebih dahulu: pastikan chain dan pengirim, bandingkan data nonce terkonfirmasi dan pending, lalu ganti transaksi yang dimaksud atau lawan dengan transaksi pembatalan pada nonce yang sama.

Pembatalan bukan pembatalan balik pada tingkat protokol. Biasanya ini berupa transfer 0 ETH dari akun ke dirinya sendiri yang bersaing pada nonce yang sama. Transaksi valid yang lebih dahulu masuk blok akan menang; transaksi terkonfirmasi tidak dapat dibatalkan dengan cara ini.

Prosedur ini berlaku untuk transaksi EOA EVM biasa. Smart account atau operasi account abstraction dapat memakai skema nonce yang ditentukan kontrak, sedangkan jaringan UTXO memakai model transaksi lain.

Mengapa celah nonce memblokir antrean

Nonce EOA adalah penghitung berurutan. Hanya satu transaksi dapat dieksekusi pada setiap nonce, dan akun tidak dapat mengeksekusi nonce 26 sebelum nonce 25. Karena itu, node memisahkan transaksi yang langsung dapat dieksekusi dari nonce lebih tinggi yang mengantre untuk nanti.

Antrean bukan satu mempool global yang berwenang. Setiap node RPC melihat dan menyimpan subset transaksi pending yang berbeda. Transaksi dapat terlihat di dompet tetapi tidak di explorer, atau terlihat melalui satu RPC namun tidak melalui RPC lain. Transaksi mungkin belum pernah disiarkan, dibuang dari pool suatu node, atau belum menyebar ke layanan yang ditanya.

eth_getTransactionCount dengan latest mengembalikan jumlah pada status blok terbaru; untuk EOA, artikan sebagai nonce berikutnya setelah transaksi terkonfirmasi. Panggilan yang sama dengan pending meminta tampilan status pending dari satu node. Selisih menunjukkan bahwa node itu mengetahui transaksi pending, tetapi tidak membuktikan semua node publik mengetahuinya.

Diagnosis sebelum menandatangani

  1. Hentikan pengiriman dari alamat terdampak pada semua perangkat dan aplikasi. Catat jaringan, chain ID, alamat pengirim, hash transaksi, nonce, penerima, nilai, calldata, gas limits, dan kolom biaya.
  2. Pastikan dompet, explorer, dan RPC merujuk pada chain dan pengirim yang sama. Nonce milik akun pada satu chain, bukan instalasi dompet.
  3. Tanyakan eth_getTransactionCount dengan latest dan pending, sebaiknya melalui dua penyedia RPC independen. Anggap perbedaan sebagai bukti tampilan mempool berbeda, bukan bukti status on-chain tidak konsisten.
  4. Periksa transaksi pengirim menurut nonce. Jika tersedia, API transaction pool node membedakan entri pending yang dapat dieksekusi dari entri queued untuk nanti. Penyedia RPC publik sering menonaktifkan API nonstandar ini.
  5. Mulai dari nilai latest, cari nonce pertama tanpa transaksi terkonfirmasi. Tentukan apakah transaksi yang diketahui masih terlihat, telah dibuang, atau hanya dibuat secara lokal.

Jangan bertindak hanya berdasarkan label status dompet. Nonce terkonfirmasi, bukti transaksi, dan penyertaan blok pada chain yang benar merupakan bukti penentu.

Ganti atau batalkan nonce pertama yang belum selesai

Untuk mempertahankan tindakan asli: gunakan fitur percepat dompet atau siarkan kembali transaksi dengan pengirim, nonce, penerima, nilai, dan calldata yang sama tetapi biaya yang kompetitif. Periksa setiap kolom sebelum menandatangani; mengubah payload menjadikannya tindakan berbeda.

Untuk meninggalkan tindakan asli: selama belum terkonfirmasi, kirim 0 ETH dari alamat ke dirinya sendiri dengan nonce yang sama dan biaya kompetitif. Ini hanya mencoba memenangkan transfer ke diri sendiri. Transaksi asli masih dapat terkonfirmasi lebih dahulu; jangan anggap pembatalan berhasil sampai pengganti memiliki bukti dan transaksi asli tetap belum terkonfirmasi.

Penerimaan pengganti adalah kebijakan node, bukan persentase universal. Untuk transaksi EIP-1559, maxPriorityFeePerGas dan maxFeePerGas mungkin sama-sama perlu dinaikkan, dan maxFeePerGas harus tetap dapat dipakai pada base fee saat ini. Estimasi dompet dan aturan klien berbeda; replacement transaction underpriced berarti node penerima tidak menerima pengganti menurut kebijakan saat ini.

Setelah nonce terendah terkonfirmasi, periksa kembali bukti, latest, saldo, dan setiap transaksi ber-nonce lebih tinggi. Transaksi antrean dapat segera bisa dieksekusi, sedangkan yang dibuang semua node terkait mungkin perlu sengaja disiarkan kembali. Jangan kirim ulang tanpa pemeriksaan: pastikan dahulu salinan sebelumnya tidak masuk blok.

Contoh

Sebuah alamat memiliki transaksi terkonfirmasi hingga nonce 24, sehingga latest adalah 25. Satu RPC melaporkan pending sebagai 25, sedangkan dompet mencantumkan nonce 26 dan nonce 27 dalam antrean. Tidak ada penyedia yang menemukan transaksi siaran pada nonce 25.

Pemilik lebih dahulu memverifikasi chain, pengirim, dan payloads yang tercatat. Jika ada transaksi yang diinginkan pada nonce 25, pemilik menyusun dan menyiarkan kembali tindakan itu pada nonce 25 dengan biaya terkini. Jika tidak ada, pemilik dapat mengirim transfer 0 ETH ke diri sendiri pada nonce 25. Menaikkan biaya nonce 27 saja tidak menutup celah.

Setelah nonce 25 masuk blok, pemilik memeriksa buktinya sebelum menyentuh nonce 26 atau nonce 27. Keduanya ditinjau satu per satu karena mungkin telah dibuang atau segera dieksekusi setelah celah tertutup.

Risiko dan kondisi berhenti

  • Pengganti dapat berlomba dengan transaksi asli. Sampai ada bukti on-chain, asumsikan penerima, nilai, dan panggilan kontrak asli masih dapat dieksekusi.
  • Pastikan alamat pengirim lengkap, chain ID, nonce, dan calldata pada layar tepercaya. Malware atau situs “pemulihan” tidak tepercaya dapat menggantinya dengan transfer atau persetujuan.
  • Sisakan mata uang native yang cukup untuk biaya pengganti. Gas ditagih untuk transaksi yang masuk blok meskipun panggilan kontrak kemudian revert.
  • Jangan ungkapkan seed phrase atau private key untuk memulihkan celah nonce. RPC, explorer, atau petugas dukungan resmi tidak memerlukannya.
  • Jika alamat telah disusupi, pengganti publik berulang dapat menjadi perlombaan biaya dengan penyerang. Hentikan penggunaan perangkat yang disusupi dan ikuti rencana respons insiden.
  • Jika hasil RPC berbeda, penerima asli tidak diketahui, payload tidak dapat disusun kembali, atau interaksi kontrak besar dipertaruhkan, berhenti dan minta bantuan ahli sebelum menandatangani.

Untuk penggunaan berulang lintas perangkat atau penanda tangan otomatis, cegah kejadian ulang dengan satu pengalokasi nonce per akun dan chain, penandatanganan serial, catatan tahan lama atas nonce dan hash yang dipesan, serta rekonsiliasi terhadap status terkonfirmasi dan pending pool penyiar. Mereset riwayat lokal dompet tidak mengubah status on-chain atau mempool node lain.

Kesalahpahaman umum

  • “Biaya lebih tinggi pada nonce 27 dapat melewati nonce 25.” Itu baru dapat meningkatkan prioritas setelah nonce sebelumnya bisa dieksekusi; celahnya tidak diperbaiki.
  • “Tidak ditemukan berarti dibatalkan.” Satu node mungkin membuang transaksi sementara node lain, builder, atau pihak lawan masih memilikinya. Transaksi bertanda tangan dapat disiarkan kembali.
  • “Transfer 0 ETH ke diri sendiri membalikkan transaksi asli.” Transfer hanya bersaing pada nonce yang sama dan tidak berpengaruh setelah transaksi asli terkonfirmasi.
  • pending adalah jawaban akhir jaringan.” Itu adalah tampilan status pending node yang ditanya dan dapat berbeda antarpenyedia.

Topik terkait

Sumber

Navigasi

Cari di wiki...