Bahasa kontrak pintar
Pembaruan terakhir halaman: 26 Februari 2026
Aspek yang luar biasa tentang Ethereum adalah bahwa kontrak pintar dapat diprogram menggunakan bahasa yang relatif ramah pengembang. Jika Anda berpengalaman dengan Python atau bahasa kurung kurawal (opens in a new tab) apa pun, Anda dapat menemukan bahasa dengan sintaksis yang familier.
Dua bahasa yang paling aktif dan dipelihara adalah:
- Solidity
- Vyper
Remix IDE menyediakan lingkungan pengembangan yang komprehensif untuk membuat dan menguji kontrak di Solidity dan Vyper. Coba Remix IDE di dalam peramban (opens in a new tab) untuk mulai membuat kode.
Pengembang yang lebih berpengalaman mungkin juga ingin menggunakan Yul, bahasa perantara untuk Mesin Virtual Ethereum, atau Yul+, sebuah ekstensi untuk Yul.
Jika Anda penasaran dan ingin membantu menguji bahasa baru yang masih dalam tahap pengembangan berat, Anda dapat bereksperimen dengan Fe, bahasa kontrak pintar baru yang saat ini masih dalam tahap awal.
Prasyarat
Pengetahuan sebelumnya tentang bahasa pemrograman, terutama JavaScript atau Python, dapat membantu Anda memahami perbedaan dalam bahasa kontrak pintar. Kami juga menyarankan Anda memahami kontrak pintar sebagai sebuah konsep sebelum menggali terlalu dalam tentang perbandingan bahasa. Pengantar kontrak pintar.
Solidity
- Bahasa tingkat tinggi berorientasi objek untuk mengimplementasikan kontrak pintar.
- Bahasa kurung kurawal yang paling banyak dipengaruhi oleh C++.
- Diketik secara statis (tipe variabel diketahui pada saat kompilasi).
- Mendukung:
- Pewarisan (Anda dapat memperluas kontrak lain).
- Pustaka (Anda dapat membuat kode yang dapat digunakan kembali yang dapat Anda panggil dari kontrak yang berbeda – seperti fungsi statis di kelas statis dalam bahasa pemrograman berorientasi objek lainnya).
- Tipe kompleks yang ditentukan pengguna.
Tautan penting
- Dokumentasi (opens in a new tab)
- Portal Bahasa Solidity (opens in a new tab)
- Solidity by Example (opens in a new tab)
- GitHub (opens in a new tab)
- Ruang Obrolan Gitter Solidity (opens in a new tab) yang dijembatani ke Ruang Obrolan Matrix Solidity (opens in a new tab)
- Lembar Sontekan (opens in a new tab)
- Blog Solidity (opens in a new tab)
- Twitter Solidity (opens in a new tab)
Contoh kontrak
1// SPDX-License-Identifier: GPL-3.0 // SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // The keyword "public" makes variables // Kata kunci "public" membuat variabel6 // accessible from other contracts // dapat diakses dari kontrak lain7 address public minter;8 mapping (address => uint) public balances;910 // Events allow clients to react to specific // Event memungkinkan klien bereaksi terhadap11 // contract changes you declare // perubahan kontrak tertentu yang Anda deklarasikan12 event Sent(address from, address to, uint amount);1314 // Constructor code is only run when the contract // Kode konstruktor hanya dijalankan ketika kontrak15 // is created // dibuat16 constructor() {17 minter = msg.sender;18 }1920 // Sends an amount of newly created coins to an address // Mengirim sejumlah koin yang baru dibuat ke sebuah alamat21 // Can only be called by the contract creator // Hanya dapat dipanggil oleh pembuat kontrak22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Sends an amount of existing coins // Mengirim sejumlah koin yang ada29 // from any caller to an address // dari pemanggil mana pun ke sebuah alamat30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Insufficient balance.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Tampilkan semuaContoh ini akan memberi Anda gambaran tentang seperti apa sintaksis kontrak Solidity. Untuk deskripsi yang lebih mendetail tentang fungsi dan variabel, lihat dokumentasinya (opens in a new tab).
Vyper
- Bahasa pemrograman Pythonic
- Pengetikan yang kuat
- Kode kompilator yang kecil dan mudah dipahami
- Pembuatan bytecode yang efisien
- Sengaja memiliki lebih sedikit fitur daripada Solidity dengan tujuan membuat kontrak lebih aman dan lebih mudah diaudit. Vyper tidak mendukung:
- Modifier
- Pewarisan
- Inline assembly
- Function overloading
- Operator overloading
- Pemanggilan rekursif
- Perulangan tak terbatas
- Titik tetap biner
Untuk informasi lebih lanjut, baca rasional Vyper (opens in a new tab).
Tautan penting
- Dokumentasi (opens in a new tab)
- Vyper by Example (opens in a new tab)
- Lebih Banyak Vyper by Example (opens in a new tab)
- GitHub (opens in a new tab)
- Obrolan Discord komunitas Vyper (opens in a new tab)
- Lembar Sontekan (opens in a new tab)
- Kerangka kerja dan alat pengembangan kontrak pintar untuk Vyper
- VyperPunk - belajar mengamankan dan meretas kontrak pintar Vyper (opens in a new tab)
- Vyper Hub untuk pengembangan (opens in a new tab)
- Contoh kontrak pintar Vyper greatest hits (opens in a new tab)
- Sumber daya kurasi Awesome Vyper (opens in a new tab)
Contoh
1# Open Auction # Lelang Terbuka23# Auction params # Parameter lelang4# Beneficiary receives money from the highest bidder # Penerima manfaat menerima uang dari penawar tertinggi5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Current state of auction # Status lelang saat ini10highestBidder: public(address)11highestBid: public(uint256)1213# Set to true at the end, disallows any change # Ditetapkan menjadi true pada akhirnya, tidak mengizinkan perubahan apa pun14ended: public(bool)1516# Keep track of refunded bids so we can follow the withdraw pattern # Melacak penawaran yang dikembalikan sehingga kita dapat mengikuti pola penarikan17pendingReturns: public(HashMap[address, uint256])1819# Create a simple auction with `_bidding_time` # Buat lelang sederhana dengan `_bidding_time`20# seconds bidding time on behalf of the # detik waktu penawaran atas nama21# beneficiary address `_beneficiary`. # alamat penerima manfaat `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Bid on the auction with the value sent # Menawar pada lelang dengan nilai yang dikirimkan29# together with this transaction. # bersama dengan transaksi ini.30# The value will only be refunded if the # Nilai hanya akan dikembalikan jika31# auction is not won. # lelang tidak dimenangkan.32@external33@payable34def bid():35 # Check if bidding period is over. # Periksa apakah periode penawaran telah berakhir.36 assert block.timestamp < self.auctionEnd37 # Check if bid is high enough # Periksa apakah penawaran cukup tinggi38 assert msg.value > self.highestBid39 # Track the refund for the previous high bidder # Lacak pengembalian dana untuk penawar tertinggi sebelumnya40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Track new high bid # Lacak penawaran tertinggi baru42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Withdraw a previously refunded bid. The withdraw pattern is # Tarik penawaran yang sebelumnya dikembalikan. Pola penarikan46# used here to avoid a security issue. If refunds were directly # digunakan di sini untuk menghindari masalah keamanan. Jika pengembalian dana langsung47# sent as part of bid(), a malicious bidding contract could block # dikirim sebagai bagian dari bid(), kontrak penawaran berbahaya dapat memblokir48# those refunds and thus block new higher bids from coming in. # pengembalian dana tersebut dan dengan demikian memblokir penawaran baru yang lebih tinggi untuk masuk.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# End the auction and send the highest bid # Akhiri lelang dan kirim penawaran tertinggi56# to the beneficiary. # ke penerima manfaat.57@external58def endAuction():59 # It is a good guideline to structure functions that interact # Ini adalah pedoman yang baik untuk menyusun fungsi yang berinteraksi60 # with other contracts (i.e., they call functions or send ether) # dengan kontrak lain (yaitu, mereka memanggil fungsi atau mengirim ether)61 # into three phases: # ke dalam tiga fase:62 # 1. checking conditions # 1. memeriksa kondisi63 # 2. performing actions (potentially changing conditions) # 2. melakukan tindakan (berpotensi mengubah kondisi)64 # 3. interacting with other contracts # 3. berinteraksi dengan kontrak lain65 # If these phases are mixed up, the other contract could call # Jika fase-fase ini dicampuradukkan, kontrak lain dapat memanggil66 # back into the current contract and modify the state or cause # kembali ke kontrak saat ini dan memodifikasi status atau menyebabkan67 # effects (ether payout) to be performed multiple times. # efek (pembayaran ether) dilakukan berkali-kali.68 # If functions called internally include interaction with external # Jika fungsi yang dipanggil secara internal mencakup interaksi dengan69 # contracts, they also have to be considered interaction with # kontrak eksternal, mereka juga harus dianggap sebagai interaksi dengan70 # external contracts. # kontrak eksternal.7172 # 1. Conditions # 1. Kondisi73 # Check if auction endtime has been reached # Periksa apakah waktu akhir lelang telah tercapai74 assert block.timestamp >= self.auctionEnd75 # Check if this function has already been called # Periksa apakah fungsi ini sudah dipanggil76 assert not self.ended7778 # 2. Effects # 2. Efek79 self.ended = True8081 # 3. Interaction # 3. Interaksi82 send(self.beneficiary, self.highestBid)Tampilkan semuaContoh ini akan memberi Anda gambaran tentang seperti apa sintaksis kontrak Vyper. Untuk deskripsi yang lebih mendetail tentang fungsi dan variabel, lihat dokumentasinya (opens in a new tab).
Yul dan Yul+
Jika Anda baru mengenal Ethereum dan belum pernah melakukan pengodean dengan bahasa kontrak pintar, kami menyarankan Anda untuk memulai dengan Solidity atau Vyper. Pelajari Yul atau Yul+ hanya setelah Anda familier dengan praktik terbaik keamanan kontrak pintar dan spesifikasi bekerja dengan EVM.
Yul
- Bahasa perantara untuk Ethereum.
- Mendukung EVM dan Ewasm (opens in a new tab), WebAssembly dengan cita rasa Ethereum, dan dirancang untuk menjadi penyebut umum yang dapat digunakan dari kedua platform tersebut.
- Target yang baik untuk tahap pengoptimalan tingkat tinggi yang dapat menguntungkan platform EVM dan Ewasm secara setara.
Yul+
- Ekstensi tingkat rendah dan sangat efisien untuk Yul.
- Awalnya dirancang untuk kontrak optimistic rollup.
- Yul+ dapat dilihat sebagai proposal peningkatan eksperimental untuk Yul, yang menambahkan fitur-fitur baru ke dalamnya.
Tautan penting
- Dokumentasi Yul (opens in a new tab)
- Dokumentasi Yul+ (opens in a new tab)
- Pos Pengantar Yul+ (opens in a new tab)
Contoh kontrak
Contoh sederhana berikut mengimplementasikan fungsi pangkat. Ini dapat dikompilasi menggunakan solc --strict-assembly --bin input.yul. Contoh ini harus disimpan dalam file input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}Tampilkan semuaJika Anda sudah sangat berpengalaman dengan kontrak pintar, implementasi ERC20 penuh di Yul dapat ditemukan di sini (opens in a new tab).
Fe
- Bahasa yang diketik secara statis untuk Mesin Virtual Ethereum (EVM).
- Terinspirasi oleh Python dan Rust.
- Bertujuan agar mudah dipelajari -- bahkan untuk pengembang yang baru mengenal ekosistem Ethereum.
- Pengembangan Fe masih dalam tahap awal, bahasa ini merilis versi alfanya pada Januari 2021.
Tautan penting
- GitHub (opens in a new tab)
- Pengumuman Fe (opens in a new tab)
- Peta Jalan Fe 2021 (opens in a new tab)
- Obrolan Discord Fe (opens in a new tab)
- Twitter Fe (opens in a new tab)
Contoh kontrak
Berikut ini adalah kontrak sederhana yang diimplementasikan di Fe.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Tampilkan semuaCara memilih
Sama seperti bahasa pemrograman lainnya, ini sebagian besar tentang memilih alat yang tepat untuk pekerjaan yang tepat serta preferensi pribadi.
Berikut adalah beberapa hal yang perlu dipertimbangkan jika Anda belum mencoba salah satu bahasa tersebut:
Apa yang hebat dari Solidity?
- Jika Anda seorang pemula, ada banyak tutorial dan alat pembelajaran di luar sana. Lihat selengkapnya tentang hal itu di bagian Belajar dengan Membuat Kode.
- Tersedia perkakas pengembang yang baik.
- Solidity memiliki komunitas pengembang yang besar, yang berarti Anda kemungkinan besar akan menemukan jawaban atas pertanyaan Anda dengan cukup cepat.
Apa yang hebat dari Vyper?
- Cara yang bagus untuk memulai bagi pengembang Python yang ingin menulis kontrak pintar.
- Vyper memiliki jumlah fitur yang lebih sedikit yang membuatnya bagus untuk pembuatan prototipe ide secara cepat.
- Vyper bertujuan agar mudah diaudit dan dapat dibaca manusia secara maksimal.
Apa yang hebat dari Yul dan Yul+?
- Bahasa tingkat rendah yang sederhana dan fungsional.
- Memungkinkan untuk lebih dekat dengan EVM mentah, yang dapat membantu mengoptimalkan penggunaan gas dari kontrak Anda.
Perbandingan bahasa
Untuk perbandingan sintaksis dasar, siklus hidup kontrak, antarmuka, operator, struktur data, fungsi, alur kontrol, dan lainnya, lihat lembar sontekan oleh Auditless (opens in a new tab) ini.