Kavakoss

🧩 How to Make Smart Contract in Solidity

1️⃣ Pahami Struktur Dasar Smart Contract

Semua file Solidity diawali dengan versi compiler dan deklarasi kontrak.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract NamaKontrak {
    // isi kontrak di sini
}

📘 Penjelasan:

  • SPDX-License-Identifier → tanda lisensi agar tidak ada peringatan di Remix.
  • pragma solidity ^0.8.24; → versi Solidity yang digunakan.
  • contract NamaKontrak → sama seperti class di bahasa pemrograman lain, berisi semua data dan fungsi.

2️⃣ Kenali Komponen Inti

Dalam soal Case B, kontrak akan berisi 4 hal utama:

  1. Struct → untuk mendefinisikan bentuk data (misal data mahasiswa).
  2. Mapping → untuk menyimpan data seperti “database” di blockchain.
  3. Modifier → untuk membatasi siapa yang boleh mengakses fungsi (hanya owner).
  4. Function (CRUD) → Create, Read, Update, Delete.

3️⃣ Buat Struktur Data (Struct)

Struct digunakan untuk membuat tipe data kustom.

struct Student {
    uint id;
    string name;
}

📘 Penjelasan:

  • uint = bilangan positif (integer).
  • string = teks.
  • Setiap student punya dua data: id dan name.

4️⃣ Simpan Data Menggunakan Mapping

mapping berfungsi seperti tabel yang menyimpan data berdasarkan kunci unik.

mapping(uint => Student) public students;

📘 Penjelasan:

  • uint → kunci (key) yang unik (contohnya id mahasiswa).
  • Student → isi data berdasarkan key tersebut.

Untuk memastikan ID tidak dobel, tambahkan juga:

mapping(uint => bool) private exists;

5️⃣ Tambahkan Konsep Owner

Kita perlu tahu siapa pemilik kontrak agar hanya dia yang bisa ubah data.

address public owner;

constructor() {
    owner = msg.sender; // orang yang deploy kontrak jadi owner
}

modifier onlyOwner() {
    require(msg.sender == owner, "Only owner can access this function");
    _; // lanjut eksekusi fungsi setelah pengecekan
}

📘 Penjelasan:

  • msg.sender adalah alamat wallet yang memanggil fungsi.
  • require() digunakan untuk validasi. Jika salah, transaksi gagal.
  • modifier digunakan untuk membatasi akses fungsi.

6️⃣ Buat Fungsi CRUD

Sekarang kita buat fungsi Create, Read, Update, Delete.

🟢 Create (Insert Data)

function insert(uint _id, string memory _name) public onlyOwner {
    require(!exists[_id], "ID already exists");
    students[_id] = Student(_id, _name);
    exists[_id] = true;
}

📘 Penjelasan:

  • require(!exists[_id]) memastikan ID belum ada.
  • Menyimpan data mahasiswa ke mapping students.

🔵 Read (Baca Data)

function read(uint _id) public view returns (string memory) {
    require(exists[_id], "Data not found");
    return students[_id].name;
}

📘 Penjelasan:

  • Fungsi ini hanya membaca data (view).
  • Mengembalikan name dari student dengan ID tertentu.

🟣 Update (Perbarui Data)

function update(uint _id, string memory _newName) public onlyOwner {
    require(exists[_id], "Data not found");
    students[_id].name = _newName;
}

📘 Penjelasan:

  • Mengecek apakah data dengan ID tersebut ada.
  • Mengganti nama student sesuai input baru.

🔴 Delete (Hapus Data)

function remove(uint _id) public onlyOwner {
    require(exists[_id], "Data not found");
    delete students[_id];
    exists[_id] = false;
}

📘 Penjelasan:

  • delete menghapus data dari mapping.
  • exists[_id] dikembalikan ke false agar ID bisa dipakai lagi nanti.

7️⃣ Struktur Lengkap Kontrak

Berikut versi lengkap dari nol hingga CRUD berfungsi penuh.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract StudentCRUD {
    struct Student {
        uint id;
        string name;
    }

    mapping(uint => Student) public students;
    mapping(uint => bool) private exists;
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can access this function");
        _;
    }

    function insert(uint _id, string memory _name) public onlyOwner {
        require(!exists[_id], "ID already exists");
        students[_id] = Student(_id, _name);
        exists[_id] = true;
    }

    function read(uint _id) public view returns (string memory) {
        require(exists[_id], "Data not found");
        return students[_id].name;
    }

    function update(uint _id, string memory _newName) public onlyOwner {
        require(exists[_id], "Data not found");
        students[_id].name = _newName;
    }

    function remove(uint _id) public onlyOwner {
        require(exists[_id], "Data not found");
        delete students[_id];
        exists[_id] = false;
    }
}

  1. Buka https://remix.ethereum.org
  2. Buat file baru StudentCRUD.sol.
  3. Paste seluruh kode di atas.
  4. Klik Compile → pastikan tanpa error.
  5. Klik Deploy → akan muncul tombol fungsi di bawah.
  6. Coba panggil fungsi insert, read, update, dan remove satu per satu.

🔍 Kesimpulan Akhir

TahapFungsi SolidityTujuan
Deklarasipragma, contractAwal kontrak
Datastruct, mappingMenyimpan informasi
Keamananmodifier, requireValidasi dan pembatasan akses
CRUDinsert, read, update, removeManipulasi data