Lompat ke konten utama
Change page

Anatomi kontrak pintar

Kontrak pintar adalah program yang berjalan pada sebuah alamat di Ethereum. Kontrak pintar terdiri dari data dan fungsi yang dapat dieksekusi setelah menerima transaksi. Berikut adalah gambaran umum tentang apa yang membentuk sebuah kontrak pintar.

Prasyarat

Pastikan Anda telah membaca tentang kontrak pintar terlebih dahulu. Dokumen ini mengasumsikan Anda sudah familier dengan bahasa pemrograman seperti JavaScript atau Python.

Data

Setiap data kontrak harus ditetapkan ke sebuah lokasi: baik ke storage (penyimpanan) maupun memory (memori). Memodifikasi penyimpanan dalam kontrak pintar membutuhkan biaya yang mahal, jadi Anda perlu mempertimbangkan di mana data Anda harus berada.

Penyimpanan

Data persisten disebut sebagai penyimpanan dan diwakili oleh variabel status. Nilai-nilai ini disimpan secara permanen di blockchain. Anda perlu mendeklarasikan tipenya sehingga kontrak dapat melacak berapa banyak penyimpanan di blockchain yang dibutuhkannya saat dikompilasi.

// Solidity example // Contoh Solidity
contract SimpleStorage {
    uint storedData; // State variable // Variabel state
    // ... // ...
}
# Vyper example # Contoh Vyper
storedData: int128

Jika Anda sudah pernah memprogram dengan bahasa berorientasi objek, Anda mungkin akan familier dengan sebagian besar tipenya. Namun, address (alamat) mungkin merupakan hal baru bagi Anda jika Anda baru dalam pengembangan Ethereum.

Tipe address dapat menampung alamat Ethereum yang setara dengan 20 bita atau 160 bit. Tipe ini mengembalikan nilai dalam notasi heksadesimal dengan awalan 0x.

Tipe lainnya meliputi:

  • boolean
  • integer (bilangan bulat)
  • fixed point numbers (bilangan titik tetap)
  • fixed-size byte arrays (larik bita berukuran tetap)
  • dynamically sized byte arrays (larik bita berukuran dinamis)
  • rational and integer literals (literal rasional dan bilangan bulat)
  • string literals (literal string)
  • hexadecimal literals (literal heksadesimal)
  • enums

Untuk penjelasan lebih lanjut, lihat dokumentasinya:

Memori

Nilai yang hanya disimpan selama masa eksekusi fungsi kontrak disebut variabel memori. Karena tidak disimpan secara permanen di blockchain, variabel ini jauh lebih murah untuk digunakan.

Pelajari lebih lanjut tentang bagaimana EVM menyimpan data (Penyimpanan, Memori, dan Tumpukan) di dokumentasi Solidity (opens in a new tab).

Variabel lingkungan

Selain variabel yang Anda tentukan pada kontrak Anda, ada beberapa variabel global khusus. Variabel ini terutama digunakan untuk memberikan informasi tentang blockchain atau transaksi saat ini.

Contoh:

PropertiVariabel statusDeskripsi
block.timestampuint256Stempel waktu epoch blok saat ini
msg.senderaddressPengirim pesan (panggilan saat ini)

Fungsi

Dalam istilah yang paling sederhana, fungsi dapat mengambil informasi atau mengatur informasi sebagai respons terhadap transaksi yang masuk.

Ada dua jenis panggilan fungsi:

  • internal – ini tidak membuat panggilan EVM
    • Fungsi internal dan variabel status hanya dapat diakses secara internal (yaitu, dari dalam kontrak saat ini atau kontrak yang diturunkan darinya)
  • external – ini membuat panggilan EVM
    • Fungsi eksternal adalah bagian dari antarmuka kontrak, yang berarti fungsi tersebut dapat dipanggil dari kontrak lain dan melalui transaksi. Fungsi eksternal f tidak dapat dipanggil secara internal (yaitu, f() tidak berfungsi, tetapi this.f() berfungsi).

Fungsi juga dapat bersifat public (publik) atau private (pribadi)

  • Fungsi public dapat dipanggil secara internal dari dalam kontrak atau secara eksternal melalui pesan
  • Fungsi private hanya terlihat untuk kontrak tempat fungsi tersebut didefinisikan dan tidak dalam kontrak turunan

Baik fungsi maupun variabel status dapat dibuat publik atau pribadi

Berikut adalah fungsi untuk memperbarui variabel status pada sebuah kontrak:

// Solidity example // Contoh Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Parameter value bertipe string diteruskan ke dalam fungsi: update_name
  • Fungsi ini dideklarasikan sebagai public, yang berarti siapa pun dapat mengaksesnya
  • Fungsi ini tidak dideklarasikan sebagai view, sehingga dapat memodifikasi status kontrak

Fungsi view

Fungsi-fungsi ini berjanji untuk tidak memodifikasi status data kontrak. Contoh umumnya adalah fungsi "getter" – Anda mungkin menggunakan ini untuk menerima saldo pengguna misalnya.

// Solidity example // Contoh Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Apa yang dianggap memodifikasi status:

  1. Menulis ke variabel status.
  2. Memancarkan peristiwa (emitting events) (opens in a new tab).
  3. Membuat kontrak lain (opens in a new tab).
  4. Menggunakan selfdestruct.
  5. Mengirim ether melalui panggilan.
  6. Memanggil fungsi apa pun yang tidak ditandai view atau pure.
  7. Menggunakan panggilan tingkat rendah.
  8. Menggunakan perakitan sebaris (inline assembly) yang berisi opcode tertentu.

Fungsi konstruktor

Fungsi constructor hanya dieksekusi sekali saat kontrak pertama kali disebarkan. Seperti constructor dalam banyak bahasa pemrograman berbasis kelas, fungsi-fungsi ini sering kali menginisialisasi variabel status ke nilai yang ditentukannya.

# Vyper example # Contoh Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Fungsi bawaan

Selain variabel dan fungsi yang Anda tentukan pada kontrak Anda, ada beberapa fungsi bawaan khusus. Contoh yang paling jelas adalah:

  • address.send() – Solidity
  • send(address) – Vyper

Fungsi-fungsi ini memungkinkan kontrak untuk mengirim ETH ke akun lain.

Menulis fungsi

Fungsi Anda membutuhkan:

  • variabel parameter dan tipe (jika menerima parameter)
  • deklarasi internal/eksternal
  • deklarasi pure/view/payable
  • tipe pengembalian (jika mengembalikan nilai)

Kontrak yang lengkap mungkin terlihat seperti ini. Di sini fungsi constructor memberikan nilai awal untuk variabel dapp_name.

Peristiwa dan log

Peristiwa (events) memungkinkan kontrak pintar Anda untuk berkomunikasi dengan frontend Anda atau aplikasi berlangganan lainnya. Setelah transaksi divalidasi dan ditambahkan ke sebuah blok, kontrak pintar dapat memancarkan peristiwa dan mencatat informasi, yang kemudian dapat diproses dan dimanfaatkan oleh frontend.

Contoh beranotasi

Berikut adalah beberapa contoh yang ditulis dalam Solidity. Jika Anda ingin bermain dengan kodenya, Anda dapat berinteraksi dengannya di Remix (opens in a new tab).

Halo dunia

Token

Aset digital unik

Bacaan lebih lanjut

Lihat dokumentasi Solidity dan Vyper untuk gambaran umum yang lebih lengkap tentang kontrak pintar:

Pembaruan terakhir halaman: 15 April 2026

Apakah artikel ini bermanfaat?