Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Keyinchalik, biz Move tilining asosiy xususiyatlarini va uning aqlli shartnomalar uchun boshqa mashhur til - Solidity (Ethereum platformasida) bilan qanday asosiy farqlarini batafsil ko'rib chiqamiz. Materiallar 26 sahifali onlayn varaqlarning mavjudligini o'rganishga asoslangan.

kirish

Move - bu foydalanuvchi tranzaktsiyalari va aqlli shartnomalarni bajarish uchun ishlatiladigan bajariladigan bayt-kod tili. Iltimos, ikkita nuqtaga e'tibor bering:

  1. Move-bu to'g'ridan-to'g'ri Move virtual mashinasida bajarilishi mumkin bo'lgan bayt-kod tili bo'lsa-da, Solidity (Ethereum-ning aqlli shartnoma tili)-bu EVM (Ethereum Virtual Machine) da bajarilishidan oldin bayt-kod bilan tuzilgan yuqori darajali til.
  2. Move-dan nafaqat aqlli shartnomalarni amalga oshirish uchun, balki maxsus tranzaktsiyalar uchun ham foydalanish mumkin (bu haqda keyinroq), Solidity-bu faqat aqlli shartnoma.


Tarjima INDEX Protocol loyihasi jamoasi tomonidan amalga oshirildi. Biz allaqachon tarjima qilganmiz Libra loyihasini tavsiflovchi katta material, endi Move tilini biroz batafsilroq ko'rib chiqish vaqti keldi. Tarjima Xabrauzer bilan birgalikda amalga oshirildi salqin

Move ning asosiy xususiyati chiziqli mantiqqa asoslangan semantika bilan maxsus resurs turlarini aniqlash qobiliyatidir: resurs hech qachon nusxa ko'chirilmaydi yoki bilvosita o'chirilmaydi, faqat ko'chiriladi. Funktsional jihatdan bu Rust tilining imkoniyatlariga o'xshaydi. Rust-dagi qiymatlar bir vaqtning o'zida faqat bitta nomga tayinlanishi mumkin. Qiymatni boshqa nomga belgilash uni oldingi nom ostida mavjud boβ€˜lmaydi.

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Masalan, quyidagi kod parchasi xato qiladi: Ko'chirilgan "x" qiymatidan foydalanish. Sababi, Rustda axlat yig'ish yo'q. O'zgaruvchilar doiradan chiqib ketganda, ular nazarda tutgan xotira ham bo'shatiladi. Oddiy qilib aytganda, ma'lumotlarning faqat bitta "egasi" bo'lishi mumkin. Bu misolda x asl egasi va keyin y yangi egasiga aylanadi. Bu xatti-harakat haqida ko'proq o'qing.

Ochiq tizimlarda raqamli aktivlarning namoyishi

Raqamli tasvirlash qiyin bo'lgan jismoniy aktivlarning ikkita xususiyati bor:

  • Noyoblik (Qashshoqlik, dastlab kamlik). Tizimdagi aktivlar soni (emissiya) nazorat qilinishi kerak. Mavjud aktivlarning takrorlanishini taqiqlash kerak va yangilarini yaratish imtiyozli operatsiya hisoblanadi.
  • Kirish nazorati... Tizim ishtirokchisi kirishni boshqarish siyosati yordamida aktivlarni himoya qila olishi kerak.

Jismoniy aktivlar uchun tabiiy bo'lgan bu ikkita xususiyat, agar biz ularni aktiv deb hisoblamoqchi bo'lsak, raqamli ob'ektlar uchun qo'llanilishi kerak. Masalan, nodir metalning tabiiy tanqisligi bor va unga faqat siz kira olasiz (masalan, qo'lingizda ushlab) va siz uni sotishingiz yoki sarflashingiz mumkin.

Bu ikki mulkka qanday etib kelganimizni ko'rsatish uchun quyidagi jumlalardan boshlaylik:

Taklif β„–1: Kamchilik va kirishni nazorat qilmaydigan eng oddiy qoida

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

  • G [K]: = n kalit bilan kirish mumkin bo'lgan raqamning yangilanishini bildiradi К blockchain global holatida, yangi ma'no bilan n.
  • bitim, Elis, 100 Elisning hisob balansini 100 ga o'rnatishni anglatadi.

Yuqoridagi yechim bir nechta asosiy muammolarga ega:

  • Elis shunchaki yuborish orqali cheksiz miqdordagi tangalarni olishi mumkin bitim "Elis, 100".
  • Elis Bobga yuborgan tangalar befoyda, chunki Bob xuddi shu usuldan foydalanib cheksiz miqdordagi tangalarni yuborishi mumkin edi.

Taklif # 2: Kamomadni hisobga olgan holda

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Endi biz vaziyatni kuzatamiz, shunda tangalar soni Ka hech bo'lmaganda teng edi n o'tkazish operatsiyasidan oldin. Biroq, bu tanqislik muammosini hal qilsa -da, Elisning tangalarini kim yuborishi mumkinligi haqida hech qanday ma'lumot yo'q (hozircha buni har kim qila oladi, asosiysi miqdorni cheklash qoidasini buzmaslik).

Taklif β„– 3: Tanqislik va kirishni boshqarishni birlashtirish

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Biz bu muammoni raqamli imzo mexanizmi yordamida hal qilamiz tasdiq_sig balansni tekshirishdan oldin, ya'ni Elis tranzaktsiyani imzolash va uning tangalari egasi ekanligini tasdiqlash uchun shaxsiy kalitidan foydalanadi.

Blockchain dasturlash tillari

Mavjud blokcheyn tillari quyidagi muammolarga duch keladi (ularning barchasi Move -da hal qilingan (eslatma: afsuski, maqola muallifi faqat Ethereumga o'z taqqoslashlarida murojaat qiladi, shuning uchun ularni faqat shu kontekstda olishga arziydi. Masalan, quyidagilarning ko'pchiligi EOSda ham hal qilinadi.)))

Aktivlarni bilvosita ifodalash. Obyekt butun son yordamida kodlanadi, lekin butun son aktiv bilan bir xil emas. Aslida, Bitcoin/Eter/<Har qanday tanga>ni ifodalovchi tur yoki qiymat yo'q! Bu aktivlardan foydalanadigan dasturlarni yozishni qiyinlashtiradi va xatolarga moyil bo'ladi. Aktivlarni protseduralarga o'tkazish/o'tkazish yoki tuzilmalarda aktivlarni saqlash kabi namunalar tildan maxsus yordam talab qiladi.

Kamchilik kengaytirilmaydi... Til faqat bitta boylikni anglatadi. Bundan tashqari, tanqislikka qarshi vositalar to'g'ridan -to'g'ri tilning semantikasiga kiritiladi. Ishlab chiquvchi, agar u maxsus aktiv yaratmoqchi bo'lsa, resursning barcha jihatlarini diqqat bilan nazorat qilishi kerak. Bu aynan Ethereum aqlli shartnomalarining muammolari.

Foydalanuvchilar o'z aktivlarini, ERC-20 tokenlarini, butun sonlardan foydalanib, ham qiymatni, ham umumiy etkazib berishni chiqaradilar. Har doim yangi tokenlar yaratilganda, aqlli shartnoma kodi emissiya qoidalariga muvofiqligini mustaqil tekshirishi kerak. Bundan tashqari, aktivlarning bilvosita taqdimoti, ba'zi hollarda, jiddiy xatolarga olib keladi - takrorlanish, ikki barobar sarflash yoki hatto aktivlarning to'liq yo'qolishi.

Moslashuvchan kirishni boshqarishning yo'qligi... Bugungi kunda kirishni boshqarishning yagona siyosati assimetrik kriptografiyadan foydalanadigan imzo sxemasi. Tanqislikni himoya qilish singari, kirishni boshqarish siyosati ham til semantikasiga chuqur singdirilgan. Ammo dasturchilarga kirishni nazorat qilish bo'yicha o'z siyosatini belgilashga ruxsat berish uchun tilni qanday kengaytirish juda qiyin vazifadir.

Bu aqlli shartnomalar kirishni boshqarish uchun mahalliy kriptografiyani qo'llab-quvvatlamaydigan Ethereum-ga ham tegishli. Ishlab chiquvchilar kirish boshqaruvini qo'lda sozlashlari kerak, masalan, onlyOwner modifikatoridan foydalangan holda.

Men Ethereum-ning katta muxlisi bo'lsam ham, xavfsizlik maqsadlarida aktivlarning xususiyatlari til tomonidan qo'llab-quvvatlanishi kerakligiga ishonaman. Xususan, Eterni aqlli shartnomaga o'tkazish dinamik jo'natishni o'z ichiga oladi, bu esa qayta kirish zaifliklari deb nomlanuvchi xatolarning yangi sinfini taqdim etdi. Bu erda dinamik jo'natish kodning bajarilish mantig'i kompilyatsiya vaqtida (statik) emas, balki ish vaqtida (dinamik) aniqlanishini anglatadi.

Shunday qilib, Solidity-da, agar A shartnomasi B kontraktidagi funktsiyani chaqirsa, B shartnomasi A shartnomasini ishlab chiquvchisi tomonidan mo'ljallanmagan kodni ishga tushirishi mumkin, bu esa quyidagilarga olib kelishi mumkin. qayta kirish zaifliklari (A shartnomasi tasodifan hisobdagi qoldiqlar yechib olinmaguncha pulni yechib olish uchun B shartnomasi vazifasini bajaradi).

Move Language Dizayn asoslari

Birinchi darajali resurslar

Yuqori darajada, Move tilidagi modullar / resurslar / protseduralar o'rtasidagi o'zaro ta'sir OOP tillaridagi sinflar / ob'ektlar va usullar o'rtasidagi munosabatlarga juda o'xshaydi.
Harakat modullari boshqa blokcheynlardagi aqlli shartnomalarga o'xshaydi. Modul e'lon qilingan resurslarni yaratish, yo'q qilish va yangilash qoidalarini belgilaydigan manba turlari va protseduralarini e'lon qiladi. Ammo bularning barchasi faqat konventsiyalardir ("jargon") Harakatda. Bu fikrni biroz keyinroq tasvirlab beramiz.

Moslashuvchanlik

Move skript orqali Libra-ga moslashuvchanlikni qo'shadi. Libra-dagi har bir tranzaksiya skriptni o'z ichiga oladi, bu tranzaksiyaning asosiy tartibi hisoblanadi. Skript bitta belgilangan amalni bajarishi mumkin, masalan, qabul qiluvchilarning belgilangan ro'yxatiga to'lovlarni amalga oshirishi yoki boshqa resurslardan qayta foydalanishi mumkin - masalan, umumiy mantiq ko'rsatilgan protsedurani chaqirish orqali. Shuning uchun Move tranzaksiya skriptlari ko'proq moslashuvchanlikni taklif qiladi. Skript bir martalik va takroriy xatti-harakatlardan foydalanishi mumkin, Ethereum esa faqat takrorlanadigan skriptlarni bajarishi mumkin (aqlli shartnoma usulida bitta usulni chaqirish). Uning "qayta foydalanish mumkin" deb nomlanishining sababi, aqlli shartnomaning funktsiyalari bir necha marta bajarilishi mumkinligidir. (Eslatma: Bu erda nuqta juda nozik. Bir tomondan, Bitcoin-da psevdo-baytekod ko'rinishidagi tranzaksiya skriptlari ham mavjud. Boshqa tomondan, men tushunganimdek, Move bu tilni, aslida, to'liq aqlli shartnoma tili darajasiga kengaytiradi.).

Xavfsizlik

Move bajariladigan formati bayt-kod bo'lib, u, bir tomondan, assembler tilidan yuqori darajadagi til, lekin manba kodidan pastroq. Bayt-kod resurslar, turlar va xotira xavfsizligi uchun ish vaqtida (zanjirda) bayt kodini tekshirgich yordamida tekshiriladi va keyin tarjimon tomonidan bajariladi. Ushbu yondashuv Move-ga manba kodining xavfsizligini ta'minlash imkonini beradi, lekin kompilyatsiya jarayonisiz va tizimga kompilyator qo'shish zaruriyatisiz. Move bayt-kod tilini yaratish juda yaxshi yechimdir. Solidity-da bo'lgani kabi, uni manbadan kompilyatsiya qilish shart emas va kompilyator infratuzilmasidagi mumkin bo'lgan nosozliklar yoki hujumlar haqida tashvishlanishning hojati yo'q.

Tasdiqlanishi

Biz tekshirishlarni iloji boricha oson bajarishga intilamiz, chunki bularning barchasi zanjirda amalga oshiriladi (eslatma: har bir operatsiyani bajarish paytida, shuning uchun har qanday kechikish butun tarmoqning sekinlashishiga olib keladi), lekin dastlab til dizayni zanjirdan tashqari statik tekshirish vositalaridan foydalanishga tayyor. Bu ko'proq afzalroq bo'lsa-da, hozircha tekshirish vositalarini ishlab chiqish (alohida asboblar to'plami sifatida) kelajakka qoldirildi va endi faqat ish vaqtida (zanjirda) dinamik tekshirish qo'llab-quvvatlanadi.

Modullik

Ko'chirish modullari ma'lumotlarning ajralishini ta'minlaydi va resurslar bo'yicha muhim operatsiyalarni lokalizatsiya qiladi. Modul tomonidan berilgan inkassulyatsiya, Move turi tizimi tomonidan ta'minlangan himoya bilan birgalikda, modul turlariga o'rnatilgan xususiyatlar moduldan tashqaridagi kod bilan buzilmasligini ta'minlaydi. Bu puxta o'ylangan mavhumlik dizayni, ya'ni shartnoma ichidagi ma'lumotlarni faqat shartnoma doirasida o'zgartirish mumkin, lekin tashqi tomondan emas.

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Ko'chirish umumiy ko'rinishi

Tranzaksiya skriptining misoli shuni ko'rsatadiki, dasturchining moduldan tashqaridagi yomon yoki ehtiyotsiz harakatlari modul resurslarining xavfsizligini buzolmaydi. Keyinchalik, Libra blokcheynini dasturlash uchun modullar, resurslar va protseduralardan qanday foydalanish misollarini ko'rib chiqamiz.

Tengdoshga to'lovlar

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Miqdorda ko'rsatilgan tangalar soni jo'natuvchi balansidan oluvchiga o'tkaziladi.
Bu yerda bir nechta yangi narsalar bor (qizil rang bilan belgilangan):

  • 0x0: modul saqlanadigan hisob manzili
  • Valyutalar: modul nomi
  • tanga: manba turi
  • Protsedura tomonidan qaytarilgan tanga qiymati - 0x0.Currency.Coin tipidagi manba qiymati
  • harakat (): qiymatni qayta ishlatish mumkin emas
  • nusxa ko'chirish (): qiymati keyinroq ishlatilishi mumkin

Kodni tahlil qiling: birinchi bosqichda jo'natuvchi nomli protsedurani chaqiradi jo'natuvchidan ichida saqlangan moduldan 0x0.Valyuta. Ikkinchi bosqichda jo'natuvchi tanga resurs qiymatini modulning depozit tartibiga o'tkazish orqali oluvchiga mablag'larni o'tkazadi. 0x0.Valyuta.

Koddagi xatolarning uchta misoli, tekshiruvlar tomonidan rad etiladi:
Qo'ng'iroqni o'zgartirish orqali pul mablag'larini takrorlang harakat (tanga) haqida nusxa (tanga). Resurslarni faqat ko'chirish mumkin. Resurs miqdorini takrorlashga urinish (masalan, qo'ng'iroq qilish orqali nusxa (tanga) yuqoridagi misolda) bayt kodini tekshirish paytida xatoga olib keladi.

Ko'rsatilgan holda mablag'lardan qayta foydalanish harakat (tanga) ikki marta . Chiziq qo'shish 0x0.Currency.deposit (nusxalash (ba'zi_boshqa_payee), ko'chirish (tanga)) masalan, yuqorida aytilganlar jo'natuvchiga tangalarni ikki marta "sarflash" imkonini beradi - birinchi marta oluvchi bilan, ikkinchisi bilan ba'zi_boshqa_to'lovchi. Bu jismoniy aktiv bilan mumkin bo'lmagan nomaqbul xatti-harakatlardir. Yaxshiyamki, Move ushbu dasturni rad etadi.

Rad etish tufayli mablag'larni yo'qotish harakat (tanga). Agar siz resursni ko'chirmasangiz (masalan, o'z ichiga olgan qatorni o'chirish orqali harakat (tanga)), bayt kodini tekshirish xatosi paydo bo'ladi. Bu Move dasturchilarini tasodifiy yoki zararli mablag'larni yo'qotishdan himoya qiladi.

Valyuta moduli

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Har bir hisobda 0 yoki undan ortiq modul (to'rtburchaklar sifatida ko'rsatilgan) va bir yoki bir nechta manba qiymati (silindr sifatida ko'rsatilgan) bo'lishi mumkin. Masalan, hisob qaydnomasi 0x0 modulni o'z ichiga oladi 0x0.Valyuta va resurs turining qiymati 0x0.Currency.Coin. Manzildagi hisob 0x1 ikkita manba va bitta modulga ega; Manzildagi hisob 0x2 ikkita modul va bitta resurs qiymatiga ega.

Noqulay daqiqalar:

  • Tranzaksiya skripti atomik - yoki u to'liq bajariladi yoki umuman bajarilmaydi.
  • Modul - bu global miqyosda foydalanish mumkin bo'lgan uzoq muddatli kod qismidir.
  • Global holat xesh-jadval sifatida tuzilgan, bu erda kalit hisob manzili hisoblanadi
  • Hisoblar ma'lum turdagi bir nechta resurs qiymatini va ma'lum nomga ega bo'lgan bir nechta modulni o'z ichiga olishi mumkin. 0x0 qo'shimcha resursni o'z ichiga olmaydi 0x0.Currency.Coin yoki boshqa modul nomli Valyutalar)
  • E'lon qilingan modulning manzili turning bir qismidir (0x0.Currency.Coin ΠΈ 0x1.Currency.Coin bir-birini almashtirib bo'lmaydigan alohida turlar)
  • Dasturchilar o'zlarining shaxsiy manbalarini belgilash orqali ushbu turdagi manbalarning bir nechta nusxalarini hisob qaydnomalarida saqlashlari mumkin - (resurs TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Siz manbaga uning nomi bilan qarama-qarshiliklarsiz murojaat qilishingiz mumkin, masalan, ikkita manbadan foydalangan holda murojaat qilishingiz mumkin TwoCoins.c1 ΠΈ TwoCoins.c2.

Tangalar resursi haqida e'lon

Dive into Move - Facebookning Libra blokcheyn dasturlash tili
Modul nomi Valyutalar va nomli resurs turi tanga

Noqulay daqiqalar:

  • tanga bir turdagi maydonga ega bo'lgan strukturadir u64 (64-bit belgisiz butun son)
  • Faqat modul protseduralari Valyutalar turdagi qiymatlarni yaratishi yoki yo'q qilishi mumkin tanga.
  • Boshqa modullar va skriptlar faqat modul tomonidan taqdim etilgan umumiy protseduralar orqali qiymat maydonini yozishi yoki havola qilishi mumkin.

Depozitni sotish

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Ushbu protsedura resursni qabul qiladi tanga kirish sifatida va uni resurs bilan birlashtiradi tangaoluvchining hisob qaydnomasida saqlanadi:

  1. Coin kirish resursini yo'q qilish va uning qiymatini qayd etish.
  2. Qabul qiluvchining hisob qaydnomasida saqlangan noyob Coin resursiga havolani olish.
  3. Tangalar sonining qiymatini protsedurani chaqirganda parametrda o'tgan qiymatga o'zgartirish.

Noqulay daqiqalar:

  • Paketni oching, BorrowGlobal - o'rnatilgan protseduralar
  • Paketdan chiqaring Bu T tipidagi resursni o'chirishning yagona yo'li. Protsedura manbani kirish sifatida qabul qiladi, uni yo'q qiladi va resurs maydonlari bilan bog'langan qiymatni qaytaradi.
  • BorrowGlobal kirish sifatida manzilni oladi va ushbu manzil tomonidan nashr etilgan (egalik) T ning noyob nusxasiga havolani qaytaradi
  • &mut Coin bu manbaga havola tanga

jo'natuvchidan olib tashlashni amalga oshirish

Dive into Move - Facebookning Libra blokcheyn dasturlash tili

Ushbu protsedura:

  1. Noyob resursga havola oladi tanga, jo'natuvchining hisobiga bog'langan
  2. Resurs qiymatini pasaytiradi tanga belgilangan miqdor uchun havola orqali
  3. Yangi resurs yaratadi va qaytaradi tanga yangilangan balans bilan.

Noqulay daqiqalar:

  • depozit har kim sabab bo'lishi mumkin, lekin jo'natuvchidan faqat chaqiruv hisobining tangalariga kirish huquqiga ega
  • GetTxnSenderAddress o'xshash msg.sender Mustahkamlikda
  • Rad etish o'xshash talab qiladi Mustahkamlikda. Agar bu tekshiruv bajarilmasa, tranzaksiya to'xtatiladi va barcha o'zgarishlar orqaga qaytariladi.
  • Paket u shuningdek, T tipidagi yangi resurs yaratadigan o'rnatilgan protseduradir.
  • Shu qatorda; shu bilan birga Paketdan chiqaring, Paket faqat manba tasvirlangan modul ichida chaqirilishi mumkin T

xulosa

Biz Move tilining asosiy xususiyatlarini ko'rib chiqdik, uni Ethereum bilan taqqosladik, shuningdek, skriptlarning asosiy sintaksisi bilan tanishdik. Nihoyat, men tekshirishni tavsiya qilaman original oq qog'oz. U dasturlash tilini loyihalash tamoyillariga oid ko'plab tafsilotlarni, shuningdek, ko'plab foydali havolalarni o'z ichiga oladi.

Manba: www.habr.com

a Izoh qo'shish