Bahasa kontrak pintar
Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 17 Juni 2024
Aspek keren tentang Ethereum adalah kontrak pintar bisa diprogram menggunakan bahasa yang ramah bagi pengembang. Jika Anda berpengalaman dalam penggunaan Python atau bahasa tanda kurung kurawal(opens in a new tab), Anda dapat menemukan bahasa dengan sintaksis yang dikenal.
Dua bahasa yang paling aktif dan dipertahankan adalah:
- Solidity
- Vyper
Pengembang yang lebih berpengalaman mungkin juga mau menggunakan Yul, bahasa tingkat menengah untuk Mesin Virtual Ethereum, atau Yul+, sebuah ekstensi dari Yul.
Jika Anda merasa ingin tahu dan senang membantu menguji bahasa baru yang sedang dalam pengembangan intensif, Anda dapat bereksperimen dengan Fe, sebuah bahasa kontrak pintar yang sedang populer yang saat ini masih dalam tahapan awal.
Prasyarat
Pengetahuan dasar bahasa pemrograman, khususnya JavaScript atau Pyhton, bisa menolong Anda mengerti perbedaan dalam bahasa kontrak pintar. Kami juga menyarankan Anda memahami konsep kontrak pintar sebelum menjelajah terlalu dalam ke perbandingan bahasa. Pengantar kontrak pintar.
Solidity
- Bahasa tingkat tinggi yang berorientasi pada objek untuk mengimplementasikan kontrak pintar.
- Bahasa kurung kurawal yang paling dipengaruhi oleh C++.
- Menggunakan static typing (tipe dari satu variabel dikenal pada waktu pengompilasian).
- Dukungan:
- Warisan (Anda bisa memperluas kontrak lain).
- Pustaka (Anda bisa membuat kode yang dapat digunakan kembali yang bisa Anda panggil dari kontrak berbeda – seperti fungsi statis dalam kelas statis di 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)
- Contoh Solidity(opens in a new tab)
- GitHub(opens in a new tab)
- Ruang Obrolan Gitter Solidity(opens in a new tab) menjembatani Ruang Obrolan Matrix Solidity(opens in a new tab)
- Lembar Kecurangan(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.02pragma solidity >= 0.7.0;34contract Coin {5 // Kata kunci "publik" membuat variabel6 // dapat diakses dari kontrak lain7 address public minter;8 mapping (address => uint) public balances;910 // Aksi memungkinkan klien bereaksi pada perubahan11 // kontrak spesifik yang Anda deklarasikan12 event Sent(address from, address to, uint amount);1314 // Kode pembanguan hanya dijalankan saat kontrak15 // dibuat16 constructor() {17 minter = msg.sender;18 }1920 // Mengirim sejumlah koin yang baru dibuat ke satu alamat21 // Hanya bisa 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 // Mengirim sejumlah koin yang telah ada29 // dari pemanggil manapun ke satu 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 semuaSalin
Contoh ini seharusnya memberi Anda pemahaman seperti apa sintaksis kontrak Solidity. Untuk deskripsi lebih detail tentang fungsi dan variabelnya, lihat dokumen(opens in a new tab).
Vyper
- Bahasa pemrograman Python
- Strong typing
- Kode pengompilasi berukuran kecil yang dapat dimengerti
- Pembuatan kode bita yang efisien
- Disengaja dengan fitur lebih sedikit daripada Solidity yang bertujuan agar kontrak menjadi lebih aman dan lebih mudah untuk diaudit. Vyper tidak mendukung:
- Pengubah
- Warisan
- Kode assembly dalam baris
- Beban berlebih pada fungsi
- Beban berlebih pada operator
- Pemanggilan berulang
- Perulangan dengan panjang tak terbatas
- Titik tetap biner
Untuk informasi selengkapnya, baca prinsip Vyper(opens in a new tab).
Tautan penting
- Dokumentasi(opens in a new tab)
- Contoh Vyper(opens in a new tab)
- Vyper Selengkapnya dengan Contoh(opens in a new tab)
- GitHub(opens in a new tab)
- Obrolan Discord komunitas Vyper(opens in a new tab)
- Lembar Kecurangan(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)
- VyperExamples - Contoh kerentanan Vyper(opens in a new tab)
- Vyper Hub untuk pengembangan(opens in a new tab)
- Contoh kontrak pintar terbaik Vyper(opens in a new tab)
- Sumber daya pilihan Awesome Vyper(opens in a new tab)
Contoh
1# Pelelangan Terbuka23# Parameter pelelangan4# Penjual menerima uang dari penawar harga tertinggi5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# State pelelangan saat ini10highestBidder: public(address)11highestBid: public(uint256)1213# Tetapkan ke benar pada akhirnya, tolak perubahan apapun14ended: public(bool)1516# Lacak penawaran yang dibayarkan kembali sehingga kita bisa mengikuti pola penarikan17pendingReturns: public(HashMap[address, uint256])1819# Buat satu pelelangan sederhana dengan `_bidding_time`20# waktu pelelangan kedua atas nama21# alamat penjual `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Tawarkan harga pada pelelangan dengan nilai yang dikirim29# bersama dengan transaksi ini.30# Nilai ini hanya akan dibayarkan kembali jika31# pelelangan tidak dimenangkan.32@external33@payable34def bid():35 # Periksa jika masa penawaran telah berakhir.36 assert block.timestamp < self.auctionEnd37 # Periksa jika penawaran cukup tinggi38 assert msg.value > self.highestBid39 # Lacak pembayaran kembali untuk penawar tinggi sebelumnya40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Lacak penawaran tinggi baru42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Tarik penawaran yang dibayarkan kembali sebelumnya. Pola penarikan46# digunakan di sini untuk menghindari masalah keamanan. Jika pembayaran kembali secara langsung47# dikirim sebagai bagian penawaran(), satu kontrak penawaran jahat bisa menghalangi48# pembayaran kembali itu dan dengan demikian menghalangi tawaran baru lebih tinggi masuk ke dalam.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# Akhiri pelelangan dan kirim penawaran tertinggi56# ke penjual.57@external58def endAuction():59 # Ini adalah pedoman yang bagus untuk menyusun fungsi yang berinteraksi60 # dengan kontrak lain (maksudnya mereka memanggil fungsi atau mengirim ether)61 # ke dalam tiga fase:62 # 1. kondisi pemeriksaan63 # 2. melakukan aksi (kondisi perubahan potensial)64 # 3. berinteraksi dengan kontrak lain65 # Jika fase ini tercampur, kontrak lain bisa memanggil66 # kembali ke kontrak saat ini dan memodifikasi state atau sebab67 # akibat (pembayaran ether) untuk dilakukan berkali - kali.68 # Jika fungsi yang dipanggil secara internal mencakup interaksi dengan kontrak69 # eksternal, mereka juga harus dianggap interaksi dengan70 # kontrak eksternal.7172 # 1. Kondisi73 # Periksa jika waktu selesai pelelangan telah dicapai74 assert block.timestamp >= self.auctionEnd75 # Periksa jika fungsi ini telah dipanggil76 assert not self.ended7778 # 2. Efek79 self.ended = True8081 # 3. Interaksi82 send(self.beneficiary, self.highestBid)Tampilkan semuaSalin
Contoh ini seharusnya memberi Anda pemahaman seperti apa sintaksis kontrak Vyper. Untuk deskripsi lebih detail tentang fungsi dan variabelnya, lihat dokumen(opens in a new tab).
Yul dan Yul+
Jika Anda baru mengenal Ethereum dan belum pernah melakukan pengodean apa pun dengan bahasa kontrak pintar, kami menyarankan mulai menggunakan Solidity atau Vyper. Hanya lihat Yul atau Yul+ setelah Anda terbiasa dengan praktik terbaik keamanan kontrak pintar dan proses kerja spesifik EVM.
Yul
- Bahasa tingkat menengah untuk Ethereum.
- Mendukung EVM dan Ewasm(opens in a new tab), WebAssembly rasa Ethereum, dan didesain untuk dapat digunakan sebagai pembilang umum untuk kedua platform.
- Target baik untuk fase optimisasi tingkat tinggi yang secara setara dapat menguntungkan baik platform EVM dan Ewasm.
Yul+
- Ekstensi level rendah yang sangat efisien untuk Yul.
- Awalnya dirancang untuk kontrak optimistic rollup (penggabungan yang optimis).
- Yul+ bisa dianggap sebagai proposal peningkatan eksperimental untuk Yul, yang menambahkan fitur baru ke dalamnya.
Tautan penting
- Dokumentasi Yul(opens in a new tab)
- Dokumentasi Yul+(opens in a new tab)
- Playground Yul+(opens in a new tab)
- Postingan Pengantar Yul+(opens in a new tab)
Contoh kontrak
Contoh sederhana berikut ini menerapkan fungsi daya. Bisa dikompilasikan 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 semua
Jika Anda telah sangat berpengalaman dalam kontrak pintar, implementasi ERC20 penuh dalam Yul bisa ditemukan di sini(opens in a new tab).
Fe
- Bahasa static typing untuk Mesin Virtual Ethereum (EVM).
- Terinspirasi oleh Python dan Rust.
- Bertujuan agar mudah dipelajari -- bahkan bagi pengembang yang baru mengenal ekosistem Ethereum.
- Pengembangan Fe masih dalam tahap awal, bahasa ini memiliki rilis alfa pada Januari 2021.
Tautan penting
- GitHub(opens in a new tab)
- Pengumuman Fe(opens in a new tab)
- Roadmap 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 dalam 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 semua
Bagaimana memilihnya
Seperti bahasa pemrograman lainnya, pemilihannya kebanyakan tentang memilih peralatan yang tepat untuk pekerjaan yang sesuai maupun preferensi pribadi.
Berikut adalah beberapa hal yang perlu dipertimbangkan jika Anda belum mencoba bahasa mana pun:
Apa yang hebat dari Solidity?
- Jika Anda seorang pemula, ada banyak tutorial dan peralatan belajar di luar sana. Lihat selengkapnya tentang hal itu dalam bab Belajar melalui Pengodean.
- Peralatan pengembang yang baik disediakan.
- Solidity memiliki satu komunitas pengembang besar, yang berarti Anda sangat mungkin menemukan jawaban dari pertanyaan Anda dengan cukup cepat.
Apa yang hebat dari Vyper?
- Cara yang sangat bagus untuk memulai bagi pengembang Python yang ingin menulis kontrak pintar.
- Vyper punya sejumlah fitur lebih kecil yang membuatnya sangat cocok untuk pembuatan prototipe ide dengan cepat.
- Vyper bertujuan untuk memudahkan pengauditan dan sangat ramah pengguna.
Apa yang hebat dari Yul dan Yul+?
- Bahasa tingkat rendah yang sederhana dan fungsional.
- Memungkinkan agar lebih dekat dengan EVM mentah, yang bisa membantu mengoptimalkan penggunaan gas dari kontrak Anda.
Perbandingan bahasa
Untuk perbandingan sintaksis dasar, siklus hidup kontrak, antarmuka, operator, struktur data, fungsi, alur kontrol, dan banyak lagi lihat lembar kecurangan oleh Auditless(opens in a new tab) ini