Saya ingin berbagi sesuatu yang cukup penting yang mungkin belum sepenuhnya Anda pahami - yaitu celah reentrancy dalam smart contract. Jika Anda sedang mengembangkan dapp atau bekerja dengan blockchain, hal ini adalah hal yang harus diketahui.



Apa masalah dasar dari reentrancy? Itu terjadi ketika sebuah smart contract memanggil kontrak lain, dan kontrak tersebut dapat memanggil kembali kontrak asal saat masih berjalan. Penyerang dapat memanfaatkan waktu ini untuk mencuri uang.

Bayangkan ContractA memiliki 10 Ether dan ContractB telah mengirimkan 1 Ether ke sana. Ketika ContractB memanggil fungsi penarikan, ContractA akan memeriksa apakah saldo lebih besar dari 0, jika ya, maka mengirim Ether kembali. Tapi di sini adalah masalah - ContractA hanya memperbarui saldo setelah mengirim uang. Jadi saat pengiriman, jika ContractB memiliki fungsi fallback, ia bisa memanggil kembali fungsi penarikan ContractA. Karena saldo belum diperbarui, pemeriksaan akan berhasil lagi, dan ia akan menerima 1 Ether lagi. Loop ini berlanjut sampai ContractA kehabisan semua.

Saya akan tunjukkan tiga cara untuk melindungi kontrak dari serangan reentrancy ini.

Cara pertama adalah menggunakan modifier nonReentrant. Ide dasarnya sangat sederhana - Anda mengunci kontrak saat fungsi sedang berjalan. Jika ada yang mencoba memanggil fungsi tersebut lagi, akan ditolak karena kontrak sedang terkunci. Anda harus menjalankan seluruh kode lalu membuka kunci, dan saat itu pemeriksaan akan gagal.

Cara kedua adalah menggunakan pola Checks-Effects-Interactions. Alih-alih memperbarui saldo setelah mengirim uang, Anda memperbaruinya segera setelah pemeriksaan tetapi sebelum pengiriman. Dengan cara ini, bahkan jika kontrak lain memanggil kembali, saldo sudah menjadi 0, sehingga pemeriksaan akan gagal. Itulah mengapa urutan sangat penting - pemeriksaan dulu, lalu efek diperbarui, terakhir berinteraksi dengan kontrak lain.

Cara ketiga adalah membuat sebuah GlobalReentrancyGuard terpisah, yang sangat berguna jika Anda memiliki banyak kontrak yang berinteraksi satu sama lain. Alih-alih melindungi setiap fungsi, Anda membuat sebuah kontrak guard bersama, menyimpan status kunci di satu tempat. Ketika kontrak mana pun mencoba memanggil fungsi yang dilindungi, ia akan memeriksa dengan guard ini. Jika guard mengatakan kontrak sedang terkunci, transaksi akan ditolak. Cara ini sangat kuat karena mencegah reentrancy tidak hanya dalam satu kontrak tetapi juga antar banyak kontrak.

Saya menyarankan Anda menerapkan ketiga teknik ini sesuai situasi. Untuk fungsi penarikan atau transfer aset, selalu gunakan nonReentrant atau Checks-Effects-Interactions. Dan jika proyek Anda memiliki sistem kontrak yang kompleks, pertimbangkanlah GlobalReentrancyGuard sebagai lapisan perlindungan tambahan.

Ini adalah salah satu celah paling umum yang menyebabkan kerugian besar, jadi memahami reentrancy sangat penting jika Anda ingin menulis smart contract yang aman.
XCH4,15%
TRA-1,84%
XEM-0,23%
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
  • Hadiah
  • Komentar
  • Posting ulang
  • Bagikan
Komentar
Tambahkan komentar
Tambahkan komentar
Tidak ada komentar
  • Disematkan