Menulis kontrak Solidity pertama: setup proyek Hardhat dan Foundry, membedah struktur kontrak HelloWorld dengan state variable dan getter otomatis, lalu deploy kontrak lewat Remix dan Hardhat Network sambil memahami konsep alamat dan transaksi

Setelah di episode 2 kita memahami arsitektur EVM — storage, memory, calldata, dan gas — pada episode ini kalian akhirnya menulis dan men-deploy kontrak pertama. Ini adalah momen penting: dari sini konsep abstrak (alamat, transaksi, gas) menjadi sesuatu yang bisa kalian lihat dan sentuh.
Mengapa episode ini penting? Karena Hello World di Solidity tidak sesederhana mencetak string ke layar. Kalian akan belajar bahwa state variable bisa diakses publik, bahwa kompiler otomatis membuatkan getter, dan bahwa men-deploy kontrak berarti membuat transaksi yang tercatat di chain — konsep yang menjadi dasar seluruh series.
Buat proyek Hardhat di direktori lab:
mkdir solidity-lab && cd solidity-lab
npm init -y
npm install --save-dev hardhat
npx hardhat initPilih opsi Create a JavaScript project dan accept semua default. Struktur yang dihasilkan:
contracts/ # kode sumber Solidity
scripts/ # script deploy
test/ # file testing
hardhat.config.js # konfigurasi proyekVersi alternatif tanpa JavaScript adalah Foundry — inisialisasi proyeknya:
forge init solidity-foundry
cd solidity-foundry
forge buildforge init membuat struktur src/, test/, dan script/. Kedua toolchain ini kita bedah lengkap di episode 9 dan 10.
Buat file contracts/HelloWorld.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.36;
contract HelloWorld {
string public greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function setGreeting(string memory _newGreeting) public {
greeting = _newGreeting;
}
function sayHello() public view returns (string memory) {
return greeting;
}
}Mari bedah bagian-bagiannya:
string public greeting adalah state variable. Karena dideklarasikan public, kompiler otomatis membuat getter bernama greeting() — kalian tidak perlu menulis fungsi getter manual.constructor berjalan sekali saat deploy, menerima nilai awal.setGreeting memodifikasi state — transaksi yang memanggilnya membayar gas untuk SSTORE.sayHello() adalah view — hanya membaca state tanpa mengubah, sehingga tidak perlu gas saat dipanggil sebagai panggilan read.Tip
Inilah pembeda utama Solidity vs bahasa biasa: fungsi view/pure bisa dipanggil tanpa biaya, sedangkan fungsi yang mengubah state memerlukan transaksi ber-gas. Pola ini akan kalian temui terus-menerus.
Cara tercepat melihat kontrak berjalan adalah Remix (remix.ethereum.org):
HelloWorld.sol di folder contracts."Halo Solidity" di kolom constructor → klik Deploy.greeting untuk membaca nilainya.Di Remix VM kalian bisa melihat console: setiap deploy dan panggilan menampilkan detail transaksi, gas yang terpakai, dan event log.
Untuk deploy dari terminal, buat script scripts/deploy.js:
const { ethers } = require("hardhat");
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const hello = await HelloWorld.deploy("Halo Solidity");
await hello.waitForDeployment();
console.log("Kontrak di-deploy ke:", await hello.getAddress());
console.log("Greeting:", await hello.greeting());
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});Jalankan di jaringan lokal Hardhat:
npx hardhat run scripts/deploy.jsOutput menunjukkan alamat kontrak — misalnya 0x5FbDB2315678afecb367f032d93F642f64180aa3 — dan nilai greeting awal. Alamat itu adalah identitas kontrak di chain; transaksi yang memanggil fungsi kontrak mengirim ke alamat ini.
Warning
Jangan pernah men-deploy kontrak yang belum diuji ke mainnet Ethereum. Setiap transaksi mainnet memakan ETH asli, dan bug di kontrak immutable bisa membuat dana terkunci selamanya. Semua praktik di series ini memakai jaringan lokal atau testnet Sepolia.
Pastikan seluruh alur bekerja:
npx hardhat compile
npx hardhat testnpx hardhat compile harus berhasil tanpa error — artinya kompiler Solidity menerima kode kalian. Jika ada peringatan seperti unused variable, perhatikan dan bereskan; kita akan memperlakukan peringatan kompiler secara serius mulai episode 15.
Di episode 3 ini kalian telah menulis dan men-deploy kontrak pertama:
npx hardhat init) dan Foundry (forge init).string public greeting menghasilkan getter otomatis.view bisa dibaca gratis; fungsi yang mengubah state butuh transaksi ber-gas.Di episode 4 selanjutnya kita akan membahas tipe data dan variabel — value types (bool, uint, int, address, bytes, enum) dan reference types (string, bytes, array, struct, mapping), plus data location storage/memory/calldata. Pastikan kontrak HelloWorld kalian sudah berhasil, karena episode selanjutnya akan memakainya sebagai basis.