Study
Solidity

Error Handling: require, revert, assert

Penjelasan

Solidity punya tiga cara membatalkan eksekusi: `require(kondisi, "pesan")` untuk memvalidasi INPUT/kondisi eksternal (paling sering dipakai, mis. mengecek saldo cukup), `revert("pesan")` untuk membatalkan dengan kondisi lebih kompleks (bisa dipakai di dalam if tanpa kondisi boolean tunggal), dan `assert(kondisi)` untuk mengecek INVARIANT internal yang SEHARUSNYA tidak pernah salah (kalau assert gagal, itu tanda ada BUG di kode, bukan kesalahan pengguna). Ketiganya membatalkan SEMUA perubahan state dalam transaksi itu (rollback penuh) kalau gagal.

Contoh Konsep

contract Dompet {
    mapping(address => uint256) public saldo;

    function tarik(uint256 jumlah) public {
        require(saldo[msg.sender] >= jumlah, "Saldo tidak cukup");   // validasi input
        saldo[msg.sender] -= jumlah;

        if (jumlah == 0) {
            revert("Jumlah tidak boleh nol");   // kondisi lebih kompleks
        }

        assert(saldo[msg.sender] >= 0);   // invariant: saldo tidak boleh negatif (uint sudah menjamin ini)
    }
}

Praktikum

Buat function beli(uint256 hargaBarang) yang menerima parameter uint256 uangDibayar, dan require uangDibayar harus lebih besar sama dengan hargaBarang dengan pesan "Uang tidak cukup".

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Pakai `require` untuk HAMPIR SEMUA validasi biasa (input pengguna, saldo, izin akses) — simpan `assert` HANYA untuk kondisi yang secara logika TIDAK MUNGKIN gagal kecuali ada bug, karena `assert` yang gagal punya konotasi "kode ini rusak", bukan "pengguna salah input".