Skip to Content

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:

  1. Buka browser dan kunjungi remix.ethereum.org
  2. Di panel kiri (File Explorers), klik kanan pada folder contracts -> Pilih New File
  3. 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.

Public Key vs Private Key

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:

  1. Tuliskan pragma solidity ^0.8.0;
  2. Buat kontrak bernama BukuTabungan
  3. Di dalamnya, buat variabel address public admin untuk mencatat pengelola
  4. Buat constructor yang mengisi variabel admin dengan 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:

  1. judulBuku (string): Untuk memberi nama buku ini
  2. totalSaldo (uint256): Untuk mencatat total angka yang terkumpul
  3. isAktif (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:

  1. Update constructor agar menerima input string memory _judulAwal. Gunakan input itu untuk mengisi variabel judulBuku. Set isAktif menjadi true
  2. Buat fungsi simpan() yang bertipe public. Fungsi ini menerima input uint256 _nominal. Di dalamnya, tambahkan _nominal ke variabel totalSaldo
  3. Buat fungsi lihatSaldo() yang bertipe public view untuk mengembalikan nilai totalSaldo

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:

  1. Buat mapping bernama saldoPribadi untuk mencatat saldo masing-masing alamat
  2. Update fungsi simpan(): Selain menambah totalSaldo, tambahkan juga logika untuk menambah saldoPribadi[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.

  1. Buat struct bernama Catatan yang berisi:

    • pengisi (address)
    • jumlah (uint256)
    • pesan (string)
  2. Buat array baru bernama jurnal yang isinya adalah Catatan[]

  3. Update fungsi simpan():

    • Tambahkan parameter baru string memory _pesan
    • Gunakan perintah .push untuk memasukkan data Catatan baru ke dalam jurnal
  4. Buat fungsi jumlahTransaksi() yang bertipe public view untuk mengembalikan panjang array jurnal menggunakan .length

  5. Buat fungsi lihatSemuaCatatan() yang bertipe public view untuk mengembalikan seluruh isi array jurnal. Return type-nya adalah Catatan[] 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; } }
Last updated on