Potopite se v Move - Facebookov programski jezik verige blokov Libra

Nato bomo podrobno preučili glavne značilnosti jezika Move in njegove ključne razlike z drugim, že priljubljenim jezikom za pametne pogodbe - Solidity (na platformi Ethereum). Gradivo temelji na študiji razpoložljive spletne knjige na 26 straneh.

Predstavitev

Move je izvršljiv jezik bajtne kode, ki se uporablja za izvajanje uporabniških transakcij in pametnih pogodb. Upoštevajte dve točki:

  1. Medtem ko je Move jezik bajt kode, ki ga je mogoče neposredno izvesti na navideznem stroju Move, je Solidity (jezik pametne pogodbe Ethereum) jezik višje ravni, ki se najprej prevede v bajtko, preden se izvede na EVM (Ethereum Virtual Machine).
  2. Move se lahko uporablja ne le za izvajanje pametnih pogodb, ampak tudi za transakcije po meri (več o tem kasneje), medtem ko je Solidity jezik, ki je samo za pametne pogodbe.


Prevod je izvedla projektna skupina INDEX Protocol. Smo že prevedli veliko gradivo, ki opisuje projekt Libra, zdaj je čas, da si nekoliko podrobneje ogledamo jezik Move. Prevod smo izvedli skupaj s podjetjem Habrauser coolsiu

Ključna značilnost Move je zmožnost definiranja vrst virov po meri s semantiko, ki temelji na linearni logiki: vira ni mogoče nikoli kopirati ali implicitno izbrisati, temveč le premakniti. Funkcionalno je to podobno zmožnostim jezika Rust. Vrednosti v Rustu je mogoče dodeliti samo enemu imenu hkrati. Če drugemu imenu dodelite vrednost, ni na voljo pod prejšnjim imenom.

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Na primer, naslednji delček kode bo povzročil napako: Uporaba premaknjene vrednosti 'x'. To je zato, ker v Rustu ni zbiranja smeti. Ko spremenljivke gredo izven področja uporabe, se sprosti tudi pomnilnik, na katerega se nanašajo. Preprosto povedano, lahko je samo en "lastnik" podatkov. V tem primeru x je prvotni lastnik in potem y postane novi lastnik. Več o tem vedenju preberite tukaj.

Zastopanje digitalnih sredstev v odprtih sistemih

Obstajata dve lastnosti fizičnih sredstev, ki ju je težko digitalno predstaviti:

  • Redkost (Pomanjkanje, prvotno pomanjkanje). Število sredstev (emisij) v sistemu je treba nadzorovati. Podvajanje obstoječih sredstev je treba prepovedati, ustvarjanje novih pa je privilegirano dejanje.
  • Nadzor dostopa... Udeleženec sistema mora biti sposoben zaščititi sredstva z uporabo pravilnikov o nadzoru dostopa.

Ti dve lastnosti, ki sta naravni za fizična sredstva, je treba implementirati za digitalne objekte, če jih želimo obravnavati kot sredstva. Na primer, redka kovina ima naravno pomanjkanje in le vi imate dostop do nje (na primer, če jo držite v rokah) in jo lahko prodate ali porabite.

Za ponazoritev, kako smo prišli do teh dveh lastnosti, začnimo z naslednjimi stavki:

Predlog # 1: Najenostavnejše pravilo brez pomanjkanja in nadzora dostopa

Potopite se v Move - Facebookov programski jezik verige blokov Libra

  • G [K]: = n označuje posodobitev številke, ki je dostopna s ključem К v globalnem stanju verige blokov z novim pomenom n.
  • transakcija liceAlice, 100⟩ pomeni, da nastavite stanje Alice na 100.

Zgornja rešitev ima več velikih težav:

  • Alice lahko preprosto pošlje neomejeno število kovancev transakcija liceAlice, 100⟩.
  • Kovanci, ki jih Alice pošlje Bobu, so neuporabni, saj bi si Bob lahko z isto tehniko poslal neomejeno število kovancev.

Predlog # 2: Upoštevanje primanjkljaja

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Zdaj spremljamo stanje, tako da število kovancev Ka je bilo vsaj enako n pred transakcijo prenosa. Čeprav to rešuje problem pomanjkanja, ni podatkov o tem, kdo lahko pošlje Aliceine kovance (zaenkrat lahko to stori kdorkoli, glavna stvar je, da ne kršite pravila omejevanja zneska).

Predlog # 3: Združevanje pomanjkanja in nadzora dostopa

Potopite se v Move - Facebookov programski jezik verige blokov Libra

To težavo rešujemo z mehanizmom digitalnega podpisa verify_sig preden preveri stanje, kar pomeni, da Alice s svojim zasebnim ključem podpiše transakcijo in potrdi, da je lastnica svojih kovancev.

Programski jeziki Blockchain

Obstoječi jeziki blockchain se soočajo z naslednjimi težavami (vse so bile rešene v programu Move (opomba: na žalost se avtor članka v svojih primerjavah sklicuje le na Ethereum, zato jih je vredno vzeti le v tem kontekstu. Večino naslednjih je na primer rešeno tudi v sistemu EOS.)):

Posredno zastopanje sredstev. Sredstvo je kodirano s celim številom, vendar celo število ni isto kot sredstvo. Dejansko ni vrste ali vrednosti, ki bi predstavljala Bitcoin/Ether/<Any Coin>! Zaradi tega je pisanje programov, ki uporabljajo sredstva, težko in nagnjeno k napakam. Vzorci, kot je prenos sredstev v/iz postopkov ali shranjevanje sredstev v strukturah, zahtevajo posebno podporo jezika.

Primanjkljaja ni mogoče razširiti... Jezik predstavlja le eno redko bogastvo. Poleg tega so sredstva za zaščito pred pomanjkanjem neposredno povezana s semantiko jezika samega. Razvijalec, če želi ustvariti sredstvo po meri, mora sam skrbno nadzorovati vse vidike vira. Prav to so težave pametnih pogodb Ethereum.

Uporabniki izdajajo svoja sredstva, žetone ERC-20 z uporabo celih števil za določanje vrednosti in celotne ponudbe. Kadar koli se ustvarijo novi žetoni, mora koda pametne pogodbe neodvisno preveriti skladnost s pravili o emisijah. Poleg tega posredna predstavitev sredstev v nekaterih primerih vodi do resnih napak - podvajanja, dvojne porabe ali celo popolne izgube sredstev.

Pomanjkanje prilagodljivega nadzora dostopa... Edina politika nadzora dostopa, ki se danes uporablja, je shema podpisov, ki uporablja asimetrično kriptografijo. Tako kot zaščita pred pomanjkanjem so tudi politike nadzora dostopa globoko vpete v semantiko jezika. Toda razširitev jezika, ki programerjem omogoča, da sami določijo svoje politike nadzora dostopa, je pogosto zelo težavna naloga.

To velja tudi za Ethereum, kjer pametne pogodbe nimajo izvorne kriptografske podpore za nadzor dostopa. Razvijalci morajo ročno nastaviti nadzor dostopa, na primer z modifikatorjem onlyOwner.

Čeprav sem velik oboževalec Ethereuma, verjamem, da bi moral biti jezik za varnostne namene izvorno podprt z lastnostmi sredstev. Zlasti prenos Etherja v pametno pogodbo vključuje dinamično pošiljanje, ki je uvedlo nov razred hroščev, znanih kot ranljivosti pri ponovnem vstopu. Dinamično pošiljanje tukaj pomeni, da bo izvajalna logika kode določena v času izvajanja (dinamično) in ne v času prevajanja (statično).

Tako lahko v Solidityju, ko pogodba A pokliče funkcijo v pogodbi B, pogodba B izvaja kodo, ki je ni predvidel razvijalec pogodbe A, kar lahko povzroči ranljivosti pri ponovnem vstopu (pogodba A pomotoma deluje kot pogodba B za dvig denarja, preden se stanje na računu dejansko odšteje).

Premik Osnov oblikovanja jezika

Viri prvega reda

Na visoki ravni je interakcija med moduli / viri / postopki v jeziku Move zelo podobna razmerju med razredi / objekti in metodami v jezikih OOP.
Move moduli so podobni pametnim pogodbam v drugih verigah blokov. Modul razglaša vrste virov in postopke, ki opredeljujejo pravila za ustvarjanje, uničenje in posodabljanje prijavljenih virov. Toda vse to so le konvencije ("žargon”) V gibanju. To točko bomo ponazorili nekoliko kasneje.

Prilagodljivost

Move dodaja Libri prilagodljivost s skriptiranjem. Vsaka transakcija v Libri vključuje skript, ki je v bistvu osnovni postopek transakcije. Skript lahko izvede eno določeno dejanje, na primer plačila določenemu seznamu prejemnikov, ali ponovno uporabi druge vire - na primer s klicem postopka, v katerem je podana splošna logika. Zato transakcijski skripti Move ponujajo večjo prilagodljivost. Skript lahko uporablja enkratna in ponavljajoča se vedenja, medtem ko lahko Ethereum izvaja samo ponovljive skripte (priklic ene metode pri metodi pametne pogodbe). Razlog, da se imenuje "ponovno uporabna", je v tem, da se funkcije pametne pogodbe lahko izvedejo večkrat. (Opomba: Bistvo je zelo subtilno. Po eni strani transakcijski skripti v obliki psevdo-bajtne kode obstajajo tudi v Bitcoinu. Po drugi strani pa, kot razumem, Move razširi ta jezik pravzaprav na raven polnega jezika pametnih pogodb).

varnost

Format izvedljive datoteke Move je bajtna koda, ki je po eni strani jezik višje ravni kot zbirni jezik, vendar nižja raven kot izvorna koda. Bajtna koda se v času izvajanja (on-chain) preveri glede virov, vrst in varnosti pomnilnika z uporabo preveritelja bajtne kode, nato pa jo izvede tolmač. Ta pristop omogoča Move, da zagotovi varnost izvorne kode, vendar brez postopka prevajanja in potrebe po dodajanju prevajalnika v sistem. Pretvorba Move v jezik bajtne kode je res dobra rešitev. Ni ga treba prevesti iz izvorne kode, kot je to v primeru Solidityja, in ni treba skrbeti za morebitne okvare ali napade na infrastrukturo prevajalnika.

Preverljivost

Prizadevamo si za čim enostavnejšo izvedbo pregledov, saj vse to poteka v verigi (opomba: na spletu, med izvajanjem vsake transakcije, zato vsaka zamuda vodi v upočasnitev celotnega omrežja), vendar je na začetku jezikovna zasnova pripravljena za uporabo orodij za statično preverjanje zunaj verige. Čeprav je to bolj zaželeno, je bil razvoj orodij za preverjanje (kot ločenega kompleta orodij) zaenkrat odložen za prihodnost in zdaj je podprto samo dinamično preverjanje v času izvajanja (on-chain).

Modularnost

Moduli Move zagotavljajo odvzem podatkov in lokalizirajo kritične operacije na virih. Inkapsulacija, ki jo ponuja modul, v kombinaciji z zaščito, ki jo zagotavlja sistem tipa Move, zagotavlja, da lastnosti, nastavljene na vrstah modulov, ne morejo kršiti koda zunaj modula. To je dokaj premišljeno oblikovanje abstrakcije, kar pomeni, da se lahko podatki v pogodbi spreminjajo le v okviru pogodbe, ne pa tudi zunaj.

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Premakni pregled

Primer transakcijskega skripta dokazuje, da zlonamerna ali neprevidna dejanja programerja zunaj modula ne morejo ogroziti varnosti virov modula. Nato bomo pogledali primere, kako se moduli, viri in postopki uporabljajo za programiranje verige blokov Libra.

Peer-to-Peer plačila

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Število kovancev, določeno v znesku, bo preneseno iz pošiljateljevega stanja na prejemnika.
Tukaj je nekaj novih stvari (označenih z rdečo):

  • 0x0: naslov računa, v katerem je shranjen modul
  • valuta: ime modula
  • Coin: vrsta vira
  • Vrednost kovanca, ki jo vrne postopek, je vrednost vira tipa 0x0.Currency.Coin
  • premakni (): vrednosti ni mogoče znova uporabiti
  • kopirati (): vrednost lahko uporabite pozneje

Razčlenite kodo: v prvem koraku pošiljatelj pokliče postopek z imenom remove_from_sender iz modula, shranjenega v 0x0.Valuta. V drugem koraku pošiljatelj nakaže sredstva prejemniku tako, da vrednost sredstva kovanca premakne v postopek depozita modula 0x0.Valuta.

Tu so trije primeri napak v kodi, ki jih bodo preverjanja zavrnila:
Podvojite sredstva s spremembo klica premik (kovanec) o kopija (kovanec). Vire je mogoče le premikati. Poskus podvajanja količine vira (na primer s klicanjem kopija (kovanec) v zgornjem primeru) bo pri preverjanju bajtne kode prišlo do napake.

Ponovna uporaba sredstev z navedbo premik (kovanec) dvakrat . Dodajanje vrstice 0x0.Currency.deposit (kopiraj (nek_drugi_prejemnik), premakni (kovanec)) na primer, zgoraj navedeno bo pošiljatelju omogočilo, da kovance "porabi" dvakrat - prvič pri prejemniku plačila in drugič pri neki_drugi_prejemnik. To je neželeno vedenje, ki ni mogoče s fizičnim sredstvom. Na srečo bo Move zavrnil ta program.

Izguba sredstev zaradi zavrnitve premik (kovanec). Če vira ne premaknete (na primer tako, da izbrišete vrstico, ki vsebuje premik (kovanec)), bo vržena napaka pri preverjanju bajtne kode. To ščiti programerje Move pred nenamerno ali zlonamerno izgubo sredstev.

Valutni modul

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Vsak račun lahko vsebuje 0 ali več modulov (prikazanih kot pravokotniki) in eno ali več vrednosti virov (prikazanih kot valji). Na primer, račun pri 0x0 vsebuje modul 0x0.Valuta in vrednost vrste vira 0x0.Currency.Coin. Račun na naslovu 0x1 ima dva vira in en modul; Račun na naslovu 0x2 ima dva modula in eno vrednost vira.

Nekaj ​​utrinkov:

  • Transakcijski skript je atomičen – ali se izvede v celoti ali pa sploh ne.
  • Modul je dolgoživ kos kode, ki je globalno dostopen.
  • Globalno stanje je strukturirano kot zgoščena tabela, kjer je ključ naslov računa
  • Računi lahko vsebujejo največ eno vrednost vira dane vrste in največ en modul z danim imenom (račun na 0x0 ne more vsebovati dodatnega vira 0x0.Currency.Coin ali drug modul z imenom valuta)
  • Naslov deklariranega modula je del tipa (0x0.Currency.Coin и 0x1.Currency.Coin so ločene vrste, ki jih ni mogoče uporabljati zamenljivo)
  • Programerji lahko shranijo več primerkov te vrste vira v račun tako, da definirajo svoj vir po meri - (vir TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Na vir se lahko sklicujete po njegovem imenu brez sporov, na primer lahko se sklicujete na dva vira z uporabo Dva kovanca.c1 и Dva kovanca.c2.

Deklaracija virov kovancev

Potopite se v Move - Facebookov programski jezik verige blokov Libra
Ime modula valuta in vrsto vira z imenom Coin

Nekaj ​​utrinkov:

  • Coin je struktura z enim poljem tipa u64 (64-bitno celo število brez predznaka)
  • Samo postopki modula valuta lahko ustvari ali uniči vrednosti tipa Coin.
  • Drugi moduli in skripti lahko pišejo ali se sklicujejo na polje vrednosti samo prek javnih postopkov, ki jih zagotavlja modul.

Prodaja depozita

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Ta postopek sprejme vir Coin kot vhod in ga združi z virom Coinshranjeno v računu prejemnika:

  1. Uničenje vhodnega vira Coin in beleženje njegove vrednosti.
  2. Prejem povezave do edinstvenega vira Coin, shranjenega v prejemnikovem računu.
  3. Spreminjanje vrednosti števila kovancev z vrednostjo, ki je bila posredovana v parametru ob klicu postopka.

Nekaj ​​utrinkov:

  • Razpakiraj, BorrowGlobal - vgrajeni postopki
  • Razpakiraj To je edini način za brisanje vira tipa T. Postopek vzame vir kot vhod, ga uniči in vrne vrednost, povezano s polji vira.
  • BorrowGlobal vzame naslov kot vhod in vrne sklic na edinstven primerek T, ki ga je ta naslov objavil (lastnik).
  • &mut kovanec to je povezava do vira Coin

Izvedba odvzema_iz_pošiljatelja

Potopite se v Move - Facebookov programski jezik verige blokov Libra

Ta postopek:

  1. Dobi povezavo do edinstvenega vira Coin, povezan z računom pošiljatelja
  2. Zmanjša vrednost vira Coin preko povezave za navedeni znesek
  3. Ustvari in vrne nov vir Coin s posodobljenim stanjem.

Nekaj ​​utrinkov:

  • Deposit lahko povzroči kdorkoli, vendar remove_from_sender ima dostop samo do kovancev računa kličočega
  • GetTxnSenderAddress podoben msg.sender v Solidityju
  • Zavrni Razen podoben zahteva v Solidityju. Če to preverjanje ne uspe, se transakcija ustavi in ​​vse spremembe se razveljavijo.
  • Pack je tudi vgrajena procedura, ki ustvari nov vir tipa T.
  • Tako dobro, kot Razpakiraj, Pack je mogoče poklicati samo znotraj modula, kjer je vir opisan T

Zaključek

Preučili smo glavne značilnosti jezika Move, ga primerjali z Ethereumom, spoznali pa smo tudi osnovno sintakso skript. Končno toplo priporočam ogled originalni beli papir. Vključuje veliko podrobnosti v zvezi z načeli oblikovanja programskih jezikov, kot tudi veliko uporabnih povezav.

Vir: www.habr.com

Dodaj komentar