Memahami Ethereum Virtual Machine sebagai stack machine 256-bit, perbedaan storage, memory, dan calldata beserta harga gas-nya, serta komponen dasar Solidity seperti pragma, contract, function, modifier, event, dan error sebelum menulis kontrak pertama

Setelah di episode 1 kita memahami sejarah Solidity — dari usulan Gavin Wood hingga jalur 0.8.x — pada episode ini kita masuk ke jantungnya: bagaimana EVM bekerja dan bagaimana Solidity memetakan ke sana.
Mengapa episode ini penting? Karena hampir semua keputusan desain Solidity — kapan memakai storage atau memory, mengapa mapping tidak bisa di-iterasi, mengapa constant menghemat gas — adalah cerminan dari cara EVM menyimpan dan mengeksekusi data. Tanpa memahami arsitektur ini, kalian hanya menghafal sintaks tanpa tahu mengapa. Dengan memahaminya, kalian bisa memprediksi biaya gas dan menghindari kesalahan arsitektur sejak awal.
Ethereum Virtual Machine (EVM) adalah mesin virtual yang mengeksekusi bytecode kontrak pintar. Semua node Ethereum menjalankan EVM sehingga setiap transaksi menghasilkan hasil yang identik di semua node — inilah yang membuat blockchain konsisten tanpa otoritas pusat.
EVM adalah stack machine dengan kata (word) berukuran 256-bit:
PUSH, SLOAD, SSTORE, ADD, dan CALL.solc) menerjemahkan kode sumber menjadi bytecode opcode ini.Karena ukuran kata 256-bit, tipe uint256 dan address (160-bit) adalah warga kelas satu — mudah diwakili dan dioperasikan tanpa konversi.
EVM memiliki tiga area data dengan karakteristik sangat berbeda:
| Area | Persistent | Biaya | Penggunaan |
|---|---|---|---|
storage | Ya | Mahal (SSTORE) | State variable kontrak |
memory | Tidak | Murah (MSTORE) | Data sementara saat eksekusi |
calldata | Tidak | Paling murah | Argumen fungsi (hanya baca) |
storage adalah "hard disk" kontrak — data di sini bertahan antar transaksi dan disimpan di state blockchain. Setiap state variable secara default berada di sini. Menulis ke storage (opcode SSTORE) adalah operasi termahal di EVM karena mengubah state yang harus direplikasi ke semua node.
memory adalah RAM ephemeral — dibuat per transaksi, dihapus setelah selesai. Digunakan untuk variabel lokal dan hasil antara. Jauh lebih murah daripada storage, tetapi tidak bertahan.
calldata adalah area yang membawa argumen panggilan fungsi dari luar. Hanya bisa dibaca dan sangat murah — cocok untuk parameter besar seperti array atau bytes yang tidak perlu dimodifikasi.
Setiap opcode punya harga gas. Konsekuensi praktisnya:
storage jauh lebih mahal daripada memory — sehingga pola desain kontrak selalu berusaha meminimalkan pembacaan/penulisan storage.out of gas).Sebuah kontrak Solidity dibangun dari komponen-komponen berikut — kita akan mengenalinya di seluruh series:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.36;// SPDX-License-Identifier menandai lisensi kode, dan pragma solidity menentukan versi compiler yang boleh dipakai. ^0.8.36 berarti versi 0.8.36 atau lebih tinggi (tetapi di bawah 0.9.0).
contract adalah blok utama — seperti class dalam OOP. Ia menampung state variable, function, modifier, event, dan error:
contract Counter {
uint256 public count;
function increment() public {
count += 1;
}
}Setiap contract adalah tipe baru yang bisa dibuat (deployed) menjadi alamat di blockchain.
public, external, internal, private) dan mutability (view, pure, payable) yang kita bahas detail di episode 5.require string (episode 5).Tip
Konsep kunci untuk diingat sepanjang series: storage itu mahal, event itu murah, dan immutable itu permanen. Tiga fakta ini menjelaskan mayoritas keputusan desain kontrak yang akan kalian temui.
Rangkuman yang sudah kalian pelajari di episode 2:
storage (persisten, mahal), memory (sementara, murah), calldata (argumen, read-only).pragma, contract, function, modifier, event, dan error.Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan menulis kontrak pertama: instalasi & Hello World — deploy HelloWorld lewat Remix dan Hardhat, memahami state variable plus getter otomatis, dan melihat transaksi pertama kalian tercatat di chain. Pastikan environment kalian siap, karena praktik dimulai!