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 sebuah 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 maupun memory. Memodifikasi penyimpanan dalam kontrak pintar memakan biaya yang mahal, jadi Anda perlu mempertimbangkan di mana data Anda harus disimpan.

Penyimpanan

Data persisten disebut sebagai penyimpanan dan direpresentasikan oleh variabel state. Nilai-nilai ini disimpan secara permanen di rantai blok. Anda perlu mendeklarasikan tipenya agar kontrak dapat melacak berapa banyak penyimpanan di rantai blok yang dibutuhkannya saat dikompilasi.

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

Jika Anda sudah pernah memprogram dengan bahasa berorientasi objek, Anda mungkin akan familier dengan sebagian besar tipenya. Namun, address mungkin baru bagi Anda jika Anda baru mengenal pengembangan Ethereum.

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

Tipe lainnya meliputi:

  • boolean
  • bilangan bulat (integer)
  • angka titik tetap (fixed point)
  • larik bita berukuran tetap
  • larik bita berukuran dinamis
  • literal rasional dan bilangan bulat
  • literal string
  • literal heksadesimal
  • enum

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 rantai blok, 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 definisikan pada kontrak Anda, ada beberapa variabel global khusus. Variabel ini utamanya digunakan untuk memberikan informasi tentang rantai blok atau transaksi saat ini.

Contoh:

PropertiVariabel stateDeskripsi
block.timestampuint256Stempel waktu Epok blok saat ini
msg.senderaddressPengirim pesan (panggilan saat ini)

Fungsi

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

Ada dua jenis panggilan fungsi:

  • internal – ini tidak membuat panggilan EVM
    • Fungsi internal dan variabel state 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 atau private

  • 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 pada kontrak turunannya

Baik fungsi maupun variabel state dapat dibuat publik atau privat

Berikut adalah fungsi untuk memperbarui variabel state pada sebuah kontrak:

// 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 state kontrak

Fungsi view

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

// 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 state:

  1. Menulis ke variabel state.
  2. Memancarkan peristiwa (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 rakitan 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 ini sering kali menginisialisasi variabel state ke nilai yang ditentukannya.

# 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 definisikan pada kontrak Anda, ada beberapa fungsi bawaan khusus. Contoh yang paling jelas adalah:

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

Fungsi ini memungkinkan kontrak untuk mengirim ETH ke akun lain.

Menulis fungsi

Fungsi Anda membutuhkan:

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

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

Peristiwa dan Log

Peristiwa memungkinkan kontrak pintar Anda untuk berkomunikasi dengan frontend Anda atau aplikasi berlangganan lainnya. Setelah sebuah transaksi divalidasi dan ditambahkan ke sebuah blok, kontrak pintar dapat memancarkan peristiwa dan informasi Log, 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).

Hello world

Token

Aset digital unik

Bacaan lebih lanjut

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