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.
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.