Memahami Vyper: Bahasa Ethereum Baru yang licin

Panduan komprehensif mengenai Vyper, bahasa Ethereum baru yang licin

Vyper adalah bahasa pengaturcaraan eksperimental tujuan umum yang disusun ke dalam kod bytec EVM (Mesin Maya Ethereum), seperti halnya Soliditas. Walau bagaimanapun, Vyper dirancang untuk mempermudah proses secara besar-besaran untuk membuat Kontrak Pintar yang lebih mudah difahami yang lebih telus untuk semua pihak yang terlibat, dan mempunyai lebih sedikit titik masuk untuk serangan.

Mana-mana kod yang mensasarkan EVM mestilah sangat cekap untuk meminimumkan gas yang diperlukan untuk dilaksanakan oleh Kontrak Pintar, kerana kontrak dengan kod yang tidak cekap harganya lebih mahal untuk dilaksanakan, dan dengan cepat boleh menjadi mahal, terutamanya dalam kes penggunaan seperti mikro- urus niaga. Hasil akhirnya adalah bahawa Vyper secara logik mirip dengan Kelenturan, dan secara sintaksis serupa dengan Python, tetapi tanpa banyak paradigma Pemrograman Berorientasikan Objek – mungkin memerlukan definisi paradigma baru untuk pengaturcaraan transaksional.

Mempelajari perbezaan logik dan sintaksis ini sekarang akan membantu anda menjadi pembangun Vyper bertaraf dunia kerana Vyper masih dalam v0.1.0-beta.1 sehingga Jun 2018!

Memahami Vyper

0. Membandingkan Python, Vyper, dan Solid

Di sini, kita membahas “mengapa” tahap tinggi Vyper – memberikan titik awal bagi kita untuk menganalisis dan menulis kod Vyper, termasuk Kontrak Pintar.

Penambahbaikan Utama 1: Kesederhanaan

Vyper tidak mengandungi banyak konstruk yang tidak asing lagi bagi kebanyakan pengaturcara: Pewarisan kelas, kelebihan fungsi, kelebihan operator, dan pengulangan. Tidak satu pun dari ini secara teknikal diperlukan untuk bahasa Turing yang lengkap, dan ini mewakili risiko keselamatan dengan meningkatkan kerumitan. Oleh kerana kerumitan ini, konstruk ini akan menjadikan Kontrak Pintar terlalu sukar untuk difahami dan diaudit oleh orang awam, seperti yang dilihat dalam kontrak Soliditi.

Konstruk yang kurang biasa yang juga tidak disertakan adalah pengubah (ini menjadikannya terlalu mudah untuk menulis kod yang mengelirukan), pemasangan sebaris (ini memecahkan Ctrl + F), dan titik tetap binari (perkiraan sering diperlukan dengan titik tetap binari).

Penambahbaikan Utama 2: Keselamatan

Dalam kata-kata pemaju Vyper sendiri, Vyper

“Dengan sengaja akan melarang sesuatu atau membuat sesuatu menjadi lebih sukar jika dianggap sesuai untuk tujuan meningkatkan keselamatan.”

Oleh itu, Vyper bukan pengganti akhir untuk Soliditas, tetapi lebih tepat untuk digunakan di mana sahaja keselamatan terpenting, seperti Smart Kontrak yang mengendalikan metadata kesihatan pesakit atau kecerunan model untuk Decentralized AI.; Pp0

Kod Vyper dan Perbezaan Sintaksis

Vyper dibangun agar serupa dengan Python mungkin sambil berusaha untuk mencapai tujuan keselamatan dan kesederhanaan, sehingga keseluruhan nuansa bahasa adalah sama, walaupun ada banyak perbezaan yang perlu diperhatikan.

Melaksanakan Fail

Sementara skrip Python dijalankan sebagai

python file_name.py

, skrip vyper disusun menggunakan

vyper file_name.vy.

Nyatakan Pemboleh ubah

Pemboleh ubah keadaan adalah nilai yang disimpan secara kekal dalam penyimpanan kontrak dan boleh menjadi jenis apa pun, seperti:

contohStateVariable: int256.

Pemetaan

Perkara pertama yang terdapat dalam kontrak Vyper adalah bidang penyimpanan kontrak, seperti pemetaan baki token:

baki: awam (nilai [alamat]]

yang merupakan pemboleh ubah keadaan yang menentukan kunci dan nilai yang sepadan.

Pemetaan Vyper pada dasarnya adalah tabel hash yang diinisialisasi, seperti yang dilihat di atas, sehingga

“Setiap kunci yang mungkin ada dan dipetakan ke nilai yang byte-representasinya adalah semua nol: nilai lalai jenis.”

Data utama tidak disimpan dalam pemetaan, tetapi hanya keccak256 hashnya untuk mencari nilainya.

Dalam menentukan keseimbangan, jenis awam () diberikan, diikuti oleh sintaks pemetaan: Di mana jenis nilai wei_value diberikan pertama, diikuti oleh kunci (alamat) dalam tanda kurung persegi – serupa dengan pengendalian susunan Python.

Definisi

Anda akan melihat bahawa Vyper menggunakan titik dua dalam menentukan nama (seperti baki) berbanding tanda sama Python, walaupun Python 3.6 menyertakan sintaks yang sama untuk anotasi berubah-ubah:

konteks = {} # konteks kamus kosong ["a"]: 2 # pembolehubah kamus anotasi

Di mana sintaks kolon adalah untuk anotasi berubah-ubah, dan titik dua digunakan sebagai operator penugasan yang memberikan anotasi jenis sahaja. Vyper menggunakan sintaks ini untuk penetapan nilai benar.

Jenis Integer

Vyper hanya mempunyai dua jenis bilangan bulat: uint256 (untuk bilangan bulat bukan negatif) dan int128 (untuk bilangan bulat yang ditandatangani) – berbanding dengan Solidity’s uint8 hingga uint256 dalam langkah 8, dan sama untuk int8 hingga int256 (ini bermaksud 64 kata kunci berbeza untuk jenis int).

Booleans, Operator, Perbandingan, dan Fungsi

Vyper mempunyai sintaks hampir sama dengan Python bagi kebanyakan pengendali, termasuk:

booleans benar dan salah; bukan, dan, atau, ==, dan! = pengendali; <, <=, ==,! =, >=, dan > perbandingan; dan +, -, *, /, **, dan% operator aritmetik (hanya untuk int128)

Serta beberapa fungsi terbina dalam yang serupa:

len (x) untuk mengembalikan panjang int; lantai (x) untuk membulatkan perpuluhan hingga ke int terdekat; dan siling (x) untuk membulatkan perpuluhan hingga int terdekat

Dan beberapa yang baru:

sha3 (x) untuk mengembalikan hash sha3 sebagai bait 32; concat (x, …) untuk menggabungkan pelbagai input; slice (x, start = _start, len = _len) untuk mengembalikan potongan _len bermula pada _start

Senarai

Daftar di Vyper dinyatakan menggunakan format _name: _ValueType [_Integer], semasa menetapkan nilai dan pernyataan pengembalian mempunyai sintaks yang sama dengan Py = thon.

Sebagai contoh:

lst: int128 [3] # tentukan senarai lst = [1, 2, 3] # tetapkan nilai lst [2] = 5 # tetapkan nilai mengikut indeks kembali lst [0] # pulangkan 1

Struktur

Struktur adalah jenis yang anda tentukan, pemboleh ubah kumpulan, dan diakses menggunakan struct.argname, seperti itu (agak serupa dengan kamus Python):

struct: {# tentukan struct

arg1: int128, arg2: perpuluhan

} struct.arg1 = 1 #access arg1 dalam struct

Kaedah Menentukan

Kaedah (kaedah kontrak dalam Vyper) didefinisikan dengan cara yang sama dalam Python dan Vyper:

kaedah def ():

lakukan sesuatu()

Sebagai tambahan kepada apa yang disediakan oleh Python, Vyper termasuk penghias khusus Ethereum seperti @pembayaran dan @assert – yang pertama membuat kontrak dapat melakukan transaksi dan yang kedua menggunakan ungkapan boolean:

Perhatikan def function_name (arg1, arg2,…, argx) -> output: sintaks untuk menentukan fungsi. Tidak seperti di Python, Vyper secara jelas menentukan jenis output di garis def selepas ->.

Fungsi Pembina

Fungsi Konstruktor menggunakan konvensi yang sama dengan Python dan menunjukkan kontrak dan parameter tertentu pada blockchain. Init memulakan program dan dilaksanakan hanya sekali. Sebagai contoh:

@public def __init __ (_ name: bytes32, _decimals: uint256, _initialSupply: uint256):

self.name = _name self.decimals = _decimals self.totalSupply = uint256_mul (_initialSupply, uint256_exp (tukar (5, ‘uint256’), _decimals))

Seperti di Python, diri digunakan untuk menegaskan pemboleh ubah contoh. Fungsi di atas dihiasi dengan @ penghias awam untuk memberikan keterlihatan umum dan membenarkan entiti luaran memanggilnya (berbanding dengan lalai – atau meninggalkan penghias – yang bersifat peribadi).

Penghias @konstant digunakan untuk menghias kaedah yang hanya membaca keadaan, sementara @pembayaran membuat kaedah yang boleh dipanggil dengan pembayaran.

Acara

Anda boleh mencatat peristiwa menggunakan __log__ dalam struktur terindeks, seperti:

pembayaran: __log __ ({jumlah: uint256, param2: diindeks (alamat)}) tot_payment: uint256 @public def pay ():

self.tot_payment + = msg.value log.payment (msg.value, msg.sender)

Menulis Kontrak Vyper

Sekarang, mari tulis beberapa Kontrak Pintar yang mudah. Coretan kod berikut membolehkan kontrak menerima NFT (token tidak mudah alih) dan dapat menghantar terhadap token tersebut.

@public def safeTransferFrom (_from: address, _to: address, _tokenId: uint256):

self._validateTransferFrom (_from, _to, _tokenId, msg.sender) self._doTransfer (_from, _to, _tokenId) jika (_to.codesize > 0):

returnValue: bytes [4] = raw_call (_to, ‘xf0xb9xe5xba’, ukuran besar = 4, gas = msg.gas)

tegaskan returnValue == ‘xf0xb9xe5xba’

Berikut menunjukkan bahawa @ penghias awam, mendefinisikan fungsi dengan parameter tunggal yang secara eksplisit diberi jenis, dan badan kod sederhana menggunakan pernyataan tegas untuk mengesahkan apakah pengguna berhak memilih sebagai bagian dari program “voting with delegation”:

# Beri hak pengundi untuk memilih pada surat suara ini # Ini hanya boleh dipanggil oleh ketua @publik def give_right_to_vote (pemilih: alamat):

menegaskan msg.sender == self.chairperson # membuang jika pengirim bukan ketua menegaskan tidak self.voters [voter] .voting # throw jika pengundi sudah memilih menegaskan self.voters [voter] .weight == 0 # membuang jika pemilih mengundi berat tidak 0

self.voters [voter] .weight = 1 self.voter_count + = 1

Setelah membincangkan pembezaan sintaksis dan logik, kod tersebut tidak terlalu menakutkan. vyper.online menawarkan keseluruhan kod sumber untuk program “voting with delegation”, menggunakan struktur untuk pemilih dan cadangan, dan fungsi-fungsi berikut yang sesuai:

def delegated (alamat: alamat) -> bool def secara langsung_voting (addr: address) -> bool def __init __ (_ proposalNames: bytes32 [2]) def give_right_to_vote (voter: address) def forward_weight (delegate_with_weight_to_forward: address) def delegate (to: address) def vote (proposal: int128) def win_proposal () -> int128 def pemenang_nama () -> bait32

Seperti mana-mana bahasa pengaturcaraan, merancang konstruk utama (dalam kes ini, kontrak fungsi) terlebih dahulu menjadikan pengaturcaraan lebih mudah. Perbezaan utama Vyper yang perlu diingat adalah kekurangan paradigma OOP. Pada peringkat perkembangan semasa, anda belum dapat membuat panggilan kod luaran.

Pertimbangan untuk membenarkan panggilan kod luaran dapat dilihat dalam cadangan pengembangan berikut:

# Kontrak luaran A:

def foo (): bar def berterusan (): mengubah suai # Kontrak kontrak ini B: a: A def baz (): a.foo () a.bar ()

Di mana kontrak B memanggil kontrak A, termasuk kaedah dalam A, dalam contoh yang paling mudah.

Menjalankan Vyper

Untuk mengikuti penulisan kod, pergi ke vyper.online, dan tulis contoh kod di bawah tab “Source Code” dan klik “Compile” apabila siap. Pelanggan yang paling sering digunakan (walaupun dalam pra-alpha) untuk pelaksanaan dan pelaksanaan ujian Vyper adalah Py-EVM, yang dikembangkan pada awalnya oleh Vitalik sendiri, yang memungkinkan pengguna untuk menambahkan opkod atau mengubah yang sudah ada tanpa mengubah perpustakaan teras, memungkinkan modularitas yang jauh lebih besar dan kepanjangan daripada dengan pelanggan biasa.

Untuk mendapatkan Py-EVM, gunakan pip install py-evm == 0.2.0a16.

3a. Menggunakan Kontrak Vyper

Walaupun Py-EVM kini dalam pra-alpha dan mungkin sukar untuk dijalankan, ada dua alternatif yang lebih mudah untuk menerapkan kontrak Vyper ke testnet awam (dan bonus):

1) Tampal kod bytec yang dihasilkan dari vyper.online ke dalam Mist atau geth

2) Gunakan menu kontrak myetherwallet untuk digunakan di penyemak imbas semasa 3) (Akan Datang)

Di masa depan, Vyper akan disatukan dengan populus, yang membolehkan anda menggunakan kontrak Vyper dengan mudah

Demi kesederhanaan, kami akan menerapkan kontrak menggunakan pilihan (1) dan Mist (UI baru di atas geth berbanding geth berasaskan terminal). Oleh kerana Vyper menyusun ke Bytecode yang sama dengan Solidity, kami tidak memerlukan klien khusus Vyper, dan dapat mengikuti langkah-langkah yang agak bulat ini:

  1. Pergi ke vyper.online dan klik “Compile” pada “Source Code” pengundian yang telah diisi sebelumnya
  2. Salin semua di bawah tab “Bytecode”
  3. Pasang Mist untuk OS anda, jika anda belum melakukannya
  4. Benarkan nod memuat turun dan menyegerakkan (ini berlaku secara automatik)
  5. Pilih “GUNAKAN RANGKAIAN UJIAN” dalam persediaan Mist
  6. Buat kata laluan (dan ingatlah …)
  7. Masukkan Kontrak
  8. Pilih “Kontrak” di antara muka Mist
  9. Pilih “DEPLOY BARU KONTRAK”
  10. Pergi ke tab “KONTRAK BYTE CODE”
  11. Tampal di Bytecode yang anda salin dari vyper.online

Terapkan Kontrak

  1. Pilih “DEPLOY” dan masukkan kata laluan dari sebelumnya
  2. Pastikan kontrak Vyper telah digunakan
  3. Pergi ke tab “Dompet” di Mist
  4. Tatal ke bawah ke “Transaksi Terkini”
  5. Anda harus melihat kontrak yang baru kami gunakan!

*Walaupun dalam keadaan “Membuat Kontrak” tidak ditambang dan disahkan

Kesimpulannya

Panduan ini memberikan pengenalan logik dan sintaksis kepada Vyper, yang membolehkan kami memulakan pengaturcaraan dan penggunaan kontrak. Dengan pengetahuan dari panduan ini, anda seharusnya dapat menyumbang kepada pengembangan Vyper, dokumentasinya, dan terus belajar dengan membuat pengekodan di vyper.online.

Sekali lagi, Vyper tidak dimaksudkan untuk menggantikan Solidity, tetapi kerana satu kajian mendapati lebih dari 34,000 kontrak rentan, keperluan untuk keamanan yang lebih kuat di ruang ini lebih besar dari sebelumnya, memberikan Vyper masa depan penting di Ethereum

Bacaan Lebih Lanjut dan Peta Jalan

Oleh kerana Vyper masih dalam pengembangan eksperimen, dokumentasi rasmi dan GitHub adalah sumber yang paling komprehensif, dengan nilai berikut juga:

01.Gitter Komuniti Vyper

02.Alat dan Sumber Vyper

03. “Halaman Ethereum ”di Vyper

04.Kajian: “Mencari Kontrak Serakah, Hantu, dan Bunuh Diri pada Skala”

05.“Panduan Langkah-demi-Langkah: Bermula dengan Ethereum Mist Wallet”

07.Menguji dan Menggunakan Kontrak Vyper

08. “Bina Kontrak Pintar Ethereum Pertama Anda dengan Ketahanan – Tutorial ” [Menyamaratakan langkah-langkah untuk menyesuaikan Vyper cukup mudah]

Langkah pengembangan Vyper ke versi 1.0 memfokuskan pada antaramuka (serta penambahbaikan dalam panggilan dalaman dan luaran, antara lain), yang menentukan kekangan sehingga anda dapat berkomunikasi dengan objek apa pun yang melaksanakan antara muka tersebut. Antaramuka membolehkan penyelesaian alternatif untuk meningkatkan Kontrak Pintar, jadi mereka tidak diperlukan untuk fungsi asas, dan anda boleh mula membuat pengekodan di Vyper walaupun bahasanya tidak lengkap..

Peta jalan pengembangan ke versi 1.0, diambil dan diedit dari Vyper’s gitter:

01. Dua jenis fail: antara muka (satu antara muka setiap fail) dan kontrak (satu kontrak

setiap fail).

02. Anda boleh menentukan antara muka seperti ERC721Metadata dalam fail antara muka dan juga dalam

fail kontrak.

03. Fail antara muka serasi satu dengan satu sepenuhnya dengan Ethereum ABI.

04. Tulis penterjemah dari antara muka Solidity to Vyper.

05. Buat perpustakaan semua antara muka ERC akhir, walaupun anda harus membuat secara manual

mereka.

06. Impor antara muka dari fail antara muka ke kontrak.

07. Antaramuka adalah jenis yang menghiasi alamat.

08. Antaramuka boleh mewarisi antara muka lain.

09. Teliti ID antara muka dengan teliti dari ERC-165 dan hasilkan semula contoh yang diberikan dalam

ERC-721 ini berkaitan dengan bagaimana antara muka mewarisi antara muka lain.

10. Antaramuka mungkin mempunyai fungsi pilihan. (Keruntuhan dari kekukuhan.)

11. Kontrak dapat melaksanakan antara muka.

12. Kontrak yang melaksanakan antara muka tetapi tidak melaksanakan yang diperlukan

fungsi adalah KESALAHAN.

13. Kontrak yang melaksanakan antara muka tetapi tidak melaksanakan pilihan

fungsi bukan KESALAHAN dan AMARAN.

14. Namakan semula @public menjadi @external agar sepadan dengan Solidity.

15. Memperkenalkan penghias fungsi baru @ dalaman yang membolehkan fungsi dipanggil

secara dalaman.

16. Memperkenalkan semula sintaks panggilan fungsi yang kini digunakan untuk panggilan luaran (dikeluarkan dalam

langkah 14) tetapi adakah ia berlaku untuk panggilan dalaman.

17. Laksanakan panggilan luaran seperti ini: Jadual panggilan lompat luaran -> LOADCALLDATA

membongkar -> tambah parameter fungsi untuk disusun -> memanggil fungsi dalaman -> lakukan fungsi

barang.

18. Laksanakan panggilan dalaman seperti ini: tambahkan parameter fungsi ke tumpukan -> panggil dalaman

fungsi -> melakukan perkara fungsi.

Seperti yang dapat anda lihat dari kod yang telah kami tulis, Vyper membuat kemajuan besar dalam pengembangannya, dan hanya mempunyai beberapa kemas kini utama (dipecahkan kepada langkah-langkah yang lebih kecil di atas) sehingga 1.0 dilepaskan!

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
map