Study
Solidity

Payable & Ether: msg.sender, msg.value

Penjelasan

Function yang ditandai `payable` bisa MENERIMA Ether saat dipanggil. Dua variabel global paling penting terkait ini: `msg.sender` (alamat yang memanggil function saat ini) dan `msg.value` (jumlah Ether — dalam satuan wei — yang dikirim bersama pemanggilan). Untuk MENGIRIM Ether dari kontrak ke alamat lain, dipakai `.call{value: jumlah}("")` (cara yang direkomendasikan saat ini, lebih aman dari `.transfer()`/`.send()` versi lama).

Contoh Konsep

contract KotakDonasi {
    mapping(address => uint256) public totalDonasi;

    function donasi() public payable {
        require(msg.value > 0, "Donasi harus lebih dari 0");
        totalDonasi[msg.sender] += msg.value;
    }

    function tarikDana(address payable penerima, uint256 jumlah) public {
        (bool sukses, ) = penerima.call{value: jumlah}("");
        require(sukses, "Transfer gagal");
    }
}

Praktikum

Buat function payable bernama setor() yang menyimpan msg.value ke dalam mapping saldo berdasarkan msg.sender.

Editor Latihan

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

Tips

1 Ether = 10^18 wei — `msg.value` selalu dalam satuan wei (unit terkecil), jadi kalau pengguna mengirim 1 Ether, `msg.value` bernilai 1000000000000000000. Solidity punya suffix `1 ether` yang otomatis dikonversi ke wei supaya tidak perlu menulis angka nol sebanyak itu manual.