Solidity Basics
Solidity adalah bahasa pemrograman utama untuk menulis smart contract di Ethereum (dan EVM-compatible chains). Syntaxnya mirip JavaScript/C++, tapi paradigmanya sangat berbeda.
Struktur Dasar Contract
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleStorage {
// State variable (disimpan di blockchain, biaya gas)
uint256 public storedValue;
address public owner;
// Event (log yang bisa di-listen oleh frontend)
event ValueChanged(uint256 newValue, address changedBy);
// Constructor (dijalankan sekali saat deploy)
constructor() {
owner = msg.sender; // deployer address
}
// Function untuk menulis data (butuh gas)
function setValue(uint256 _value) public {
storedValue = _value;
emit ValueChanged(_value, msg.sender);
}
// Function untuk baca data (gratis, view)
function getValue() public view returns (uint256) {
return storedValue;
}
}
Tipe Data Dasar
// Value types
uint256 count = 42; // unsigned integer (0 to 2^256-1)
int256 temperature = -10; // signed integer
bool isActive = true; // boolean
address wallet = 0x123...; // 20 byte Ethereum address
bytes32 hash = keccak256(...);// fixed-size byte array
// Reference types
string name = "BelajarWeb"; // dynamic string
uint256[] numbers; // dynamic array
mapping(address => uint256) balances; // key-value store
// Mapping adalah tipe paling penting di Solidity
// Seperti HashMap — O(1) lookup
mapping(address => bool) public hasVoted;
Visibility & Modifiers
// Visibility
function pub() public {} // Siapa saja bisa panggil
function ext() external {} // Hanya dari luar contract
function int() internal {} // Hanya contract ini + turunan
function priv() private {} // Hanya contract ini
// Custom modifier
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_; // placeholder untuk body function
}
function withdraw() public onlyOwner {
// Hanya owner yang bisa withdraw
payable(owner).transfer(address(this).balance);
}
msg Object (Global Variables)
msg.sender— Address yang memanggil functionmsg.value— Jumlah ETH yang dikirim (dalam wei)block.timestamp— Waktu block saat iniblock.number— Nomor block saat ini
Menerima ETH
// Function yang bisa menerima ETH
function deposit() public payable {
// msg.value berisi jumlah ETH yang dikirim
require(msg.value > 0, "Send some ETH");
}
// Cek saldo contract
function getBalance() public view returns (uint256) {
return address(this).balance;
}