Pengendalian Ralat dengan Revert/Require
Laksanakan strategi pengendalian ralat yang berkesan menggunakan `require()`, `revert()` dan `assert()` untuk pelaksanaan kontrak yang kukuh.
Pengendalian Ralat dengan Revert/Require ialah pelajaran Kontrak Pintar Rantaian Blok dengan Solidity percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kontrak Pintar Rantaian Blok dengan Solidity, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kontrak Pintar Rantaian Blok dengan Solidity merangkumi sejumlah 4 pelajaran.
Kontrak Kukuh: Pengendalian Ralat
Selamat datang ke pengendalian ralat dalam Solidity! Penulisan kontrak pintar memerlukan ketelitian yang tinggi kerana kontrak ini sering mengurus aset bernilai dan tidak boleh diubah selepas digunakan.
Pengendalian ralat yang berkesan amat penting untuk mencipta aplikasi terdesentralisasi (dApps) yang kukuh dan selamat. Pengendalian ini membantu mencegah tingkah laku yang tidak dijangka serta melindungi pengguna.
`require()`: Mengesahkan Input
Fungsi require() ialah alat utama anda untuk mengesahkan syarat yang mesti benar sebelum fungsi dilaksanakan.
- Fungsi ini menyemak prasyarat dan input pengguna.
- Jika syarat adalah palsu, fungsi ini mengembalikan semua perubahan keadaan yang dibuat dalam transaksi semasa.
- Fungsi ini memulangkan gas yang masih berbaki kepada pemanggil, sekali gus membatalkan transaksi.
Gunakan require() untuk syarat luaran dan semakan data yang diberikan pengguna.
`require()` dalam Tindakan
Mari kita lihat require() dalam kontrak ringkas. Fungsi ini hanya membenarkan pengguna berumur lebih daripada 18 tahun mendaftar.
pragma solidity ^0.8.0;
contract UserRegistration {
uint public minAge = 18;
address[] public registeredUsers;
function registerUser(uint _age) public {
// Validate user input: age must be at least minAge
require(_age >= minAge, "Must be 18 or older to register.");
registeredUsers.push(msg.sender);
}
}`revert()`: Pengendalian Ralat Fleksibel
Pernyataan revert() menawarkan lebih banyak fleksibiliti berbanding require(), khususnya apabila anda perlu mengendalikan logik ralat yang kompleks atau menggunakan jenis ralat tersuai.
- Seperti
require(), fungsi ini mengembalikan semua perubahan keadaan dan memulangkan gas. - Fungsi ini sering digunakan dalam pernyataan
ifuntuk semakan bersyarat yang lebih terperinci. - Fungsi ini boleh dipanggil secara langsung atau dengan mesej rentetan, sama seperti
require().
Ralat Tersuai dengan `revert()`
Solidity 0.8.4 dan versi lebih baharu memperkenalkan Ralat Tersuai. Ralat ini lebih cekap dari segi gas berbanding mesej rentetan dan memberikan kejelasan yang lebih baik untuk aplikasi luar rantaian.
Anda mentakrifkan ralat tersuai pada peringkat kontrak atau fail, kemudian menggunakannya dengan revert(). Ralat ini membantu mengurangkan kos transaksi dan meningkatkan kebolehbacaan kontrak.
Demonstrasi Ralat Tersuai
Berikut ialah cara mentakrifkan dan menggunakan ralat tersuai dengan revert(). Perhatikan kata kunci error.
pragma solidity ^0.8.4;
contract Wallet {
address public owner;
uint public balance;
// Define a custom error
error InsufficientFunds(uint requested, uint available);
constructor() {
owner = msg.sender;
}
function deposit() public payable {
balance += msg.value;
}
function withdraw(uint _amount) public {
require(msg.sender == owner, "Only owner can withdraw.");
// Use revert() with the custom error
if (_amount > balance) {
revert InsufficientFunds(_amount, balance);
}
balance -= _amount;
payable(owner).transfer(_amount);
}
}`assert()`: Invarian Dalaman
Fungsi assert() digunakan untuk tujuan yang sangat khusus: menyemak invarian dalaman.
- Fungsi ini mengesahkan syarat yang tidak sepatutnya pernah palsu jika kod anda berfungsi dengan betul.
- Jika
assert()gagal, hal ini menunjukkan terdapat pepijat dalam logik kontrak anda. - Yang penting,
assert()yang gagal menggunakan semua gas yang masih berbaki, tidak sepertirequire()danrevert()yang memulangkan gas.
Gunakan assert() untuk syarat selepas pelaksanaan atau semakan ketekalan dalaman, bukan untuk mengesahkan input pengguna.
Bila Perlu Menggunakan Setiap Satu?
Memilih pengendali ralat yang tepat adalah penting:
require(): Untuk mengesahkan input pengguna, syarat luaran atau perubahan keadaan sebelum pelaksanaan. Memulangkan gas.revert(): Untuk logik ralat yang lebih kompleks, selalunya bersama ralat tersuai. Turut memulangkan gas.assert(): Untuk semakan ketekalan dalaman dan invarian. Menunjukkan pepijat jika gagal dan menggunakan semua gas.
Utamakan require() dan revert() untuk ralat yang dijangka, dan simpan assert() untuk ralat dalaman yang tidak dijangka.
Semakan Pengendalian Ralat
Anda sedang membina fungsi yang memindahkan token. Sebelum menghantar token, anda perlu memastikan pengirim mempunyai baki yang mencukupi. Jika tidak, transaksi itu harus gagal dan memulangkan gas yang tidak digunakan.
Ringkasan: Pengendalian Ralat
Anda telah belajar menjadikan kontrak Solidity anda kukuh melalui pengendalian ralat yang betul:
require()digunakan untuk mengesahkan syarat luaran dan input pengguna.revert()memberikan fleksibiliti dan sering digunakan bersama ralat tersuai yang cekap dari segi gas.assert()digunakan untuk invarian dalaman dan menandakan pepijat jika gagal.
Menguasai perkara ini memastikan kontrak pintar anda selamat dan boleh dijangka. Syabas!
Pelajari Kontrak Pintar Rantaian Blok dengan Solidity dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Pengendalian Ralat dengan Revert/Require” percuma?
Ya — teks penuh “Pengendalian Ralat dengan Revert/Require” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Kontrak Pintar Rantaian Blok dengan Solidity, tingkat taraf kepada CoddyKit PRO. Kursus Kontrak Pintar Rantaian Blok dengan Solidity merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengendalian Ralat dengan Revert/Require”?
Laksanakan strategi pengendalian ralat yang berkesan menggunakan `require()`, `revert()` dan `assert()` untuk pelaksanaan kontrak yang kukuh. Anda berlatih Kontrak Pintar Rantaian Blok dengan Solidity menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kontrak Pintar Rantaian Blok dengan Solidity?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kontrak Pintar Rantaian Blok dengan Solidity di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Pengendalian Ralat dengan Revert/Require” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kontrak Pintar Rantaian Blok dengan Solidity ini?
Ya. Setiap pelajaran Kontrak Pintar Rantaian Blok dengan Solidity menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pewarisan dan Antara Muka
- Pustaka dan Kontrak Abstrak
- Pengendalian Ralat dengan Revert/Require
- Pengubah Suai dan Corak Semakan-Kesan-Interaksi