Lanjut ke konten utama
Change page

Bahasa kontrak pintar

Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 9 Januari 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.

Contoh kontrak

1// SPDX-License-Identifier: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // Kata kunci "publik" membuat variabel
6 // dapat diakses dari kontrak lain
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Aksi memungkinkan klien bereaksi pada perubahan
11 // kontrak spesifik yang Anda deklarasikan
12 event Sent(address from, address to, uint amount);
13
14 // Kode pembanguan hanya dijalankan saat kontrak
15 // dibuat
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Mengirim sejumlah koin yang baru dibuat ke satu alamat
21 // Hanya bisa dipanggil oleh pembuat kontrak
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Mengirim sejumlah koin yang telah ada
29 // dari pemanggil manapun ke satu alamat
30 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 semua
Salin

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).

Contoh

1# Pelelangan Terbuka
2
3# Parameter pelelangan
4# Penjual menerima uang dari penawar harga tertinggi
5beneficiary: public(address)
6auctionStart: public(uint256)
7auctionEnd: public(uint256)
8
9# State pelelangan saat ini
10highestBidder: public(address)
11highestBid: public(uint256)
12
13# Tetapkan ke benar pada akhirnya, tolak perubahan apapun
14ended: public(bool)
15
16# Lacak penawaran yang dibayarkan kembali sehingga kita bisa mengikuti pola penarikan
17pendingReturns: public(HashMap[address, uint256])
18
19# Buat satu pelelangan sederhana dengan `_bidding_time`
20# waktu pelelangan kedua atas nama
21# alamat penjual `_beneficiary`.
22@external
23def __init__(_beneficiary: address, _bidding_time: uint256):
24 self.beneficiary = _beneficiary
25 self.auctionStart = block.timestamp
26 self.auctionEnd = self.auctionStart + _bidding_time
27
28# Tawarkan harga pada pelelangan dengan nilai yang dikirim
29# bersama dengan transaksi ini.
30# Nilai ini hanya akan dibayarkan kembali jika
31# pelelangan tidak dimenangkan.
32@external
33@payable
34def bid():
35 # Periksa jika masa penawaran telah berakhir.
36 assert block.timestamp < self.auctionEnd
37 # Periksa jika penawaran cukup tinggi
38 assert msg.value > self.highestBid
39 # Lacak pembayaran kembali untuk penawar tinggi sebelumnya
40 self.pendingReturns[self.highestBidder] += self.highestBid
41 # Lacak penawaran tinggi baru
42 self.highestBidder = msg.sender
43 self.highestBid = msg.value
44
45# Tarik penawaran yang dibayarkan kembali sebelumnya. Pola penarikan
46# digunakan di sini untuk menghindari masalah keamanan. Jika pembayaran kembali secara langsung
47# dikirim sebagai bagian penawaran(), satu kontrak penawaran jahat bisa menghalangi
48# pembayaran kembali itu dan dengan demikian menghalangi tawaran baru lebih tinggi masuk ke dalam.
49@external
50def withdraw():
51 pending_amount: uint256 = self.pendingReturns[msg.sender]
52 self.pendingReturns[msg.sender] = 0
53 send(msg.sender, pending_amount)
54
55# Akhiri pelelangan dan kirim penawaran tertinggi
56# ke penjual.
57@external
58def endAuction():
59 # Ini adalah pedoman yang bagus untuk menyusun fungsi yang berinteraksi
60 # dengan kontrak lain (maksudnya mereka memanggil fungsi atau mengirim ether)
61 # ke dalam tiga fase:
62 # 1. kondisi pemeriksaan
63 # 2. melakukan aksi (kondisi perubahan potensial)
64 # 3. berinteraksi dengan kontrak lain
65 # Jika fase ini tercampur, kontrak lain bisa memanggil
66 # kembali ke kontrak saat ini dan memodifikasi state atau sebab
67 # akibat (pembayaran ether) untuk dilakukan berkali - kali.
68 # Jika fungsi yang dipanggil secara internal mencakup interaksi dengan kontrak
69 # eksternal, mereka juga harus dianggap interaksi dengan
70 # kontrak eksternal.
71
72 # 1. Kondisi
73 # Periksa jika waktu selesai pelelangan telah dicapai
74 assert block.timestamp >= self.auctionEnd
75 # Periksa jika fungsi ini telah dipanggil
76 assert not self.ended
77
78 # 2. Efek
79 self.ended = True
80
81 # 3. Interaksi
82 send(self.beneficiary, self.highestBid)
Tampilkan semua
Salin

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.

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) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
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.

Contoh kontrak

Berikut ini adalah kontrak sederhana yang diimplementasikan dalam Fe.

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 pub def get_msg(addr: address) -> BookMsg:
15 return self.guest_book[addr].to_mem()
16
Tampilkan 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

Bacaan lebih lanjut

Apakah artikel ini membantu?