Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Seterusnya, kami akan mempertimbangkan secara terperinci ciri-ciri utama bahasa Pindah dan apakah perbezaan utamanya dengan bahasa lain yang sudah popular untuk kontrak pintar - Soliditi (di platform Ethereum). Bahan ini berdasarkan kajian mengenai kertas putih 26 halaman dalam talian yang tersedia.

Pengenalan

Move ialah bahasa bytecode boleh laku yang digunakan untuk melaksanakan transaksi pengguna dan kontrak pintar. Sila ambil perhatian dua perkara:

  1. Walaupun Move adalah bahasa bytecode yang dapat dijalankan secara langsung pada mesin maya Move, Solidity (bahasa kontrak pintar Ethereum) adalah bahasa peringkat tinggi yang pertama kali disusun ke bytecode sebelum dijalankan pada EVM (Ethereum Virtual Machine).
  2. Move boleh digunakan bukan hanya untuk melaksanakan kontrak pintar, tetapi juga untuk transaksi tersuai (lebih lanjut mengenai ini kemudian), sementara Solidity adalah bahasa kontrak pintar sahaja.


Terjemahan telah dijalankan oleh pasukan projek INDEX Protocol. Kami sudah menterjemah bahan besar yang menerangkan projek Libra, kini tiba masanya untuk melihat bahasa Pindah dengan lebih terperinci. Terjemahan telah dijalankan bersama dengan Habrauser coolsiu

Ciri utama Move ialah keupayaan untuk menentukan jenis sumber tersuai dengan semantik berdasarkan logik linear: sumber tidak boleh disalin atau dipadamkan secara tersirat, hanya dialihkan. Secara fungsional, ini serupa dengan keupayaan bahasa Rust. Nilai dalam Rust hanya boleh diberikan kepada satu nama pada satu masa. Menetapkan nilai kepada nama lain menjadikannya tidak tersedia di bawah nama sebelumnya.

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Contohnya, coretan kod berikut akan menimbulkan ralat: Penggunaan nilai bergerak 'x'. Ini kerana tidak ada pengumpulan sampah di Rust. Apabila pemboleh ubah berada di luar ruang lingkup, memori yang mereka rujuk juga dibebaskan. Ringkasnya, hanya ada satu "pemilik" data. Dalam contoh ini x adalah pemilik asal dan kemudian y menjadi pemilik baru. Baca lebih lanjut mengenai tingkah laku ini di sini.

Perwakilan aset digital dalam sistem terbuka

Terdapat dua sifat aset fizikal yang sukar ditunjukkan secara digital:

  • Jarang (Kekurangan, asalnya kekurangan). Jumlah aset (pelepasan) dalam sistem mesti dikawal. Penduaan aset yang ada mesti dilarang, dan membuat yang baru adalah operasi istimewa.
  • Kawalan akses... Peserta sistem mesti dapat melindungi aset menggunakan polisi kawalan akses.

Kedua ciri ini, yang semula jadi untuk aset fizikal, mesti dilaksanakan untuk objek digital jika kita ingin menganggapnya sebagai aset. Contohnya, logam langka mempunyai kelangkaan semula jadi, dan hanya anda yang dapat mengaksesnya (misalnya memegangnya di tangan anda) dan anda boleh menjual atau membelanjakannya.

Untuk menggambarkan bagaimana kami sampai di dua sifat ini, mari kita mulakan dengan ayat berikut:

Cadangan # 1: Peraturan Paling Mudah Tanpa Kekurangan dan Kawalan Akses

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

  • G [K]: = n menunjukkan kemas kini nombor yang boleh diakses dengan kunci К dalam keadaan global blockchain, dengan makna baru n.
  • transaksi ⟨Alice, 100⟩ bermaksud menetapkan baki akaun Alice kepada 100.

Penyelesaian di atas mempunyai beberapa masalah utama:

  • Alice dapat menerima sejumlah wang syiling dengan hanya menghantar transaksi ⟨Alice, 100⟩.
  • Duit syiling yang dikirimkan oleh Alice kepada Bob tidak berguna, kerana Bob dapat mengirim sejumlah wang syiling kepada dirinya sendiri dengan teknik yang sama.

Cadangan # 2: Mengambil kira defisit

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Sekarang kita memantau keadaan sehingga jumlah syiling Ka sekurang-kurangnya sama n sebelum transaksi pemindahan. Walau bagaimanapun, sementara ini menyelesaikan masalah kekurangan, tidak ada maklumat mengenai siapa yang boleh mengirim duit syiling Alice (buat masa ini, ada yang boleh melakukan ini, perkara utama adalah tidak melanggar peraturan mengehadkan jumlahnya).

Cadangan # 3: Menggabungkan kekurangan dan kawalan akses

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Kami menyelesaikan masalah ini dengan mekanisme tandatangan digital sahkan_sig sebelum memeriksa baki, yang bermaksud bahawa Alice menggunakan kunci peribadinya untuk menandatangani transaksi dan mengesahkan bahawa dia adalah pemilik syilingnya.

Bahasa pengaturcaraan blockchain

Bahasa blockchain yang ada menghadapi masalah berikut (semuanya diselesaikan di Move (nota: malangnya, pengarang artikel itu hanya menarik perhatian Ethereum dalam perbandingannya, oleh itu hanya perlu mengambilnya hanya dalam konteks ini. Sebagai contoh, sebahagian besar perkara berikut juga diselesaikan dalam EOS.)):

Perwakilan aset secara tidak langsung. Aset dikodkan menggunakan integer, tetapi integer tidak sama dengan aset. Malah, tiada jenis atau nilai yang mewakili Bitcoin/Ether/<Mana-mana Syiling>! Ini menjadikan penulisan program yang menggunakan aset sukar dan terdedah kepada ralat. Corak seperti menghantar aset ke/dari prosedur atau menyimpan aset dalam struktur memerlukan sokongan khas daripada bahasa.

Defisit tidak dapat diperkembangkan... Bahasa hanya mewakili satu aset langka. Di samping itu, ubat-ubatan terhadap kelangkaan dicantumkan secara langsung ke dalam semantik bahasa itu sendiri. Pemaju, jika dia ingin membuat aset tersuai, mesti mengawal semua aspek sumber itu dengan berhati-hati. Ini betul-betul masalah kontrak pintar Ethereum.

Pengguna mengeluarkan aset mereka, token ERC-20, menggunakan bilangan bulat untuk menentukan nilai dan jumlah penawaran. Setiap kali token baru dibuat, kod kontrak pintar mesti secara bebas mengesahkan pematuhan dengan peraturan pelepasan. Di samping itu, penyampaian aset secara tidak langsung membawa, dalam beberapa kes, kepada kesilapan serius - penduaan, perbelanjaan berganda atau bahkan kehilangan aset sepenuhnya.

Kekurangan kawalan akses yang fleksibel... Satu-satunya dasar kawalan akses yang digunakan hari ini adalah skema tandatangan yang menggunakan kriptografi asimetrik. Seperti perlindungan kekurangan, dasar kawalan akses sangat tertanam dalam semantik bahasa. Tetapi bagaimana memperluas bahasa untuk membolehkan pengaturcara menentukan dasar kawalan akses mereka sendiri adalah tugas yang sangat sukar.

Ini juga berlaku pada Ethereum, di mana kontrak pintar tidak mempunyai sokongan kriptografi asli untuk kawalan akses. Pembangun mesti menetapkan kawalan akses secara manual, contohnya, menggunakan pengubah suai Pemilik sahaja.

Walaupun saya peminat tegar Ethereum, saya percaya bahawa sifat aset harus disokong secara asli oleh bahasa untuk tujuan keselamatan. Khususnya, pemindahan Ether kepada kontrak pintar melibatkan penghantaran dinamik, yang telah memperkenalkan kelas pepijat baharu yang dikenali sebagai kelemahan kemasukan semula. Penghantaran dinamik di sini bermakna logik pelaksanaan kod akan ditentukan pada masa jalan (dinamik) dan bukannya pada masa penyusunan (statik).

Oleh itu, dalam Solidity, apabila kontrak A memanggil fungsi dalam kontrak B, kontrak B boleh menjalankan kod yang tidak dimaksudkan oleh pembangun kontrak A, yang boleh mengakibatkan kelemahan kemasukan semula (kontrak A secara tidak sengaja bertindak sebagai kontrak B untuk mengeluarkan wang sebelum baki akaun sebenarnya ditolak).

Pindahkan Asas Reka Bentuk Bahasa

Sumber pesanan pertama

Pada tahap yang tinggi, interaksi antara modul / sumber / prosedur dalam bahasa Pindah sangat mirip dengan hubungan antara kelas / objek dan kaedah dalam bahasa OOP.
Modul pindah serupa dengan kontrak pintar di rantaian blok lain. Modul menyatakan jenis sumber dan prosedur yang menentukan peraturan untuk membuat, memusnahkan, dan mengemas kini sumber yang diisytiharkan. Tetapi semua ini hanyalah kebiasaan (β€œistilah") Bergerak. Kami akan menerangkan perkara ini sedikit masa kemudian.

Fleksibiliti

Move menambah fleksibiliti kepada Libra melalui skrip. Setiap transaksi dalam Libra termasuk skrip, yang pada asasnya merupakan prosedur teras transaksi. Skrip boleh melakukan sama ada satu tindakan tertentu, contohnya, pembayaran kepada senarai penerima tertentu, atau menggunakan semula sumber lain - contohnya, dengan memanggil prosedur yang logik umum ditentukan. Inilah sebabnya mengapa skrip transaksi Move menawarkan fleksibiliti yang lebih besar. Skrip boleh menggunakan kedua-dua tingkah laku sekali dan berulang, manakala Ethereum hanya boleh melaksanakan skrip boleh berulang (memanggil satu kaedah pada kaedah kontrak pintar). Sebab ia dipanggil "boleh diguna semula" adalah kerana fungsi kontrak pintar boleh dilaksanakan beberapa kali. (Nota: Intinya di sini sangat halus. Di satu pihak, skrip transaksi dalam bentuk pseudo-bytecode juga wujud dalam Bitcoin. Sebaliknya, seperti yang saya fahami, Move mengembangkan bahasa ini, sebenarnya, ke tahap bahasa kontrak pintar sepenuhnya).

keselamatan

Format boleh laku Move ialah bytecode, iaitu, dalam satu pihak, bahasa peringkat lebih tinggi daripada bahasa himpunan, tetapi tahap lebih rendah daripada kod sumber. Bytecode disemak dalam masa jalan (on-chain) untuk sumber, jenis dan keselamatan memori menggunakan pengesah bytecode, dan kemudian dilaksanakan oleh penterjemah. Pendekatan ini membolehkan Move menyediakan keselamatan kod sumber, tetapi tanpa proses penyusunan dan keperluan untuk menambah pengkompil pada sistem. Menjadikan Move bahasa bytecode ialah penyelesaian yang sangat baik. Ia tidak perlu disusun daripada sumber, seperti yang berlaku dengan Solidity, dan tidak perlu risau tentang kemungkinan kegagalan atau serangan ke atas infrastruktur pengkompil.

Pengesahan

Kami bertujuan untuk melakukan semakan semudah mungkin, kerana semua ini dilakukan secara on-chain (nota: dalam talian, semasa pelaksanaan setiap transaksi, jadi sebarang kelewatan menyebabkan perlambatan keseluruhan rangkaian), walau bagaimanapun, pada mulanya reka bentuk bahasa sedia untuk menggunakan alat pengesahan statik luar rantaian. Walaupun ini lebih disukai, buat masa ini pembangunan alat pengesahan (sebagai kit alat berasingan) telah ditangguhkan untuk masa hadapan, dan kini hanya pengesahan dinamik dalam masa jalan (on-chain) disokong.

Modulariti

Modul pindah menyediakan pengabstrakan data dan melokalkan operasi kritikal pada sumber. Enkapsulasi yang disediakan oleh modul, digabungkan dengan perlindungan yang diberikan oleh sistem jenis Move, memastikan bahawa sifat yang ditetapkan pada jenis modul tidak dapat dilanggar oleh kod di luar modul. Ini adalah reka bentuk abstraksi yang dipikirkan dengan baik, yang bermaksud bahawa data dalam kontrak hanya dapat diubah dalam ruang lingkup kontrak, tetapi tidak secara luaran.

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Alihkan gambaran keseluruhan

Contoh skrip transaksi menunjukkan bahawa tindakan jahat atau ceroboh oleh pengaturcara di luar modul tidak boleh menjejaskan keselamatan sumber modul. Seterusnya, kita akan melihat contoh bagaimana modul, sumber daya, dan prosedur digunakan untuk memprogram blockchain Libra.

Pembayaran Peer-to-Peer

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Bilangan syiling yang dinyatakan dalam jumlah akan dipindahkan daripada baki penghantar kepada penerima.
Terdapat beberapa perkara baharu di sini (diserlahkan dengan warna merah):

  • 0x0: alamat akaun di mana modul disimpan
  • mata wang: nama modul
  • Duit syiling: jenis sumber
  • Nilai duit syiling yang dikembalikan oleh prosedur adalah nilai sumber jenis 0x0.Currency.Coin
  • bergerak (): nilai tidak dapat digunakan lagi
  • salinan(): nilai boleh digunakan kemudian

Huraikan kod: pada langkah pertama, pengirim memanggil prosedur yang dinamakan tarik balik_dari_pengirim dari modul yang disimpan di 0x0. Mata Wang. Dalam langkah kedua, pengirim memindahkan dana kepada penerima dengan memindahkan nilai sumber syiling ke dalam prosedur deposit modul 0x0. Mata Wang.

Berikut ialah tiga contoh ralat dalam kod yang akan ditolak oleh semakan:
Gandakan dana dengan menukar panggilan bergerak (duit syiling) pada salinan (duit syiling). Sumber hanya boleh dialihkan. Cuba untuk menduplikasi kuantiti sumber (contohnya, dengan memanggil salinan (duit syiling) dalam contoh di atas) akan menghasilkan ralat semasa memeriksa kod bytek.

Penggunaan semula dana dengan menentukan bergerak (duit syiling) dua kali . Menambah baris 0x0.Currency.deposit (salinan (some_other_payee), pindahkan (syiling)) sebagai contoh, perkara di atas akan membenarkan pengirim untuk "menghabiskan" syiling dua kali - kali pertama dengan penerima, dan yang kedua dengan beberapa_pembayar_lain. Ini adalah tingkah laku yang tidak diingini yang tidak mungkin dilakukan dengan aset fizikal. Nasib baik, Move akan menolak program ini.

Kehilangan dana kerana penolakan bergerak (duit syiling). Jika anda tidak memindahkan sumber (contohnya, dengan memadam baris yang mengandungi bergerak (duit syiling)), ralat pengesahan bytecode akan dilemparkan. Ini melindungi pengaturcara Move daripada kehilangan dana secara tidak sengaja atau berniat jahat.

Modul mata wang

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Setiap akaun boleh mengandungi 0 atau lebih modul (ditunjukkan sebagai segi empat tepat) dan satu atau lebih nilai sumber (ditunjukkan sebagai silinder). Sebagai contoh, akaun di 0x0 mengandungi modul 0x0. Mata Wang dan nilai jenis sumber 0x0.Currency.Coin. Akaun di alamat 0x1 mempunyai dua sumber dan satu modul; Akaun di alamat 0x2 mempunyai dua modul dan satu nilai sumber.

Detik nekotori:

  • Skrip transaksi adalah atom - sama ada ia dilaksanakan sepenuhnya atau tidak sama sekali.
  • Modul ialah sekeping kod tahan lama yang boleh diakses secara global.
  • Keadaan global distrukturkan sebagai jadual cincang, dengan kuncinya ialah alamat akaun
  • Akaun boleh mengandungi tidak lebih daripada satu nilai sumber bagi jenis tertentu dan tidak lebih daripada satu modul dengan nama tertentu (akaun di 0x0 tidak boleh mengandungi sumber tambahan 0x0.Currency.Coin atau modul lain yang dinamakan mata wang)
  • Alamat modul yang diisytiharkan adalah sebahagian daripada jenis (0x0.Currency.Coin ΠΈ 0x1.Currency.Coin adalah jenis berasingan yang tidak boleh digunakan secara bergantian)
  • Pengaturcara boleh menyimpan berbilang contoh jenis sumber ini dalam akaun dengan menentukan sumber tersuai mereka - (sumber TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Anda boleh merujuk kepada sumber dengan namanya tanpa konflik, contohnya anda boleh merujuk kepada dua sumber menggunakan TwoCoins.c1 ΠΈ TwoCoins.c2.

Pengisytiharan Sumber Syiling

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook
Modul dinamakan mata wang dan jenis sumber dinamakan Duit syiling

Detik nekotori:

  • Duit syiling ialah struktur dengan satu bidang jenis u64 (64-bit unsigned integer)
  • Prosedur modul sahaja mata wang boleh mencipta atau memusnahkan nilai jenis Duit syiling.
  • Modul dan skrip lain hanya boleh menulis atau merujuk medan nilai melalui prosedur awam yang disediakan oleh modul.

Jualan deposit

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Prosedur ini menerima sumber Duit syiling sebagai input dan menggabungkannya dengan sumber Duit syilingdisimpan dalam akaun penerima:

  1. Memusnahkan syiling sumber input dan merekodkan nilainya.
  2. Menerima pautan ke sumber Syiling unik yang disimpan dalam akaun penerima.
  3. Menukar nilai bilangan Syiling mengikut nilai yang diluluskan dalam parameter semasa memanggil prosedur.

Detik nekotori:

  • Buka bungkus, BorrowGlobal - prosedur terbina dalam
  • Buka bungkusan Ini adalah satu-satunya cara untuk memadam sumber jenis T. Prosedur mengambil sumber sebagai input, memusnahkannya dan mengembalikan nilai yang dikaitkan dengan medan sumber.
  • BorrowGlobal mengambil alamat sebagai input dan mengembalikan rujukan kepada contoh unik T yang diterbitkan (dimiliki) oleh alamat tersebut
  • &mut Syiling ini adalah pautan kepada sumber Duit syiling

Pelaksanaan withdraw_from_sender

Selami Move - bahasa pengaturcaraan blockchain Libra Facebook

Prosedur ini:

  1. Mendapat pautan ke sumber unik Duit syiling, dipautkan ke akaun pengirim
  2. Mengurangkan nilai sumber Duit syiling melalui pautan untuk jumlah yang ditetapkan
  3. Mencipta dan mengembalikan sumber baharu Duit syiling dengan baki yang dikemas kini.

Detik nekotori:

  • Deposit boleh disebabkan oleh sesiapa sahaja, tetapi tarik balik_dari_pengirim hanya mempunyai akses kepada syiling akaun panggilan
  • GetTxnSenderAddress sama seperti msg.sender dalam Solidity
  • TolakKecuali sama seperti memerlukan dalam Solidity. Jika semakan ini gagal, urus niaga dihentikan dan semua perubahan akan ditarik balik.
  • Pek ia juga merupakan prosedur terbina dalam yang mencipta sumber baharu jenis T.
  • Serta Buka bungkusan, Pek hanya boleh dipanggil di dalam modul tempat sumber diterangkan T

Kesimpulan

Kami meneliti ciri utama bahasa Move, membandingkannya dengan Ethereum, dan juga membiasakan diri dengan sintaks asas skrip. Akhir sekali, saya sangat mengesyorkan untuk menyemak kertas putih asli. Ia termasuk banyak butiran mengenai prinsip reka bentuk bahasa pengaturcaraan, serta banyak pautan berguna.

Sumber: www.habr.com

Tambah komen