Solidity 101 - Part 1
Chapter 0: Persiapan Lingkungan Kerja
Sebelum menulis kode, kita akan menggunakan Remix IDE. Ini adalah teks editor berbasis web khusus untuk Solidity.
Langkah-langkah Persiapan:
- Buka browser dan kunjungi
remix.ethereum.org - Di panel kiri (File Explorers), klik kanan pada folder
contracts-> Pilih New File - Beri nama file:
BukuTabungan.sol
Sekarang Anda siap untuk mulai.
Chapter 1: Arsitektur Smart Contract
Secara fundamental, Smart Contract beroperasi layaknya sebuah robot pencatat. Robot ini memiliki memori internal dan aturan yang tidak bisa diubah setelah dijalankan.

A. Pragma Directive (Versi Bahasa)
Baris pertama dalam kode untuk memberi tahu mesin versi bahasa apa yang digunakan.
pragma solidity ^0.8.0;B. Contract Declaration (Wadah Utama)
Ini adalah kerangka tubuh robotnya. Semua kode harus ditulis di dalam kurung kurawal ini.
contract BukuTabungan {
// Kode ditulis di sini
}C. State Variables (Penyimpanan Permanen)
Variabel yang ditulis di dalam kontrak akan disimpan selamanya di blockchain (seperti hard disk).
uint256 public totalUang;D. Constructor (Settingan Awal)
Fungsi yang jalan otomatis satu kali saja saat kontrak pertama kali dibuat. Kita gunakan untuk mencatat siapa adminnya.
address public admin;
constructor() {
admin = msg.sender;
}Checkpoint Chapter 1: Membuat Buku
Buka file BukuTabungan.sol, lalu ketik kode berikut untuk membuat kerangka dasarnya:
- Tuliskan
pragma solidity ^0.8.0; - Buat kontrak bernama
BukuTabungan - Di dalamnya, buat variabel
address public adminuntuk mencatat pengelola - Buat
constructoryang mengisi variabeladmindengan alamat Anda (msg.sender)
Chapter 2: Sistem Tipe Data
Setiap data harus disimpan di wadah yang tepat. Kita akan melengkapi data buku tabungan kita.
A. Unsigned Integer (uint)
Wadah untuk Angka Positif. Karena kita hanya mensimulasikan angka (bukan uang ETH asli), tipe data ini yang paling utama.
uint256 public totalSaldo = 0;B. Boolean (bool)
Wadah untuk Status (Saklar). Isinya hanya true (Aktif) atau false (Non-aktif).
bool public isAktif = true;C. String (string)
Wadah untuk Teks (Nama).
string public judulBuku = "Tabungan Bersama";Checkpoint Chapter 2: Data Buku
Lanjutkan kode di BukuTabungan.sol. Tambahkan variabel-variabel ini di bawah variabel admin:
judulBuku(string): Untuk memberi nama buku initotalSaldo(uint256): Untuk mencatat total angka yang terkumpulisAktif(bool): Status apakah buku masih menerima catatan baru
Chapter 3: Fungsi dan Visibilitas
Fungsi adalah tombol-tombol yang bisa ditekan untuk menyuruh kontrak melakukan sesuatu.
A. Konsep Penting: Memory pada String
Jika input fungsi berupa string (teks), kita wajib menambahkan kata memory.
Ini memberi tahu mesin: “Simpan data teks ini sebentar saja di RAM saat fungsi jalan, jangan dicatat permanen ke blockchain dulu.”
function gantiJudul(string memory _judulBaru) public { }B. Fungsi Write (Ubah Data)
Fungsi ini mengubah data di blockchain. Di sini kita membuat simulasi menabung dengan memasukkan angka.
function simpan(uint256 _angka) public {
totalSaldo = totalSaldo + _angka;
}C. Fungsi View (Lihat Data)
Fungsi ini hanya membaca data. Gratis (tanpa biaya gas).
function lihatSaldo() public view returns (uint256) {
return totalSaldo;
}Checkpoint Chapter 3: Fitur Mencatat
Tambahkan fungsi-fungsi ini ke dalam kontrak:
- Update
constructoragar menerima inputstring memory _judulAwal. Gunakan input itu untuk mengisi variabeljudulBuku. SetisAktifmenjaditrue - Buat fungsi
simpan()yang bertipepublic. Fungsi ini menerima inputuint256 _nominal. Di dalamnya, tambahkan_nominalke variabeltotalSaldo - Buat fungsi
lihatSaldo()yang bertipepublic viewuntuk mengembalikan nilaitotalSaldo
Chapter 4: Struktur Data (Mapping)
Kita butuh cara untuk mencatat saldo masing-masing orang.
A. Mapping (Loker Pribadi)
Cara paling efisien untuk menyimpan data berpasangan. Seperti loker sekolah: Kunci (Alamat) → Isi (Saldo).
mapping(address => uint256) public saldoPribadi;Checkpoint Chapter 4: Mencatat Saldo
Kita ingin tahu saldo masing-masing orang. Tambahkan kode ini:
- Buat
mappingbernamasaldoPribadiuntuk mencatat saldo masing-masing alamat - Update fungsi
simpan(): Selain menambahtotalSaldo, tambahkan juga logika untuk menambahsaldoPribadi[msg.sender]
Chapter 5: Struct & Array
Mapping hanya mencatat saldo akhir. Bagaimana jika kita ingin mencatat riwayat transaksi lengkap secara berurutan? Kita gunakan Struct dan Array.
A. Struct (Format Data)
Struct memungkinkan kita membuat format formulir sendiri.
struct Catatan {
address pengisi;
uint256 jumlah;
string pesan;
}B. Array & Perintah Push
Array adalah wadah data yang berurutan. Untuk memasukkan data baru ke dalam Array, kita menggunakan perintah .push().
Konsep .push: Bayangkan Array seperti kereta api. Perintah .push artinya “Menambah gerbong baru di paling belakang”.
Setiap kali fungsi .push dijalankan, data baru akan masuk ke antrian terakhir.
Catatan[] public jurnal;Checkpoint Chapter 5: Jurnal Lengkap
Kita ganti sistem pencatatan yang sederhana di Chapter 4 menjadi lebih lengkap.
-
Buat
structbernamaCatatanyang berisi:pengisi(address)jumlah(uint256)pesan(string)
-
Buat array baru bernama
jurnalyang isinya adalahCatatan[] -
Update fungsi
simpan():- Tambahkan parameter baru
string memory _pesan - Gunakan perintah
.pushuntuk memasukkan dataCatatanbaru ke dalamjurnal
- Tambahkan parameter baru
-
Buat fungsi
jumlahTransaksi()yang bertipepublic viewuntuk mengembalikan panjang arrayjurnalmenggunakan.length -
Buat fungsi
lihatSemuaCatatan()yang bertipepublic viewuntuk mengembalikan seluruh isi arrayjurnal. Return type-nya adalahCatatan[] memory
Chapter 6: Kode Lengkap (Studi Kasus: Buku Tabungan)
Berikut adalah hasil akhir kode BukuTabungan.sol. Kode ini menggabungkan semua konsep dari Chapter 1 hingga Chapter 5 secara berurutan.
Silakan salin kode ini ke Remix IDE, lakukan Compile, lalu Deploy. Cobalah masukkan angka dan pesan di fungsi simpan.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract BukuTabungan {
// BAB 5: STRUCT (Format Data)
struct Catatan {
address pengisi;
uint256 jumlah;
string pesan;
}
// BAB 1 & 2: STATE VARIABLES
address public admin;
string public judulBuku;
uint256 public totalSaldo;
bool public isAktif;
// BAB 4: MAPPING (Saldo Pribadi)
mapping(address => uint256) public saldoPribadi;
// BAB 5: ARRAY OF STRUCT (Jurnal)
Catatan[] public jurnal;
// BAB 1 & 3: CONSTRUCTOR
constructor(string memory _judulAwal) {
admin = msg.sender;
judulBuku = _judulAwal;
isAktif = true;
}
// BAB 3: FUNCTION WRITE (Simpan Data)
function simpan(uint256 _nominal, string memory _pesan) public {
// A. Update Saldo Pribadi (Mapping)
saldoPribadi[msg.sender] += _nominal;
// B. Update total saldo global
totalSaldo += _nominal;
// C. Catat ke jurnal rinci (Struct)
jurnal.push(Catatan({
pengisi: msg.sender,
jumlah: _nominal,
pesan: _pesan
}));
}
// FUNGSI TAMBAHAN (Untuk Cek Data)
function lihatTotal() public view returns (uint256) {
return totalSaldo;
}
function jumlahTransaksi() public view returns (uint256) {
return jurnal.length;
}
function lihatSemuaCatatan() public view returns (Catatan[] memory) {
return jurnal;
}
}