Lompat ke konten

Penggantian transaksi di mempool Ethereum

Panduan dalam lingkup klien untuk penggantian transaksi Ethereum dari pengirim dan nonce yang sama, kenaikan batas biaya, perlombaan pembatalan, transaksi blob, jalur privat, tanda terima, dan finalitas.

Diperbarui

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

Jawaban langsung

Penggantian transaksi Ethereum adalah kebijakan lokal pool transaksi yang memungkinkan sebuah node memilih transaksi yang baru ditandatangani daripada kandidat lain dari pengirim yang sama dengan nonce yang sama. Ini bukan sakelar Replace-by-Fee global pada tingkat konsensus. Penerimaan hash baru oleh satu node tidak menghapus transaksi lama yang telah ditandatangani dari node lain, relay privat, atau masukan pembuat blok. Hanya inklusi di rantai kanonis yang menentukan kandidat mana yang memakai nonce akun.

Tindakan Percepat pada dompet biasanya mempertahankan tujuan, nilai, dan calldata asli sambil menaikkan kolom biaya. Tindakan Batalkan melalui pool publik biasanya membuat transfer bernilai nol ke alamat sendiri dengan pengirim dan nonce yang sama. Transaksi ini adalah pesaing, bukan operasi pembatalan yang membalik keadaan: jika transaksi asli masuk lebih dahulu, transfer atau pemanggilan kontraknya tidak dibatalkan. Jalur privat tertentu dapat mendefinisikan API pembatalan berbeda; misalnya, Flashbots Protect mendokumentasikan pembatalan autentikasi yang tidak dimasukkan ke rantai. Mekanisme itu tidak boleh digeneralisasi sebagai penggantian transaksi Ethereum publik.

Cara kerja

  1. Tetapkan seluruh riwayat kandidat secara tepat: chain ID, klien dan versinya, blok kepala dan biaya dasar, jalur pengiriman, pengirim, nonce akun kanonis, byte mentah bertanda tangan dari transaksi asli, hash, dan jenis transaksi. Periksa beberapa tampilan publik atau privat yang relevan; label dompet atau satu respons RPC bukan keadaan global.
  2. Klasifikasikan transaksi asli secara tepat sebagai ditolak, tertunda secara lokal, mengantre di belakang celah nonce, dibuang atau dikeluarkan, dikirim secara privat, masuk dan berhasil, masuk dengan status = 0, dihapus oleh reorganisasi, atau sudah final. Jangan menganggap penggantian masih tersedia setelah nonce dipakai secara kanonis, walaupun reorganisasi dapat membuka kembali perlombaan.
  3. Tentukan maksud baru. Percepatan harus mereproduksi setiap kolom semantik yang dimaksud; upaya pembatalan publik biasanya memakai pengirim dan nonce yang sama dengan to = sender, value = 0, dan calldata kosong. Bandingkan chain ID, jenis, tujuan, nilai, calldata, daftar akses, batas gas, hash blob, serta otorisasi sebelum menandatangani.
  4. Baca kebijakan penggantian aktual dari node sasaran. Transaksi lama dan jenis 1 memakai gasPrice; jenis 2 memiliki maxFeePerGas dan maxPriorityFeePerGas; jenis 3 juga memiliki maxFeePerBlobGas serta memerlukan sidecar. Nilai bawaan Geth saat ini, txpool.pricebump = 10 untuk pool biasa dan blobpool.pricebump = 100 untuk pool blob, adalah contoh konfigurasi Geth, bukan konstanta seluruh Ethereum.
  5. Hitung kelayakan dan pendanaan secara terpisah dari kenaikan biaya. Untuk jenis 2, harga efektif adalah min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas). Kandidat tetap memerlukan enkode yang valid, gas intrinsik yang cukup, serta saldo untuk menutup nilai ditambah eksposur biaya maksimum. Batas yang lebih tinggi tidak memperbaiki calldata yang tidak valid atau menjamin eksekusi EVM berhasil.
  6. Kirim secara terencana dan simpan setiap respons. Penyiaran ulang ke publik dapat mengungkap niat dan MEV; relay privat memiliki cakupan visibilitas, pembatalan, pembuat blok, dan ketersediaannya sendiri. Lacak hash lama dan baru pada setiap jalur tanpa menganggap penerimaan lokal telah menghapus pesaing, serta jangan mengirim kandidat ketiga yang memindahkan nilai secara membabi buta.
  7. Rekonsiliasi pemenang dengan rantai kanonis. Verifikasi blok dan hash tanda terima, indeks transaksi, status, gas terpakai, harga gas efektif, log, nonce pengirim, saldo, dan keadaan kontrak pada tingkat finalitas yang dibutuhkan. Catat hash yang kalah sebagai digantikan, dibuang, atau masih teramati sesuai bukti, lalu ulangi analisis setelah reorganisasi.

Contoh terhitung

  • Kenaikan pembelajaran untuk jenis 2 biasa. Kandidat lama memiliki maxFeePerGas = 40 gwei dan maxPriorityFeePerGas = 2 gwei. Dalam konfigurasi pembelajaran Geth dengan kenaikan 10%, ambang aritmetisnya adalah 44 gwei dan 2.2 gwei. Kandidat 44/2.1 gwei tidak mencapai ambang tip; 44/2.2 gwei mencapai kedua ambang pembelajaran. Dengan biaya dasar 32 gwei dan gas terpakai 21,000, harga efektifnya 34.2 gwei, biaya total 718,200 gwei = 0.0007182 ETH, pembakaran biaya dasar 0.000672 ETH, dan tip 0.0000462 ETH. Penerimaan aktual bergantung pada implementasi, versi, dan pembulatan wei bilangan bulat.
  • Sensitivitas biaya dasar. Penggantian memiliki batas 66/4.4 gwei. Pada biaya dasar 60 gwei, harga efektifnya min(66, 60 + 4.4) = 64.4 gwei. Pada biaya dasar 65 gwei, harga efektifnya 66 gwei dan tip efektif hanya 1 gwei. Pada biaya dasar 67 gwei, berlaku 66 < 67, sehingga kandidat tidak layak di bawah batas tersebut meskipun lolos uji kenaikan lokal.
  • Perlombaan pembatalan. Transaksi asli dengan nonce 20 mengirim 5 ETH ke pedagang. Jika transaksi asli menang dengan biaya 21,000 * 42 gwei = 0.000882 ETH, pedagang menerima 5 ETH dan transaksi pembatalan menjadi nonce-terlalu-rendah. Jika transfer bernilai nol ke alamat sendiri menang dengan biaya 21,000 * 45 gwei = 0.000945 ETH, transaksi itu memakai nonce 20 dan mencegah transaksi asli masuk kemudian ke riwayat kanonis yang sama. Hasilnya tidak dapat diketahui hanya dari klik tombol Batalkan.
  • Batas pool blob. Kandidat lama jenis 3 mempunyai batas biaya eksekusi 100 gwei, batas tip 3 gwei, dan batas biaya blob 20 gwei. Dalam konfigurasi pembelajaran pool blob Geth dengan kenaikan 100%, ambang aritmetisnya 200/6/40 gwei. Kandidat 200/6/39 gwei tidak mencapai batas blob; 200/6/40 gwei mencapai ketiga ambang pembelajaran, tetapi tetap memerlukan sidecar, nonce, saldo, dan penerimaan pool yang valid. Angka ini bukan aturan transaksi biasa atau klien lain.

Risiko

  • Memilih chain ID atau jaringan yang salah.
  • Memilih pengirim atau nonce akun yang salah.
  • Memakai blok kepala, biaya dasar, atau nonce kanonis yang usang.
  • Mencoba mengganti setelah transaksi asli masuk atau menjadi final.
  • Menerapkan aturan txpool biasa pada UserOperation ERC-4337.
  • Menganggap klien, penyedia, versi, atau konfigurasi lain memakai kebijakan yang sama.
  • Gagal memenuhi ambang kenaikan akibat pembulatan wei bilangan bulat.
  • Menaikkan hanya satu kolom biaya EIP-1559 yang diwajibkan.
  • Menetapkan maxFeePerGas di bawah biaya dasar blok kandidat.
  • Mengabaikan batas biaya blob, sidecar, atau aturan khusus pool blob.
  • Saldo tidak cukup untuk nilai dan biaya maksimum yang diotorisasi.
  • Tanda tangan, jenis, enkode, gas intrinsik, atau domain jaringan tidak valid.
  • Tidak sengaja mengubah tujuan, nilai, calldata, daftar akses, atau hash blob.
  • Transaksi pembatalan publik kalah dalam perlombaan inklusi.
  • Transaksi lama tetap berada pada node lain atau masukan pembuat blok.
  • Relay privat membocorkan, menyensor, membuang, atau gagal membatalkan pengiriman.
  • Penyiaran ulang publik mengungkap niat kepada frontrunning, serangan sandwich, atau MEV lain.
  • Celah nonce memblokir transaksi kemudian atau memicu transfer duplikat.
  • Penggantian masuk tetapi revert atau kehabisan gas sambil memakai nonce dan biaya.
  • Kesalahan reorganisasi, finalitas, atau riwayat tanda terima menghidupkan kembali atau salah mengklasifikasikan kandidat.

Kesalahpahaman umum

  • Kandidat berbiaya lebih tinggi menghapus transaksi lama secara global.
  • Dua transaksi dengan angka nonce sama saling menggantikan meski pengirimnya berbeda.
  • Tombol Batalkan pada dompet membalik transaksi yang sudah masuk.
  • Penerimaan penggantian oleh satu node membuktikan pembuat blok akan memasukkannya.
  • Aturan kenaikan 10% universal mencakup semua klien, transaksi blob, relay privat, dan UserOperation.

Topik terkait

Sumber

Navigasi

Cari di wiki...