Lompat ke konten

Kondisi balapan persetujuan ERC-20

Pihak pembelanja ERC-20 dapat menggunakan allowance lama sebelum persetujuan penggantinya dikonfirmasi, lalu menggunakan allowance baru. Pelajari cara kerja balapan ini dan cara mengubah atau mencabut persetujuan dengan lebih aman.

Diperbarui

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

Jawaban langsung

Kondisi balapan persetujuan ERC-20 dapat terjadi ketika pemilik mengganti satu allowance bukan nol dengan allowance bukan nol lainnya melalui pemanggilan approve(spender, newAmount). Pihak pembelanja dapat melihat perubahan yang masih tertunda, menggunakan allowance lama terlebih dahulu dengan transferFrom, lalu menggunakan allowance pengganti setelah perubahan tersebut dikonfirmasi.

Karena itu, spesifikasi ERC-20 menyarankan agar antarmuka klien terlebih dahulu menetapkan allowance ke 0 sebelum menetapkan nilai baru untuk pihak pembelanja yang sama. Setiap transaksi harus dikonfirmasi secara berurutan. Jika suatu token mendukungnya, pemanggilan atomik increaseAllowance atau decreaseAllowance menghindari penggantian langsung atas allowance bukan nol.

Kondisi balapan persetujuan ERC-20
0 / 5
0 item yang ditinjau; 5 item yang masih belum terselesaikan

Menyelesaikan tinjauan ini tidak membuktikan suatu aset, transaksi, atau sistem aman.

Cara kerjanya

ERC-20 mendefinisikan approve sebagai penimpaan nilai: approve(spender, amount) yang berhasil akan menetapkan allowance pihak pembelanja menjadi amount. Secara terpisah, transferFrom(owner, recipient, amount) memungkinkan pihak pembelanja tersebut memindahkan token milik pemilik dan biasanya mengurangi allowance yang tersisa. Transaksi yang tertunda tidak menetapkan urutan eksekusi, sehingga pihak pembelanja dapat mengirim transfer yang dieksekusi sebelum perubahan persetujuan milik pemilik.

Transisi yang berisiko adalah N -> M, dengan N > 0 dan M > 0. Jika pihak pembelanja menghabiskan N sebelum persetujuan pengganti dieksekusi, persetujuan yang dieksekusi kemudian akan memasang allowance baru sebesar M. Karena itu, jumlah maksimum yang dibelanjakan dalam rangkaian tersebut dapat mencapai N + M, bergantung pada saldo token pemilik dan implementasi token.

Contoh

Alice telah menyetujui sebuah protokol untuk membelanjakan 100 token. Ia mengirim approve(protocol, 50) dengan tujuan menurunkan allowance yang tersisa menjadi 50. Sebelum transaksi itu dikonfirmasi, pihak pembelanja protokol mengirim transferFrom(Alice, recipient, 100) dan membuatnya dieksekusi lebih dahulu. Persetujuan Alice kemudian menetapkan allowance menjadi 50, yang dapat digunakan pihak pembelanja dalam transfer lain. Kedua transfer tersebut berjumlah 150 token.

Alur penggantian yang lebih aman adalah approve(protocol, 0), menunggu konfirmasi, memeriksa allowance dan saldo yang dihasilkan, lalu hanya mengirim approve(protocol, 50) jika persetujuan baru masih sesuai. Jika pihak pembelanja menggunakan allowance lama sebelum transaksi pengosongan dikonfirmasi, Alice dapat melihat perubahan saldo tersebut dan berhenti sebelum memberikan allowance baru sebesar 50.

Risiko

  • Menetapkan allowance ke 0 tidak membatalkan pembelanjaan yang sudah dieksekusi dan tidak mencegah penggunaan allowance lama sebelum transaksi pengosongan dikonfirmasi.
  • Mengirim persetujuan pengosongan dan penggantian secara bersamaan tanpa menunggu konfirmasi pertama akan menimbulkan kembali risiko urutan transaksi.
  • increaseAllowance dan decreaseAllowance bukan bagian dari standar dasar ERC-20; gunakan hanya jika kontrak token terverifikasi mendukungnya.
  • Allowance tanpa batas dapat mengekspos seluruh saldo token pemilik selama masih aktif. Verifikasi jaringan, kontrak token, pihak pembelanja, dan jumlah sebelum menandatangani.
  • Beberapa token memiliki perilaku persetujuan yang tidak standar. Baca simulasi dompet dan calldata transaksi, lalu konfirmasikan allowance on-chain setelah setiap langkah.

Kesalahpahaman umum

  • “Transaksi persetujuan terbaru langsung menggantikan yang lama.” Transaksi tersebut baru mengubah status ketika dieksekusi on-chain.
  • “Menurunkan allowance membatasi total pembelanjaan mendatang sebesar nilai baru.” Pihak pembelanja dapat menggunakan allowance lama sebelum perubahan dieksekusi.
  • “Mengosongkan terlebih dahulu menjamin tidak ada lagi token yang dapat keluar.” Allowance lama tetap dapat digunakan sampai transaksi pengosongan dikonfirmasi.
  • “Setiap ERC-20 memiliki increaseAllowance dan decreaseAllowance.” Keduanya merupakan ekstensi opsional, bukan persyaratan ERC-20.
  • “Mencabut koneksi situs web berarti mencabut persetujuan token.” Status koneksi dompet dan allowance on-chain dalam kontrak token merupakan hal yang terpisah.

Topik terkait

Sumber

Navigasi

Cari di wiki...