Immersion in Move - Bahasa pemrograman blockchain Libra Facebook

Selanjutnya, kita akan memeriksa secara rinci karakteristik utama dari bahasa Pindah dan apa perbedaan utamanya dengan bahasa lain yang sudah populer untuk kontrak cerdas - Soliditas (pada platform Ethereum). Materi ini didasarkan pada studi whitepaper 26 halaman online yang tersedia.

Pendahuluan


Move adalah bahasa bytecode yang dapat dieksekusi yang digunakan untuk mengeksekusi transaksi pengguna dan kontrak pintar. Perhatikan dua poin:

  1. Sementara Move adalah bahasa bytecode yang dapat langsung dieksekusi di mesin virtual Move, Solidity (bahasa kontrak pintar dalam Ethereum) adalah bahasa tingkat tinggi yang pertama kali dikompilasi ke dalam bytecode sebelum dieksekusi dalam EVM (Ethereum Virtual Machine )
  2. Move dapat digunakan tidak hanya untuk penerapan kontrak pintar, tetapi juga untuk transaksi pengguna (lebih lanjut tentang ini nanti), sementara Soliditas adalah bahasa hanya untuk kontrak pintar.

Terjemahan dibuat oleh tim proyek Protokol INDEX. Kami sebelumnya menerjemahkan banyak bahan yang menggambarkan proyek Libra , sekarang giliran untuk melihat bahasa Move sedikit lebih dalam. Terjemahan dibuat bersamaan dengan coolsiu

Fitur utama Move adalah kemampuan untuk menentukan jenis sumber daya khusus dengan semantik logika linier: sumber daya tidak pernah dapat disalin atau dihapus secara tersirat, hanya dipindahkan. Secara fungsional, ini mirip dengan kemampuan bahasa Rust. Nilai-nilai di Rust hanya dapat diberikan ke satu nama pada suatu waktu. Menetapkan nilai ke nama lain membuatnya tidak dapat diakses di bawah nama sebelumnya.



Misalnya, fragmen kode berikut akan menimbulkan kesalahan: Penggunaan nilai yang dipindahkan 'x'. Ini karena tidak ada pengumpulan sampah di Rust. Ketika variabel keluar dari ruang lingkup, memori yang mereka rujuk juga dibebaskan. Sederhananya, hanya ada satu "pemilik" data. Dalam contoh ini, x adalah pemilik asli, dan kemudian y menjadi pemilik baru. Baca lebih lanjut tentang perilaku ini di sini .

Representasi aset digital dalam sistem terbuka


Ada dua properti aset fisik yang sulit direpresentasikan secara digital:

  • Kelangkaan (Kelangkaan, dalam aslinya - kelangkaan). Jumlah aset (masalah) dalam sistem harus dikontrol. Duplikasi aset yang ada harus dilarang, dan pembuatan yang baru adalah operasi istimewa.
  • Kontrol akses . Peserta sistem harus dapat melindungi aset dengan kebijakan kontrol akses.

Dua karakteristik ini, yang alami untuk aset fisik, perlu diterapkan untuk objek digital, jika kita ingin menganggapnya sebagai aset. Misalnya, logam langka - memiliki defisit alami, dan hanya Anda yang dapat mengaksesnya (berpegangan tangan, misalnya) dan Anda dapat menjual atau membelanjakannya.

Untuk mengilustrasikan bagaimana kita sampai pada dua properti ini, mari kita mulai dengan kalimat-kalimat berikut:

Proposisi 1: Aturan paling sederhana tanpa kelangkaan dan kontrol akses




  • G [K]: = n berarti memperbarui nomor yang dapat diakses oleh kunci K dalam keadaan global dari blockchain dengan nilai baru n .
  • transaksi ⟨Alice, 100⟩ berarti mengatur saldo akun Alice menjadi 100.

Solusi di atas memiliki beberapa masalah serius:

  • Alice dapat menerima koin dalam jumlah tidak terbatas hanya dengan mengirim transaksi ⟨Alice, 100⟩.
  • Koin-koin yang Alice kirim ke Bob tidak berguna, karena Bob bisa mengirim sendiri sejumlah koin tanpa batas menggunakan teknik yang sama.

Proposal No. 2: Kami memperhitungkan defisit




Sekarang kami sedang memantau situasi sehingga jumlah koin Ka setidaknya n sebelum transaksi transfer. Namun demikian, meskipun ini memecahkan masalah kekurangan, tidak ada informasi tentang siapa yang dapat mengirim koin Alice (sejauh ini semua orang dapat melakukan ini, hal utama adalah tidak melanggar aturan batas kuantitas).

Proposisi 3: Menggabungkan Defisit dan Kontrol Akses




Kami menyelesaikan masalah ini dengan mekanisme tanda tangan digital verifikasi_sig sebelum memeriksa saldo, yang berarti bahwa Alice menggunakan kunci pribadinya untuk menandatangani transaksi dan mengonfirmasi bahwa ia memiliki koinnya.

Bahasa pemrograman Blockchain


Bahasa blockchain yang ada menghadapi masalah berikut (semuanya diselesaikan di Pindahkan (catatan: sayangnya, penulis artikel hanya memohon banding ke Ethereum dalam perbandingannya, jadi Anda harus membawanya hanya dalam konteks ini. Misalnya, sebagian besar dari berikut ini juga dipecahkan dalam EOS )):

Representasi aset tidak langsung . Aset dikodekan menggunakan integer, tetapi nilai integer tidak sama dengan aset. Faktanya, tidak ada tipe atau nilai yang mewakili bitcoin / eter / <Any Coin>! Ini membuat program penulisan yang menggunakan aset sulit dan rawan kesalahan. Pola seperti mentransfer aset ke / dari prosedur atau menyimpan aset dalam struktur memerlukan dukungan bahasa khusus.

Defisit tidak dapat diperluas . Bahasa hanya mewakili satu aset langka. Selain itu, perbaikan terhadap defisit dirancang langsung ke dalam semantik bahasa itu sendiri. Pengembang, jika ia ingin membuat aset pengguna, harus dengan cermat memantau semua aspek sumber daya itu sendiri. Ini hanya masalah kontrak pintar Ethereum.

Pengguna menerbitkan aset mereka, token standar ERC-20, menggunakan bilangan bulat untuk menentukan biaya dan total masalah. Setiap kali token baru dibuat, kode kontrak pintar harus secara independen memverifikasi kepatuhan dengan aturan emisi. Selain itu, representasi tidak langsung dari aset menyebabkan, dalam beberapa kasus, kesalahan serius - duplikasi, pengeluaran ganda atau bahkan hilangnya aset secara total.

Kurangnya kontrol akses yang fleksibel . Satu-satunya kebijakan kontrol akses yang saat ini digunakan adalah skema tanda tangan menggunakan kriptografi asimetris. Seperti perlindungan defisit, kebijakan kontrol akses tertanam dalam semantik bahasa tersebut. Tetapi bagaimana memperluas bahasa untuk memungkinkan pemrogram mendefinisikan kebijakan kontrol akses mereka sendiri seringkali merupakan tugas yang sangat sepele.

Ini juga berlaku untuk Ethereum, di mana kontrak pintar tidak memiliki dukungan kriptografi asli untuk kontrol akses. Pengembang harus menentukan kontrol akses secara manual, misalnya, menggunakan pengubah onlyOwner.

Meskipun saya penggemar berat Ethereum, saya percaya bahwa properti aset harus didukung oleh bahasa asli untuk alasan keamanan. Secara khusus, mentransfer Eter ke kontrak pintar melibatkan pengiriman dinamis, yang telah menyebabkan munculnya kelas kesalahan baru yang dikenal sebagai kerentanan re-entrancy. Pengiriman dinamis di sini berarti bahwa logika eksekusi kode akan ditentukan pada saat runtime (dinamis), dan bukan pada waktu kompilasi (statis).

Dengan demikian, dalam Solidity, ketika kontrak A memanggil fungsi kontrak B, kontrak B dapat menjalankan kode yang tidak disediakan oleh pengembang kontrak A, yang dapat menyebabkan kerentanan masuk kembali (kontrak A secara tidak sengaja melakukan fungsi kontrak B untuk menarik uang sebelum pengurangan yang sebenarnya saldo akun).

Pindahkan dasar-dasar desain bahasa


Sumber daya urutan pertama


Berbicara di tingkat yang lebih tinggi, interaksi antara modul / sumber daya / prosedur dalam bahasa Pindah sangat mirip dengan hubungan antara kelas / objek dan metode dalam bahasa OOP.
Modul di Pindahkan mirip dengan kontrak pintar di blokir lain. Modul ini menyatakan jenis dan prosedur sumber daya yang menetapkan aturan untuk membuat, menghancurkan, dan memperbarui sumber daya yang dinyatakan. Tapi semua ini hanya konvensi (" jargon ") di Move. Beberapa saat kemudian kita akan menggambarkan hal ini.

Fleksibilitas


Move menambahkan fleksibilitas Libra melalui scripting. Setiap transaksi di Libra termasuk skrip, yang sebenarnya merupakan prosedur transaksi utama. Skrip dapat melakukan salah satu tindakan tertentu, misalnya, pembayaran sesuai dengan daftar penerima yang ditentukan, atau menggunakan kembali sumber daya lain - misalnya, dengan memanggil prosedur di mana logika umum ditentukan. Inilah sebabnya mengapa Memindahkan skrip transaksi menawarkan lebih banyak fleksibilitas. Skrip dapat menggunakan perilaku satu kali dan berulang, sementara Ethereum hanya dapat menjalankan skrip berulang (memanggil metode kontrak pintar dengan memanggil satu metode). Alasan itu disebut "beberapa" adalah karena fungsi kontrak pintar dapat dieksekusi beberapa kali. (catatan: momennya sangat rumit di sini. Di satu sisi, skrip transaksi dalam bentuk pseudo-bytecode juga dalam Bitcoin. Di sisi lain, seperti yang saya pahami, Move memperluas bahasa ini, pada kenyataannya, ke tingkat bahasa kontrak pintar yang lengkap ).

Keamanan


Format Pindah yang dapat dieksekusi adalah bytecode, yang, di satu sisi, adalah bahasa dengan level lebih tinggi dari assembler, tetapi level lebih rendah dari kode sumber. Bytecode diperiksa on-chain untuk ketersediaan sumber daya, tipe dan keamanan memori menggunakan verifier bytecode, dan kemudian dieksekusi oleh penerjemah. Pendekatan ini memungkinkan Pindahkan untuk menyediakan keamanan khusus untuk kode sumber, tetapi tanpa proses kompilasi dan kebutuhan untuk menambahkan kompiler ke sistem. Membuat Memindahkan bahasa bytecode adalah solusi yang sangat bagus. Tidak perlu mengkompilasinya dari sumber, seperti halnya dengan Solidity, tidak perlu khawatir tentang kemungkinan crash atau serangan pada infrastruktur kompiler.

Verifikasi


Kami bertujuan melakukan pemeriksaan semudah mungkin, karena semua ini berjalan terus (catatan: on-line, dalam proses setiap transaksi, oleh karena itu setiap keterlambatan menyebabkan perlambatan seluruh jaringan ), namun, desain bahasa pada awalnya siap untuk digunakan dan sarana off-chain verifikasi statis. Meskipun ini lebih disukai, sejauh ini pengembangan alat verifikasi (sebagai toolkit terpisah) telah ditunda untuk masa depan, dan sekarang hanya verifikasi dinamis dalam run-time (on-chain) yang didukung.

Modularitas


Pindahkan modul memberikan abstraksi data dan melokalkan operasi penting pada sumber daya. Enkapsulasi yang disediakan oleh modul, dikombinasikan dengan perlindungan yang disediakan oleh sistem tipe Pindah, memastikan bahwa properti yang ditetapkan untuk jenis modul tidak dapat dilanggar oleh kode di luar modul. Ini adalah desain abstraksi yang dipikirkan dengan matang, yang berarti bahwa data di dalam kontrak hanya dapat diubah sebagai bagian dari pelaksanaan kontrak, tetapi tidak dari luar.



Pindahkan Ulasan


Contoh skrip transaksi menunjukkan bahwa tindakan jahat atau sembrono dari seorang programmer di luar modul tidak dapat melanggar keamanan sumber daya modul. Selanjutnya, kita akan melihat contoh bagaimana modul, sumber daya dan prosedur digunakan untuk memprogram blockchain Libra.

Pembayaran Peer-to-Peer




Jumlah koin yang ditentukan dalam jumlah akan ditransfer dari saldo pengirim ke penerima.
Ada beberapa poin baru (disorot merah):

  • 0x0 : alamat akun tempat modul disimpan
  • Mata uang : nama modul
  • Koin : jenis sumber daya
  • Nilai koin yang dikembalikan oleh prosedur adalah nilai sumber daya yang jenisnya adalah 0x0.Currency.Coin
  • move () : nilai tidak bisa digunakan lagi
  • copy () : nilai dapat digunakan nanti

Kami menguraikan kode: pada langkah pertama, pengirim memanggil prosedur yang disebut withdraw_from_sender dari modul yang disimpan dalam 0x0.Currency . Pada tahap kedua, pengirim mentransfer dana ke penerima, memindahkan nilai sumber daya koin ke prosedur setoran modul 0x0 . Mata uang .

Berikut adalah tiga contoh kesalahan kode yang akan ditolak oleh cek:
Duplikasi dana dengan mengubah panggilan untuk memindahkan (koin) untuk menyalin (koin) . Sumber daya hanya dapat dipindahkan. Mencoba menduplikasi jumlah sumber daya (misalnya, dengan memanggil salinan (koin) dalam contoh di atas) akan menghasilkan kesalahan saat memeriksa bytecode.

Penggunaan kembali dana dengan menentukan langkah (koin) dua kali . Menambahkan baris 0x0.Currency.deposit (salin (some_other_payee), pindahkan (koin)) untuk contoh di atas akan memungkinkan pengirim untuk "menghabiskan" koin dua kali - pertama kali dengan penerima, dan yang kedua dengan some_other_payee . Ini adalah perilaku yang tidak diinginkan, tidak mungkin dengan aset fisik. Untungnya, Move akan menolak program ini.

Kehilangan dana karena kegagalan dalam bergerak (koin) . Jika Anda tidak memindahkan sumber daya (misalnya, dengan menghapus baris yang berisi langkah (koin) ), kesalahan akan dihasilkan dengan memeriksa bytecode. Ini melindungi Pindahkan programmer dari kehilangan dana yang tidak disengaja atau berbahaya.

Modul mata uang




Setiap akun dapat berisi 0 atau lebih modul (digambarkan sebagai persegi panjang) dan satu atau lebih nilai sumber daya (digambarkan sebagai silinder). Misalnya, akun di 0x0 berisi 0x0. Modul mata uang dan nilai sumber daya dari tipe 0x0.Currency.Coin . Akun di 0x1 memiliki dua sumber daya dan satu modul; Akun di 0x2 memiliki dua modul dan satu nilai sumber daya.

Beberapa poin:

  • Skrip transaksi adalah atomik - baik sepenuhnya dieksekusi, atau tidak sama sekali.
  • Modul adalah sepotong kode berumur panjang yang tersedia secara global.
  • Status global disusun sebagai tabel hash, di mana kuncinya adalah alamat akun
  • Akun dapat berisi tidak lebih dari satu nilai sumber daya dari jenis yang diberikan dan tidak lebih dari satu modul dengan nama yang diberikan (akun pada 0x0 tidak dapat berisi sumber daya tambahan 0x0.Currency.Coin atau modul lain bernama Mata Uang )
  • Alamat modul yang dideklarasikan adalah bagian dari tipe ( 0x0.Currency.Coin dan 0x1.Currency.Coin adalah tipe terpisah yang tidak dapat digunakan secara bergantian)
  • Pemrogram dapat menyimpan beberapa contoh sumber daya jenis ini di akun dengan mendefinisikan sumber daya khusus mereka - ( sumber daya TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin} )
  • Anda dapat merujuk ke sumber daya dengan namanya tanpa konflik, misalnya, Anda dapat merujuk ke dua sumber daya menggunakan TwoCoins.c1 dan TwoCoins.c2 .

Iklan Sumber Daya Koin



Modul bernama Mata Uang dan jenis sumber daya bernama Koin

Beberapa poin:

  • Koin adalah struktur bidang-tunggal tipe u64 ( integer 64-bit unsigned)
  • Hanya prosedur modul Mata Uang yang dapat membuat atau menghancurkan nilai Coin .
  • Modul dan skrip lain dapat menulis atau merujuk bidang nilai hanya melalui prosedur terbuka yang disediakan oleh modul.

Implementasi Setoran




Prosedur ini mengambil sumber daya Koin sebagai input dan menggabungkannya dengan sumber daya Koin yang disimpan dalam akun penerima:

  1. Menghancurkan sumber input Coin dan merekam nilainya.
  2. Mendapatkan tautan ke sumber daya Koin unik yang disimpan di akun penerima.
  3. Mengubah nilai jumlah Koin dengan nilai yang diteruskan dalam parameter saat prosedur dipanggil.

Beberapa poin:

  • Buka kemasan, BorrowGlobal - prosedur bawaan
  • Buka paket <T> adalah satu-satunya cara untuk menghapus sumber daya tipe T. Prosedur mengambil sumber daya ke input, menghancurkannya dan mengembalikan nilai yang terkait dengan bidang sumber daya.
  • BorrowGlobal <T> menerima alamat sebagai masukan dan mengembalikan tautan ke contoh unik T yang diterbitkan (dimiliki) oleh alamat ini
  • & mut Coin adalah tautan ke sumber daya Coin

Terapkan withdraw_from_sender




Prosedur ini:

  1. Mendapat tautan ke sumber daya Coin unik yang ditautkan ke akun pengirim
  2. Mengurangi nilai sumber daya Koin dengan merujuk pada jumlah yang ditentukan
  3. Membuat dan mengembalikan sumber daya Koin baru dengan saldo yang diperbarui.

Beberapa poin:

  • Setoran dapat dipanggil oleh siapa saja, tetapi withdraw_from_sender hanya memiliki akses ke koin akun panggilan
  • GetTxnSenderAddress mirip dengan msg.sender dalam Solidity
  • RejectUnless mirip dengan yang dibutuhkan dalam Solidity. Jika pemeriksaan ini gagal, transaksi dihentikan dan semua perubahan dibatalkan.
  • Paket <T> juga merupakan prosedur bawaan yang menciptakan sumber daya baru tipe T.
  • Seperti Buka Paket <T> , Paket <T> hanya dapat dipanggil di dalam modul tempat sumber daya T dijelaskan

Kesimpulan


Kami memeriksa karakteristik utama bahasa Move, membandingkannya dengan Ethereum, dan juga membiasakan diri dengan sintaksis skrip dasar. Sebagai kesimpulan, saya sangat merekomendasikan untuk membaca buku putih asli . Ini mencakup banyak detail tentang prinsip-prinsip desain bahasa pemrograman, serta banyak tautan bermanfaat.

Source: https://habr.com/ru/post/id459990/


All Articles