Cheat Sheet Solidity
Struktur contract
Setiap file dimulai dengan lisensi dan pragma; contract adalah satuan yang kamu deploy.
| Sintaks | Arti |
|---|---|
// SPDX-License-Identifier: MIT | Komentar lisensi yang diharapkan compiler di baris 1 |
pragma solidity ^0.8.0; | Versi compiler yang menjadi target file ini |
contract Counter { ... } | Mendeklarasikan contract (state + fungsi) |
constructor(uint start) { count = start; } | Dijalankan sekali, saat deployment |
import "./Token.sol"; | Mengimpor file lain |
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; | Mengimpor paket library |
interface IToken { function balanceOf(address a) external view returns (uint); } | Mendeklarasikan interface (tanpa isi fungsi) |
library Math { function min(uint a, uint b) internal pure returns (uint) { ... } } | Library berisi fungsi yang bisa dipakai ulang |
Value type
Bilangan bulat punya ukuran tetap dan tanpa desimal; versi 0.8 melakukan revert saat overflow.
| Tipe | Isinya |
|---|---|
uint256 / uint | Bilangan bulat unsigned, 0 sampai 2^256 - 1 (uint adalah uint256) |
uint8, uint16, ... uint128 | Bilangan bulat unsigned yang lebih kecil, dengan kelipatan 8 bit |
int256 / int | Bilangan bulat bertanda (boleh negatif) |
bool | true atau false |
address | Alamat akun atau contract sepanjang 20 byte |
address payable | Alamat yang bisa menerima Ether lewat transfer/send |
bytes32, bytes1... | Array byte berukuran tetap |
enum Status { Open, Closed } | Kumpulan konstanta bernama, disimpan sebagai uint8 |
1 ether, 1 gwei, 1 wei | Satuan Ether: 1 ether = 10^18 wei |
1 days, 2 hours, 30 minutes | Satuan waktu, dalam detik |
Reference type & lokasi data
Array, string, bytes, struct, dan mapping disimpan di storage, memory, atau calldata.
| Sintaks | Arti |
|---|---|
string memory name | String UTF-8 dinamis (salinan sementara) |
bytes memory data | Array byte dinamis |
uint[] public scores; | Array dinamis di storage |
uint[3] fixed; | Array berukuran tetap berisi 3 |
uint[] memory tmp = new uint[](5); | Mengalokasikan array di memory |
scores.push(42); | Menambah ke array storage |
scores.pop(); | Menghapus elemen terakhir |
scores.length | Jumlah elemen |
storage | Permanen, di on-chain, mahal untuk ditulis |
memory | Sementara, hanya bertahan selama satu panggilan |
calldata | Input fungsi external yang hanya bisa dibaca, paling murah |
Mapping & struct
Mapping adalah hash table tanpa panjang dan tanpa iterasi; struct mengelompokkan field.
| Sintaks | Arti |
|---|---|
mapping(address => uint) public balances; | Penyimpanan key-value, setiap key selalu ada (default 0) |
balances[msg.sender] += 1; | Membaca/menulis lewat key |
mapping(address => mapping(address => uint)) allowance; | Mapping bersarang |
struct User { string name; uint age; bool active; } | Mendefinisikan struct |
User memory u = User("Ada", 36, true); | Membuat struct di memory |
User memory u = User({name: "Ada", age: 36, active: true}); | Membuat dengan field bernama |
users[msg.sender] = u; | Menyimpan struct di mapping |
users[msg.sender].age = 37; | Memperbarui satu field di storage |
delete users[msg.sender]; | Mengembalikan ke nilai default |
Fungsi & visibility
Setiap fungsi menyatakan siapa yang boleh memanggilnya dan apakah ia membaca atau menulis state.
| Sintaks | Arti |
|---|---|
function add(uint a, uint b) public pure returns (uint) { return a + b; } | Fungsi dengan parameter dan nilai kembalian |
public | Bisa dipanggil dari mana saja (dari dalam dan luar) |
external | Hanya bisa dipanggil dari luar contract |
internal | Contract ini dan contract yang mewarisinya |
private | Hanya contract ini |
view | Membaca state, tidak pernah menulisnya |
pure | Sama sekali tidak membaca state |
payable | Bisa menerima Ether bersama panggilannya |
returns (uint sum, bool ok) | Beberapa nilai kembalian bernama |
(uint s, bool ok) = f(); | Membongkar beberapa nilai kembalian |
uint public count; | Variabel state public otomatis mendapat getter count() |
Modifier, konstanta & inheritance
Pakai ulang pemeriksaan dengan modifier; kunci nilai dengan constant dan immutable.
| Sintaks | Arti |
|---|---|
modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _; } | Mendefinisikan modifier (_ = jalankan isi fungsi) |
function withdraw() public onlyOwner { ... } | Menerapkan modifier |
uint public constant MAX = 100; | Konstanta saat compile |
address public immutable owner; | Diisi sekali di constructor, lalu tetap |
contract Token is ERC20, Ownable { ... } | Mewarisi dari contract lain |
function f() public virtual { ... } | Mengizinkan override |
function f() public override { ... } | Override fungsi induk |
super.f(); | Memanggil implementasi milik induk |
abstract contract Base { function f() public virtual; } | Contract dengan fungsi yang belum diimplementasikan |
Alur kontrol
Pernyataan khas keluarga C; tidak ada switch, dan setiap iterasi perulangan memakan gas.
| Sintaks | Arti |
|---|---|
if (x > 5) { ... } else if (x > 2) { ... } else { ... } | Cabang kondisional |
for (uint i = 0; i < n; i++) { ... } | Perulangan dengan hitungan |
while (x < 10) { x++; } | Mengulang selama kondisi terpenuhi |
do { ... } while (cond); | Dijalankan minimal sekali |
break; / continue; | Keluar dari perulangan / lompat ke iterasi berikutnya |
x > 0 ? a : b | Ekspresi ternary |
a / b | Pembagian bilangan bulat (sisa dibuang) |
a % b | Sisa bagi |
a ** 2 | Perpangkatan |
unchecked { x++; } | Melewati pemeriksaan overflow (menghemat gas, pakai dengan hati-hati) |
Error: require, revert, assert
Pemeriksaan yang gagal membatalkan seluruh transaksi dan mengembalikan gas yang tidak terpakai.
| Sintaks | Arti |
|---|---|
require(amount > 0, "Amount must be positive"); | Memvalidasi input atau state; revert dengan pesan |
revert("Not allowed"); | Membatalkan tanpa syarat |
error Insufficient(uint available, uint requested); | Mendeklarasikan custom error (lebih murah daripada string) |
revert Insufficient(balance, amount); | Revert dengan custom error |
assert(total == a + b); | Memeriksa invariant yang tidak boleh gagal |
try token.transfer(to, amt) returns (bool ok) { ... } catch { ... } | Menangani panggilan external yang gagal |
Event
Event menulis log yang bisa dipantau (subscribe) oleh aplikasi off-chain; event tidak bisa dibaca dari contract.
| Sintaks | Arti |
|---|---|
event Transfer(address indexed from, address indexed to, uint value); | Mendeklarasikan event |
emit Transfer(msg.sender, to, amount); | Memancarkannya (emit) |
indexed | Parameter yang bisa difilter (maksimal 3 per event) |
event Log(string message); | Tipe ABI apa pun bisa dicatat di log |
Ether, alamat & variabel global
Konteks transaksi berasal dari msg, block, dan tx.
| Sintaks | Arti |
|---|---|
msg.sender | Alamat yang memanggil fungsi ini |
msg.value | Wei yang dikirim bersama panggilan (butuh payable) |
block.timestamp | Waktu blok saat ini (detik sejak epoch) |
block.number | Tinggi blok saat ini |
tx.origin | Akun milik pengguna (EOA) yang memulai transaksi (hindari untuk autentikasi) |
address(this).balance | Saldo Ether contract ini |
payable(to).transfer(1 ether); | Mengirim Ether, revert jika gagal |
(bool ok, ) = to.call{value: amt}(""); | Pengiriman tingkat rendah, mengembalikan penanda sukses |
receive() external payable {} | Dijalankan saat ada transfer Ether biasa |
fallback() external payable {} | Dijalankan saat tidak ada fungsi yang cocok |
keccak256(abi.encodePacked(a, b)) | Membuat hash dari nilai |
abi.encode(x), abi.decode(data, (uint)) | Encode / decode data ABI |
Semua sintaks Solidity yang sering kamu pakai, dalam satu halaman. Cheat sheet Solidity ini adalah referensi cepat untuk bahasa smart contract Ethereum dan semua chain EVM: mendeklarasikan contract, memilih tipe, menyimpan data di mapping dan struct, menulis fungsi dengan visibility dan mutability yang tepat, serta mengamankannya dengan require, modifier, dan event.
Sintaks di sini adalah Solidity 0.8, yang memeriksa overflow aritmetika secara default dan bisa dipakai di Remix, Hardhat, dan Foundry. Salin yang kamu butuhkan, atau coba langsung di playground Solidity: tulis contract, compile, dan jalankan di EVM langsung di browsermu.
Solidity cheat sheet FAQ
Is this Solidity cheat sheet free?
Yes. This cheat sheet is free to use, with no sign-up required. Bookmark it and come back any time you need a quick reference.
Is this cheat sheet good for beginners?
Yes. It is organized by topic so you can find what you need at any level, and each entry links back to Coddy's free interactive Solidity course when you want to go deeper.