Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Tālāk mēs detalizēti apsvērsim Move valodas galvenās iezÄ«mes un kādas ir tās galvenās atŔķirÄ«bas ar citu, jau viedo lÄ«gumu populāru valodu - Solidity (platformā Ethereum). Materiāls ir balstÄ«ts uz pieejamās tieÅ”saistes 26 lappuÅ”u baltās grāmatas izpēti.

Ievads

Move ir izpildāma baitkoda valoda, ko izmanto, lai izpildītu lietotāja transakcijas un viedos līgumus. Lūdzu, ņemiet vērā divus punktus:

  1. Lai gan Move ir baitu koda valoda, kuru var tieÅ”i izpildÄ«t Move virtuālajā maŔīnā, Solidity (Ethereum viedā lÄ«guma valoda) ir augstāka lÄ«meņa valoda, kas vispirms tiek apkopota baitu kodā, pirms tiek izpildÄ«ta EVM (Ethereum virtuālā maŔīna).
  2. Move var izmantot ne tikai viedo lÄ«gumu Ä«stenoÅ”anai, bet arÄ« pielāgotajiem darÄ«jumiem (vairāk par to vēlāk), savukārt Solidity ir vieda tikai lÄ«gumu valoda.


TulkoÅ”anu veica INDEX protokola projekta komanda. Mēs jau esam iztulkojuÅ”i liels materiāls, kas apraksta projektu Svari, tagad ir pienācis laiks apskatÄ«t Move valodu nedaudz sÄ«kāk. Tulkojums tika veikts kopā ar Habrauser coolsiu

Galvenā Move iezÄ«me ir iespēja definēt pielāgotus resursu tipus ar semantiku, kuras pamatā ir lineāra loÄ£ika: resursus nekad nevar kopēt vai netieÅ”i dzēst, tikai pārvietot. Funkcionāli tas ir lÄ«dzÄ«gs Rust valodas iespējām. Rust vērtÄ«bas vienlaikus var pieŔķirt tikai vienam vārdam. VērtÄ«bas pieŔķirÅ”ana citam nosaukumam padara to nepieejamu ar iepriekŔējo nosaukumu.

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Piemēram, Ŕāds koda fragments parādÄ«s kļūdu: Pārvietotās vērtÄ«bas ā€œxā€ izmantoÅ”ana. Tas ir tāpēc, ka Rustā nav atkritumu savākÅ”anas. Kad mainÄ«gie iziet no darbÄ«bas jomas, tiek atbrÄ«vota arÄ« atmiņa, uz kuru tie attiecas. VienkārÅ”i sakot, datu "Ä«paÅ”nieks" var bÅ«t tikai viens. Å ajā piemērā x ir sākotnējais Ä«paÅ”nieks un tad y kļūst par jauno Ä«paÅ”nieku. Vairāk par Å”o uzvedÄ«bu lasiet Å”eit.

Digitālo aktÄ«vu attēloÅ”ana atvērtās sistēmās

Ir divi fizisko aktīvu rekvizīti, kurus ir grūti attēlot digitāli:

  • Retums (TrÅ«kums, sākotnēji trÅ«kums). Ir jākontrolē aktÄ«vu skaits (emisijas) sistēmā. Ir jāaizliedz esoÅ”o lÄ«dzekļu pavairoÅ”ana, un jaunu izveidoÅ”ana ir priviliģēta darbÄ«ba.
  • Piekļuves kontrole... Sistēmas dalÄ«bniekam jāspēj aizsargāt aktÄ«vus, izmantojot piekļuves kontroles politikas.

Šie divi raksturlielumi, kas ir dabiski fiziskiem aktīviem, ir jāīsteno digitālajiem objektiem, ja vēlamies tos uzskatīt par aktīviem. Piemēram, retam metālam - ir dabisks trūkums, un tikai jums tas ir pieejams (piemēram, turot to rokās), un jūs varat to pārdot vai iztērēt.

Lai ilustrētu, kā mēs nonācām pie Å”iem diviem Ä«paÅ”umiem, sāksim ar Ŕādiem teikumiem:

1. ieteikums: vienkārŔākais noteikums bez trūkuma un piekļuves kontroles

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

  • G [K]: = n apzÄ«mē numura atjaunināŔanu, kas pieejams ar atslēgu Šš bloka ķēdes globālajā stāvoklÄ« ar jaunu nozÄ«mi n.
  • darÄ«jums (Alise, 100) nozÄ«mē iestatÄ«t Alises konta atlikumu uz 100.

IepriekÅ” minētajam risinājumam ir vairākas lielas problēmas:

  • Alise var saņemt neierobežotu skaitu monētu, vienkārÅ”i nosÅ«tot darÄ«jums lAlise, 100āŸ©.
  • Monētas, ko Alise sÅ«ta Bobam, ir bezjēdzÄ«gas, jo Bobs, izmantojot to paÅ”u paņēmienu, varētu nosÅ«tÄ«t sev neierobežotu skaitu monētu.

2. ieteikums: ņemot vērā deficītu

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Tagad mēs uzraugām situāciju, lai monētu skaits Ka bija vismaz vienāds n pirms pārskaitÄ«juma darÄ«juma. Tomēr, lai gan tas atrisina trÅ«kuma problēmu, nav informācijas par to, kas var nosÅ«tÄ«t Alises monētas (pagaidām to var darÄ«t ikviens, galvenais ir nepārkāpt summas ierobežoÅ”anas noteikumu).

3. priekŔlikums: apvienot trūkumu un piekļuves kontroli

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Mēs atrisinām Å”o problēmu ar digitālā paraksta mehānismu pārbaudÄ«t_sig pirms atlikuma pārbaudes, kas nozÄ«mē, ka Alise izmanto savu privāto atslēgu, lai parakstÄ«tu darÄ«jumu un apstiprinātu, ka viņa ir savu monētu Ä«paÅ”niece.

Blockchain programmēŔanas valodas

EsoŔās blokķēdes valodas saskaras ar Ŕādām problēmām (visas tika atrisinātas programmā Move (piezÄ«me: diemžēl raksta autors savos salÄ«dzinājumos piesaista tikai Ethereum, tāpēc ir vērts tos ņemt tikai Å”ajā kontekstā. Piemēram, lielākā daļa no Ŕīm darbÄ«bām ir atrisinātas arÄ« EOS.)):

AktÄ«vu netieÅ”a attēloÅ”ana. LÄ«dzeklis tiek kodēts, izmantojot veselu skaitli, bet vesels skaitlis nav tas pats, kas aktÄ«vs. Faktiski nav neviena veida vai vērtÄ«bas, kas atspoguļotu Bitcoin/Ether/<Jebkuru monētu>! Tas apgrÅ«tina tādu programmu rakstÄ«Å”anu, kurās tiek izmantoti lÄ«dzekļi, un ir iespēja kļūdÄ«ties. Tādiem modeļiem kā lÄ«dzekļu nodoÅ”ana procedÅ«rām/no tām vai lÄ«dzekļu glabāŔana struktÅ«rās ir nepiecieÅ”ams Ä«paÅ”s valodas atbalsts.

DeficÄ«ts nav paplaÅ”ināms... Valoda pārstāv tikai vienu ierobežotu vērtÄ«bu. Turklāt lÄ«dzekļi pret trÅ«kumu ir tieÅ”i saistÄ«ti ar paÅ”as valodas semantiku. Izstrādātājam, ja viņŔ vēlas izveidot pielāgotu lÄ«dzekli, paÅ”am rÅ«pÄ«gi jāpārvalda visi resursa aspekti. TieÅ”i tādas ir Ethereum viedo lÄ«gumu problēmas.

Lietotāji izsniedz savus aktÄ«vus, ERC-20 marÄ·ierus, izmantojot veselus skaitļus, lai noteiktu gan vērtÄ«bu, gan kopējo piedāvājumu. Kad tiek izveidoti jauni žetoni, viedā lÄ«guma kodam ir neatkarÄ«gi jāpārbauda atbilstÄ«ba emisijas noteikumiem. Turklāt netieÅ”a aktÄ«vu uzrādÄ«Å”ana dažos gadÄ«jumos rada nopietnas kļūdas - dublÄ“Å”anos, dubultus tēriņus vai pat pilnÄ«gu aktÄ«vu zaudÄ“Å”anu.

ElastÄ«gas piekļuves kontroles trÅ«kums... VienÄ«gā mÅ«sdienās izmantotā piekļuves kontroles politika ir paraksta shēma, kurā izmantota asimetriska kriptogrāfija. Tāpat kā aizsardzÄ«ba pret trÅ«kumu, arÄ« piekļuves kontroles politika ir dziļi iestrādāta valodas semantikā. Bet kā paplaÅ”ināt valodu, lai programmētāji varētu definēt savas piekļuves kontroles politikas, bieži vien ir ļoti grÅ«ts uzdevums.

Tas attiecas arÄ« uz Ethereum, kur viedajiem lÄ«gumiem nav vietējās kriptogrāfijas atbalsta piekļuves kontrolei. Izstrādātājiem ir manuāli jāiestata piekļuves kontrole, piemēram, izmantojot tikai Ä«paÅ”nieka modifikatoru.

Lai gan esmu liels Ethereum cienÄ«tājs, uzskatu, ka droŔības nolÅ«kos valodai ir jāatbalsta lÄ«dzekļu rekvizÄ«ti. Jo Ä«paÅ”i Ether pārsÅ«tÄ«Å”ana uz viedo lÄ«gumu ietver dinamisku nosÅ«tÄ«Å”anu, kas ir ieviesusi jaunu kļūdu klasi, kas pazÄ«stama kā atkārtotas ieejas ievainojamÄ«bas. Dinamiskā nosÅ«tÄ«Å”ana Å”eit nozÄ«mē, ka koda izpildes loÄ£ika tiks noteikta izpildlaikā (dinamiskā), nevis kompilÄ“Å”anas laikā (statiskā).

Tādējādi Solidity, kad lÄ«gums A izsauc funkciju lÄ«gumā B, lÄ«gums B var palaist kodu, ko nebija paredzējis lÄ«guma A izstrādātājs, kā rezultātā var tikt atkārtotas ievadÄ«Å”anas ievainojamÄ«bas (lÄ«gums A nejauÅ”i darbojas kā lÄ«gums B, lai izņemtu naudu pirms konta atlikumu faktiskās atskaitÄ«Å”anas).

Move Language Design Fundamentals

Pirmās kārtas resursi

Augstā līmenī Move valodas moduļu / resursu / procedūru mijiedarbība ir ļoti līdzīga saistībai starp klasēm / objektiem un metodēm OOP valodās.
PārvietoÅ”anas moduļi ir lÄ«dzÄ«gi viedajiem lÄ«gumiem citās blokķēdēs. Modulis deklarē resursu veidus un procedÅ«ras, kas nosaka deklarēto resursu izveides, iznÄ«cināŔanas un atjaunināŔanas noteikumus. Bet tas viss ir tikai konvencijas ("žargonāā€) In Move. Mēs ilustrēsim Å”o punktu nedaudz vēlāk.

Elastīgums

Move pieŔķir Svariem elastÄ«bu, izmantojot skriptus. Katrs darÄ«jums Svaros ietver skriptu, kas bÅ«tÄ«bā ir darÄ«juma pamatprocedÅ«ra. Skripts var veikt vai nu vienu norādÄ«to darbÄ«bu, piemēram, maksājumus noteiktam adresātu sarakstam, vai atkārtoti izmantot citus resursus ā€“ piemēram, izsaucot procedÅ«ru, kurā ir norādÄ«ta vispārējā loÄ£ika. Tāpēc Move darÄ«jumu skripti piedāvā lielāku elastÄ«bu. Skripts var izmantot gan vienreizēju, gan atkārtotu uzvedÄ«bu, savukārt Ethereum var izpildÄ«t tikai atkārtojamus skriptus (vienu metodi izsaucot viedā lÄ«guma metodē). Iemesls, kāpēc to sauc par "atkārtoti lietojamu", ir tāpēc, ka viedā lÄ«guma funkcijas var izpildÄ«t vairākas reizes. (PiezÄ«me: Lieta Å”eit ir ļoti smalka. No vienas puses, Bitcoin eksistē arÄ« darÄ«jumu skripti pseidobaitu koda veidā. No otras puses, kā es saprotu, Move paplaÅ”ina Å”o valodu faktiski lÄ«dz pilnvērtÄ«gas viedās lÄ«gumu valodas lÄ«menim).

DroŔība

Move izpildāmais formāts ir baitkods, kas, no vienas puses, ir augstāka lÄ«meņa valoda nekā montāžas valoda, bet zemāka lÄ«meņa nekā pirmkods. Baitkodam izpildes laikā (ķēdē) tiek pārbaudÄ«ti resursi, veidi un atmiņas droŔība, izmantojot baitkoda verificētāju, un pēc tam to izpilda tulks. Å Ä« pieeja ļauj Move nodroÅ”ināt pirmkoda droŔību, taču bez kompilācijas procesa un nepiecieÅ”amÄ«bas sistēmai pievienot kompilatoru. Making Move baitkoda valoda ir patieŔām labs risinājums. Tas nav jākompilē no avota, kā tas ir Solidity gadÄ«jumā, un nav jāuztraucas par iespējamām kļūmēm vai uzbrukumiem kompilatora infrastruktÅ«rai.

Pārbaudāmība

MÅ«su mērÄ·is ir veikt pārbaudes pēc iespējas vienkārŔāk, jo tas viss tiek darÄ«ts ķēdē (piezÄ«me: tieÅ”saistē, katra darÄ«juma izpildes laikā, tāpēc jebkura kavÄ“Å”anās noved pie visa tÄ«kla palēnināŔanās), tomēr sākotnēji valodas dizains ir gatavs izmantot ārpus ķēdes statiskās verifikācijas rÄ«kus. Lai gan tas ir vēlams, pagaidām verifikācijas rÄ«ku (kā atseviŔķa rÄ«ku komplekta) izstrāde ir atlikta uz nākotni, un tagad tiek atbalstÄ«ta tikai dinamiskā verifikācija izpildlaikā (ķēdē).

Modularitāte

PārvietoÅ”anas moduļi nodroÅ”ina datu iegÅ«Å”anu un resursu kritisko darbÄ«bu lokalizāciju. IekļauÅ”ana, ko nodroÅ”ina modulis, apvienojumā ar Move tipa sistēmas nodroÅ”ināto aizsardzÄ«bu nodroÅ”ina, ka moduļa veidos iestatÄ«tās Ä«paŔības nevar pārkāpt kods ārpus moduļa. Tas ir diezgan labi pārdomāts abstrakcijas dizains, kas nozÄ«mē, ka dati lÄ«guma ietvaros var mainÄ«ties tikai lÄ«guma ietvaros, bet ne ārpus tā.

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Pārvietot pārskatu

DarÄ«juma skripta piemērs parāda, ka ļaunprātÄ«gas vai neuzmanÄ«gas darbÄ«bas, ko veic programmētājs ārpus moduļa, nevar apdraudēt moduļa resursu droŔību. Tālāk mēs apskatÄ«sim piemērus, kā moduļi, resursi un procedÅ«ras tiek izmantotas Svaru blokķēdes programmÄ“Å”anai.

Vienādranga maksājumi

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Summā norādītais monētu skaits tiks pārskaitīts no sūtītāja atlikuma saņēmējam.
Šeit ir dažas jaunas lietas (izceltas sarkanā krāsā):

  • 0x0: tā konta adrese, kurā tiek glabāts modulis
  • ValÅ«ta: moduļa nosaukums
  • Monēta: resursa veids
  • ProcedÅ«ras atgrieztā monētas vērtÄ«ba ir resursa vērtÄ«ba 0x0.Currency.Coin
  • pārvietot (): vērtÄ«bu nevar izmantot vēlreiz
  • kopēt (): vērtÄ«bu var izmantot vēlāk

Analizējiet kodu: pirmajā solī sūtītājs izsauc procedūru ar nosaukumu atsaukt_ no sūtītāja no moduļa, kas saglabāts 0x0. Valūta. Otrajā solī sūtītājs pārskaita līdzekļus saņēmējam, pārvietojot monētas resursa vērtību moduļa iemaksas procedūrā. 0x0. Valūta.

Šeit ir trīs koda kļūdu piemēri, kuras tiks noraidītas, veicot pārbaudes:
Dublējiet lÄ«dzekļus, mainot zvanu pārvietoties (monēta) par kopija (monēta). Resursus var tikai pārvietot. Mēģinot dublēt resursa daudzumu (piemēram, zvanot kopija (monēta) iepriekÅ” minētajā piemērā), pārbaudot baitu kodu, radÄ«sies kļūda.

LÄ«dzekļu atkārtota izmantoÅ”ana, norādot pārvietoties (monēta) divreiz . LÄ«nijas pievienoÅ”ana 0x0.Currency.deposit (kopēt (kāds_cits_maksājuma saņēmējs), pārvietot (monēta)) piemēram, iepriekÅ” minētais ļaus sÅ«tÄ«tājam ā€œiztērētā€ monētas divas reizes - pirmo reizi ar maksājuma saņēmēju, bet otro ar kāds_cits_maksājuma saņēmējs. Tā ir nevēlama rÄ«cÄ«ba, kas nav iespējama ar fizisku Ä«paÅ”umu. Par laimi Move noraidÄ«s Å”o programmu.

LÄ«dzekļu zaudējums atteikuma dēļ pārvietoties (monēta). Ja nepārvietojat resursu (piemēram, dzÄ“Å”ot rindu, kurā ir pārvietoties (monēta)), tiks parādÄ«ta baitkoda verifikācijas kļūda. Tas pasargā Move programmētājus no nejauÅ”a vai ļaunprātÄ«ga lÄ«dzekļu zaudējuma.

Valūtas modulis

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Katrā kontā var būt 0 vai vairāki moduļi (parādīti kā taisnstūri) un viena vai vairākas resursu vērtības (parādītas kā cilindri). Piemēram, konts vietnē 0x0 satur moduli 0x0. Valūta un resursa veida vērtību 0x0.Valūta.Monēta. Konts adresē 0x1 ir divi resursi un viens modulis; Konts adresē 0x2 ir divi moduļi un viena resursa vērtība.

Nekotory momenti:

  • DarÄ«juma skripts ir atomārs - vai nu tas tiek izpildÄ«ts pilnÄ«bā, vai arÄ« netiek izpildÄ«ts vispār.
  • Modulis ir ilgmūžīgs koda fragments, kas ir pieejams visā pasaulē.
  • Globālais stāvoklis ir strukturēts kā hash tabula, kur atslēga ir konta adrese
  • Kontos var bÅ«t ne vairāk kā viena noteikta veida resursa vērtÄ«ba un ne vairāk kā viens modulis ar noteiktu nosaukumu (konts 0x0 nevar saturēt papildu resursus 0x0.ValÅ«ta.Monēta vai cits modulis ar nosaukumu ValÅ«ta)
  • Deklarētā moduļa adrese ir daļa no tipa (0x0.ValÅ«ta.Monēta Šø 0x1.ValÅ«ta.Monēta ir atseviŔķi veidi, kurus nevar izmantot savstarpēji aizstājot)
  • Programmētāji var saglabāt kontā vairākus Ŕāda veida resursa gadÄ«jumus, definējot savu pielāgoto resursu - (resurss TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Varat atsaukties uz resursu pēc tā nosaukuma bez konfliktiem, piemēram, varat atsaukties uz diviem resursiem, kas izmanto TwoCoins.c1 Šø TwoCoins.c2.

Monētu resursu paziņojums

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra
Modulis nosaukts Valūta un resursa veids ar nosaukumu Monēta

Nekotory momenti:

  • Monēta ir struktÅ«ra ar vienu tipa lauku u64 (64 bitu neparakstÄ«ts vesels skaitlis)
  • Tikai moduļa procedÅ«ras ValÅ«ta var izveidot vai iznÄ«cināt Ŕāda veida vērtÄ«bas Monēta.
  • Citi moduļi un skripti var ierakstÄ«t vērtÄ«bas lauku vai atsaukties uz to, izmantojot tikai moduļa nodroÅ”inātās publiskās procedÅ«ras.

Depozīta pārdoŔana

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Šī procedūra pieņem resursu Monēta kā ievadi un apvieno to ar resursu Monētaglabājas saņēmēja kontā:

  1. Ievades resursa Monētas iznÄ«cināŔana un tās vērtÄ«bas reÄ£istrÄ“Å”ana.
  2. Saņemt saiti uz unikālu monētu resursu, kas glabājas saņēmēja kontā.
  3. Monētu skaita vērtības maiņa par parametrā nodoto vērtību, izsaucot procedūru.

Nekotory momenti:

  • Izpakojiet, BorrowGlobal - iebÅ«vētās procedÅ«ras
  • Izpakojiet Tas ir vienÄ«gais veids, kā izdzēst T tipa resursu. ProcedÅ«ra izmanto resursu kā ievadi, iznÄ«cina to un atgriež vērtÄ«bu, kas saistÄ«ta ar resursa laukiem.
  • AizņemtiesGlobal izmanto adresi kā ievadi un atgriež atsauci uz unikālu T gadÄ«jumu, ko publicējusi (pieder) Ŕī adrese
  • &mut Monēta Ŕī ir saite uz resursu Monēta

IzņemÅ”anas_no_sÅ«tÄ«tāja ievieÅ”ana

Iedziļinieties Move ā€” Facebook Blockchain programmÄ“Å”anas valodā Libra

Šī procedūra:

  1. Iegūst saiti uz unikālu resursu Monēta, kas ir saistīts ar sūtītāja kontu
  2. Samazina resursa vērtību Monēta izmantojot saiti par norādīto summu
  3. Izveido un atgriež jaunu resursu Monēta ar atjauninātu bilanci.

Nekotory momenti:

  • NoguldÄ«jums var izraisÄ«t jebkurÅ”, bet atsaukt_ no sÅ«tÄ«tāja var piekļūt tikai zvanÄ«tāja konta monētām
  • GetTxnSenderAddress lÄ«dzÄ«gs msg.sender in Solidity
  • NoraidÄ«t Ja vien lÄ«dzÄ«gs pieprasÄ«t in Solidity. Ja Ŕī pārbaude neizdodas, darÄ«jums tiek apturēts un visas izmaiņas tiek atsauktas.
  • Komplekts tā ir arÄ« iebÅ«vēta procedÅ«ra, kas rada jaunu T tipa resursu.
  • Kā arÄ« Izpakojiet, Komplekts var izsaukt tikai tajā modulÄ«, kurā ir aprakstÄ«ts resurss T

Secinājums

Mēs pārbaudÄ«jām Move valodas galvenās Ä«paŔības, salÄ«dzinājām to ar Ethereum, kā arÄ« iepazināmies ar skriptu pamata sintaksi. Visbeidzot, es ļoti iesaku pārbaudÄ«t oriÄ£ināls balts papÄ«rs. Tas ietver daudz detaļu par programmÄ“Å”anas valodas dizaina principiem, kā arÄ« daudzas noderÄ«gas saites.

Avots: www.habr.com

Pievieno komentāru