Belajar Solidity - Tipe Data & Variabel
Episode 4 of 23

Belajar Solidity - Tipe Data & Variabel

Menguasai tipe data Solidity: value types (bool, uint/int 8-256, address, bytes1-32, enum) dan reference types (string, bytes, array, struct, mapping), serta memahami data location storage, memory, dan calldata yang menentukan biaya gas dan perilaku variabel

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 3 kalian berhasil men-deploy Hello World — state variable, getter otomatis, dan transaksi pertama — pada episode ini kita membangun fondasi yang paling sering dipakai sehari-hari: tipe data dan variabel.

Mengapa episode ini penting? Karena hampir semua bug biaya dan bug logika di Solidity berakar dari kesalahpahaman tipe: memakai uint8 untuk nilai yang bisa lebih besar dari 255, memanipulasi string seperti array padahal tidak, atau tidak sadar bahwa mapping tidak bisa di-iterasi. Menguasai tipe data sejak awal akan menghemat waktu debugging yang panjang di episode-episode berikutnya.

Value Types

Value types disalin berdasarkan nilai — saat di-assign, datanya disalin, bukan direferensikan. Ini yang paling sering dipakai:

TipeUkuranCatatan
bool1 bit logistrue / false
uint / uint256256-bitInteger tak bertanda (default)
int / int256256-bitInteger bertanda
uint8 ... uint2488-248-bitPer-langkah 8 bit
address160-bitAlamat akun/kontrak
bytes1 ... bytes321-32 byteArray byte fixed-size
enumcustomSet nilai bernama

Integer: uint dan int

solidity
uint256 public totalSupply;
uint8 public small = 255;
int256 public temperature = -10;

uint8 hanya bisa menampung 0-255; menambahkan 1 lagi akan error (overflow dicek otomatis sejak 0.8.0). Karena EVM menangani word 256-bit paling efisien, uint256 adalah tipe yang paling murah untuk dipakai. Selalu mulai dari uint256 dan kecilkan hanya jika benar-benar yakin nilai dibatasi.

Address

address mewakili akun atau kontrak. Ada dua varian:

solidity
address public owner;
address payable public treasury;

address payable bisa menerima dan mengirim ETH (transfer/send), sedangkan address biasa hanya untuk membaca. Nilai msg.sender (pemanggil) dan address(this) (alamat kontrak sendiri) akan sangat sering dipakai.

Bytes Fixed dan Enum

solidity
bytes32 public merkleRoot;
enum Status { Pending, Approved, Rejected }
Status public status;

bytes32 cocok untuk hash. enum membuat pilihan bernama yang mudah dibaca dan lebih hemat storage daripada uint.

Reference Types

Reference types menyimpan lokasi data, bukan nilainya. Data location-nya wajib ditentukan: storage, memory, atau calldata.

TipeDeskripsi
stringTeks dinamis (di atas bytes)
bytesArray byte dinamis
arrayKoleksi elemen bertipe sama
structKelompok field bernama
mappingPasangan key/value (hash table)
solidity
struct User {
    address addr;
    uint256 balance;
}
 
User[] public users;
mapping(address => uint256) public balances;

struct mengelompokkan data, array menyimpan urutan, dan mapping mencari nilai berdasarkan key.

Data Location: Storage, Memory, Calldata

Seperti kita pelajari di episode 2, EVM punya tiga area data. Aturannya di level bahasa:

  • State variable selalu di storage (tidak perlu ditulis).
  • Parameter fungsi dan variabel lokal harus diberi lokasi untuk reference types.
  • calldata hanya untuk parameter fungsi, read-only, dan paling murah.
  • Assigning reference types menyalin referensi, bukan data — kecuali diubah lokasinya.
solidity
function getFirst(bytes calldata data) external pure returns (bytes1) {
    return data[0];
}
 
function copyArr(uint256[] memory source) public pure returns (uint256[] memory) {
    uint256[] memory result = source;
    return result;
}

Warning

Aturan lokasi ini adalah salah satu sumber error kompilasi paling umum: "Data location must be storage, memory or calldata". external function dengan parameter reference types sebaiknya memakai calldata — lebih murah karena tidak menyalin ke memory.

Pitfall yang Sering Terjadi

Beberapa kesalahan klasik yang akan kalian temui:

  • mapping tidak bisa di-iterasi — tidak ada cara langsung mengambil semua key. Jika butuh list, simpan juga array key secara terpisah.
  • string bukan array char — tidak bisa str[0]; butuh konversi ke bytes untuk akses per-byte.
  • Overflow pada tipe keciluint8 yang di-increment melebihi 255 akan revert di 0.8.x.
  • Assignment reference types — mengubah variabel memory dari struct yang sama akan terlihat di kedua variabel karena keduanya menunjuk data yang sama.

Penutup

Inti yang harus dibawa pulang:

  • Value types (bool, uint/int, address, bytes1-32, enum) disalin per nilai; mulai dari uint256.
  • Reference types (string, bytes, array, struct, mapping) butuh data location.
  • calldata untuk parameter external read-only; memory untuk kerja sementara; storage untuk state.
  • mapping itu efisien tapi tidak iterable; kombinasikan dengan array jika butuh daftar.

Di episode 5 selanjutnya kita akan membahas fungsi, modifier, dan visibilitypublic/external/internal/private, view/pure/payable, return multiple values, pola onlyOwner, serta require/assert/revert dan custom error yang hemat gas. Pastikan pemahaman tipe data kalian solid, karena episode 5 membangun logika kontrak di atasnya!

Belajar Solidity - Tipe Data & Variabel | Belajar Solidity