Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Järgmisena kaalume üksikasjalikult Move keele põhiomadusi ja mis on selle peamised erinevused teise, juba arukate lepingute jaoks populaarse keelega - Solidity (Ethereumi platvormil). Materjal põhineb 26-leheküljelise veebipõhise valge raamatu uurimisel.

Sissejuhatus

Move on käivitatava baitkoodi keel, mida kasutatakse kasutajatehingute ja nutikate lepingute täitmiseks. Pange tähele kahte punkti:

  1. Kuigi Move on baitkoodikeel, mida saab virtuaalmasinas Move otse käivitada, on Solidity (Ethereumi nutikas lepingukeel) kõrgema taseme keel, mis enne EVM-is (Ethereum Virtual Machine) käivitamist kompileeritakse kõigepealt baitkoodiks.
  2. Move'i saab kasutada mitte ainult arukate lepingute rakendamiseks, vaid ka kohandatud tehingute tegemiseks (sellest lähemalt hiljem), samas kui Solidity on arukas ainult lepingute keel.


Tõlke teostas INDEXi protokolli projektimeeskond. Oleme juba tõlkinud suur materjal, mis kirjeldab Kaalude projekti, nüüd on aeg vaadata liigutuskeelt veidi üksikasjalikumalt. Tõlge viidi läbi koostöös Habrauseriga coolsiu

Move'i põhifunktsioon on võime määratleda kohandatud ressursitüüpe lineaarsel loogikal põhineva semantikaga: ressurssi ei saa kunagi kopeerida ega kaudselt kustutada, vaid ainult teisaldada. Funktsionaalselt sarnaneb see Rusti keele võimalustega. Rooste väärtusi saab korraga määrata ainult ühele nimele. Väärtuse määramine teisele nimele muudab selle eelmise nime all kättesaamatuks.

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Näiteks järgmine koodilõik annab vea: Teisaldatud väärtuse „x” kasutamine. Seda seetõttu, et Rustis puudub prügikoristus. Kui muutujad jäävad reguleerimisalast välja, vabaneb ka neile viidatud mälu. Lihtsamalt öeldes võib andmetel olla ainult üks "omanik". Selles näites x on algne omanik ja siis y saab uueks omanikuks. Loe selle käitumise kohta lähemalt siit.

Digitaalsete varade kujutamine avatud süsteemides

Füüsilistel varadel on kaks omadust, mida on raske digitaalselt esitada:

  • Haruldus (Nappus, algselt nappus). Varade arvu (emissiooni) süsteemis tuleb kontrollida. Olemasolevate varade paljundamine tuleb keelata ja uute loomine on privilegeeritud toiming.
  • Juurdepääsu kontroll... Süsteemis osaleja peab suutma varasid kaitsta juurdepääsu kontrollipoliitikate abil.

Need kaks omadust, mis on füüsiliste varade jaoks loomulikud, tuleb digiobjektide puhul rakendada, kui tahame neid varana käsitleda. Näiteks haruldasel metallil on loomulik nappus ja ainult teil on sellele juurdepääs (näiteks käes hoides) ja saate seda müüa või kulutada.

Et illustreerida, kuidas me nende kahe kinnisvara juurde jõudsime, alustame järgmiste lausetega:

Soovitus nr 1: lihtsaim reegel ilma nappuse ja juurdepääsu kontrollita

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

  • G [K]: = n tähistab võtme abil juurdepääsetava numbri värskendamist К plokiahela globaalses olekus uue tähendusega n.
  • tehing (Alice, 100) tähendab Alice'i konto saldo seadmist 100 -le.

Ülaltoodud lahendusel on mitmeid olulisi probleeme:

  • Alice saab piiramatul arvul münte lihtsalt saatmise teel tehing lAlice, 100⟩.
  • Mündid, mida Alice Bobile saadab, on kasutud, kuna Bob võib sama tehnikat kasutades saata endale piiramatu arvu münte.

Ettepanek nr 2: puudujäägi arvestamine

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Nüüd jälgime olukorda nii, et müntide arv Ka oli vähemalt võrdne n enne ülekandetehingut. Kuigi see lahendab nappuse probleemi, puudub teave selle kohta, kes saab Alice'i münte saata (praegu saab seda teha igaüks, peamine on mitte rikkuda koguse piiramise reeglit).

Ettepanek # 3: ühendada nappus ja juurdepääsu kontroll

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Lahendame selle probleemi digitaalallkirja mehhanismiga check_sig enne saldo kontrollimist, mis tähendab, et Alice kasutab tehingu allkirjastamiseks oma isiklikku võtit ja kinnitab, et ta on oma müntide omanik.

Plokiahela programmeerimiskeeled

Olemasolevad plokiahela keeled seisavad silmitsi järgmiste probleemidega (kõik need lahendati rakenduses Move (märkus: kahjuks apelleerib artikli autor oma võrdlustes ainult Ethereumile, seega tasub neid võtta ainult selles kontekstis. Näiteks enamik järgnevatest lahendatakse ka EOS -is.)):

Varade kaudne esitus. Vara kodeeritakse täisarvu abil, kuid täisarv ei ole sama, mis vara. Tegelikult pole Bitcoini/Eetrit/<Ühtegi münti> esindavat tüüpi ega väärtust! See muudab varasid kasutavate programmide kirjutamise keeruliseks ja veaohtlikuks. Sellised mustrid nagu varade suunamine protseduuridele/protseduuridest või varade säilitamine struktuurides nõuavad keelelt erilist tuge.

Puudujääk ei ole laiendatav... Keel on vaid üks napp vara. Lisaks on vahendid nappuse vastu seotud otse keele semantikaga. Kui arendaja soovib luua kohandatud vara, peab ta arendaja ise hoolikalt kontrollima kõiki ressursi aspekte. Just need on Ethereumi nutikate lepingute probleemid.

Kasutajad väljastavad oma vara, ERC-20 märgid, kasutades täisväärtusi, et määrata nii väärtus kui ka kogu pakkumine. Alati, kui luuakse uusi märke, peab nutikas lepingukood sõltumatult kontrollima heitkoguste reeglite järgimist. Lisaks toob varade kaudne esitamine mõnel juhul kaasa tõsiseid vigu - dubleerimist, kahekordset kulutamist või isegi täielikku kaotust.

Paindliku juurdepääsu kontrolli puudumine... Ainus täna kasutatav juurdepääsukontrolli poliitika on allkirja skeem, mis kasutab asümmeetrilist krüptograafiat. Nagu puudusekaitse, on ka juurdepääsu kontrollipoliitika sügavalt sisse lülitatud keele semantikasse. Kuid see, kuidas keelt laiendada, et programmeerijad saaksid ise oma juurdepääsu kontrollipoliitikaid määratleda, on sageli väga keeruline ülesanne.

See kehtib ka Ethereumi kohta, kus nutikatel lepingutel pole juurdepääsu kontrollimiseks krüptograafia natiivset tuge. Arendajad peavad käsitsi määrama juurdepääsu juhtimise, kasutades näiteks ainult omaniku modifikaatorit.

Kuigi olen suur Ethereumi fänn, usun, et turvalisuse huvides peaks keel põhivarade atribuute toetama. Eelkõige hõlmab Etheri nutikale lepingule üleviimine dünaamilist saatmist, mis on toonud kaasa uue klassi vigade, mida nimetatakse taassisenemise haavatavusteks. Dünaamiline saatmine tähendab siin seda, et koodi täitmisloogika määratakse pigem käitusajal (dünaamiline), mitte kompileerimise ajal (staatiline).

Seega, kui leping A kutsub Solidity's välja lepingus B oleva funktsiooni, võib leping B käivitada koodi, mida lepingu A arendaja ei kavandanud, mis võib põhjustada taassisenemise haavatavused (leping A toimib kogemata lepinguna B raha väljavõtmiseks enne kontojääkide tegelikku mahaarvamist).

Move Language Design Fundamentals

Esimese järgu ressursid

Kõrgel tasemel on Move -keele moodulite / ressursside / protseduuride vastastikune toime väga sarnane klasside / objektide ja meetodite vahelisele suhtele OOP -keeltes.
Liigutusmoodulid on sarnased nutikate lepingutega teistes plokiahelates. Moodul deklareerib ressursitüübid ja protseduurid, mis määratlevad deklareeritud ressursside loomise, hävitamise ja värskendamise reeglid. Kuid kõik need on vaid kokkulepped ("kõnepruuk”) Liikumises. Illustreerime seda punkti veidi hiljem.

Paindlikkus

Move lisab Kaalud skriptimise kaudu paindlikkust. Iga Kaalude tehing sisaldab skripti, mis on sisuliselt tehingu põhiprotseduur. Skript võib sooritada kas ühte määratud toimingut, näiteks makseid määratud adressaatide loendile, või taaskasutada muid ressursse – näiteks kutsudes välja protseduuri, milles on määratud üldine loogika. Seetõttu pakuvad Move tehinguskriptid suuremat paindlikkust. Skript võib kasutada nii ühekordset kui ka korduvat käitumist, samas kui Ethereum saab käivitada ainult korratavaid skripte (kutsudes ühe meetodi nutika lepingu meetodil). Põhjus, miks seda nimetatakse korduvkasutatavaks, on see, et nutika lepingu funktsioone saab täita mitu korda. (Märge: Mõte on siin väga peen. Ühest küljest eksisteerivad Bitcoinis ka pseudobaitkoodi kujul tehinguskriptid. Teisest küljest, nagu ma aru saan, laiendab Move seda keelt tegelikult täieõigusliku nutika lepingu keele tasemele).

turvalisus

Käivitatav vorming Move on baitkood, mis on ühest küljest kõrgema taseme keel kui assemblerkeel, kuid madalam kui lähtekood. Baitkoodi kontrollitakse käitusajal (ahelas) ressursside, tüüpide ja mälu turvalisuse osas, kasutades baitkoodi kontrollijat, ning seejärel käivitab tõlk. See lähenemisviis võimaldab Move'il tagada lähtekoodi turvalisuse, kuid ilma kompileerimisprotsessita ja vajaduseta lisada süsteemi kompilaatorit. Move'i baitkoodi keele tegemine on tõesti hea lahendus. Seda ei pea kompileerima lähtekoodist, nagu Solidity puhul, ning pole vaja karta kompilaatori infrastruktuuri võimalike tõrgete või rünnakute pärast.

Kontrollitavus

Meie eesmärk on teha kontrolle võimalikult lihtsalt, kuna see kõik toimub ahelas (märkus: võrgus, iga tehingu tegemise ajal, nii et iga viivitus viib kogu võrgu aeglustumiseni), kuid esialgu on keelekujundus valmis kasutama ahelaväliseid staatilisi kontrollitööriistu. Kuigi see on eelistatavam, on praegu verifitseerimisvahendite (eraldi tööriistakomplektina) arendamine tulevikku edasi lükatud ja nüüd toetatakse ainult dünaamilist kontrollimist tööajal (ahelas).

Modulaarsus

Liigutusmoodulid pakuvad andmete ammutamist ja ressursside jaoks kriitiliste toimingute lokaliseerimist. Mooduli pakendamine koos Move tüüpi süsteemi pakutava kaitsega tagab, et mooduli tüüpidele seatud omadusi ei saa rikkuda mooduliväline kood. See on üsna läbimõeldud abstraktsioonikujundus, mis tähendab, et lepingusisesed andmed võivad muutuda ainult lepingu raames, kuid mitte väljaspool.

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Liiguta ülevaade

Tehinguskripti näide näitab, et programmeerija pahatahtlikud või hoolimatud toimingud väljaspool moodulit ei saa kahjustada mooduli ressursside turvalisust. Järgnevalt vaatame näiteid selle kohta, kuidas moodulite, ressursside ja protseduuride abil Kaalude plokiahelat programmeeritakse.

Peer-to-Peer maksed

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Summas märgitud arv münte kantakse saatja saldolt saajale.
Siin on mõned uued asjad (punasega esile tõstetud):

  • 0x0: selle konto aadress, kuhu moodul on salvestatud
  • valuuta: mooduli nimi
  • Münt: ressursi tüüp
  • Protseduuriga tagastatud mündi väärtus on ressursi väärtus 0x0.Currency.Coin
  • liikuma (): väärtust ei saa uuesti kasutada
  • koopia (): väärtust saab hiljem kasutada

Sõeluge kood: esimeses etapis kutsub saatja protseduuri nimega tagasi_ saatjalt salvestatud moodulist 0x0. Valuuta. Teises etapis kannab saatja raha adressaadile, teisaldades mündiressursi väärtuse mooduli sissemakseprotseduuri 0x0. Valuuta.

Siin on kolm näidet koodis esinevatest vigadest, mida kontrollid tagasi lükatakse.
Kopeerige raha, muutes kõnet liikuma (münt) edasi koopia (münt). Ressursse saab ainult teisaldada. Proovige dubleerida ressursi kogust (näiteks helistades koopia (münt) ülaltoodud näites) põhjustab baitkoodi kontrollimisel tõrke.

Vahendite taaskasutamine, täpsustades liikuma (münt) kaks korda . Rea lisamine 0x0.Currency.deposit (kopeeri (mingi_teine_maksesaaja), liiguta (münt)) Näiteks ülaltoodu võimaldab saatjal münte kaks korda "kulutada" - esimest korda koos makse saaja ja teisel mõni_muu_maksesaaja. See on ebasoovitav käitumine, mis ei ole füüsilise varaga võimalik. Õnneks lükkab Move selle programmi tagasi.

Raha kaotamine keeldumise tõttu liikuma (münt). Kui te ressurssi ei teisalda (näiteks kustutades rea, mis sisaldab liikuma (münt)), kuvatakse baitkoodi kinnitusviga. See kaitseb Move'i programmeerijaid juhusliku või pahatahtliku rahakao eest.

Valuuta moodul

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

Iga konto võib sisaldada 0 või enamat moodulit (näidatud ristkülikuna) ja ühte või mitut ressursi väärtust (näidatud silindritena). Näiteks konto aadressil 0x0 sisaldab moodulit 0x0. Valuuta ja ressursi tüübi väärtus 0x0.Valuuta.Münt. Konto aadressil 0x1 on kaks ressurssi ja üks moodul; Konto aadressil 0x2 on kaks moodulit ja üks ressursi väärtus.

Nekotoorsed hetked:

  • Tehingu skript on atomaarne – kas see täidetakse täielikult või üldse mitte.
  • Moodul on pikaealine koodilõik, mis on ülemaailmselt juurdepääsetav.
  • Globaalne olek on üles ehitatud räsitabelina, kus võtmeks on konto aadress
  • Kontod ei tohi sisaldada rohkem kui ühte teatud tüüpi ressursi väärtust ja mitte rohkem kui ühte etteantud nimega moodulit (konto aadressil 0x0 ei saa sisaldada täiendavat ressurssi 0x0.Valuuta.Münt või muu nimega moodul valuuta)
  • Deklareeritud mooduli aadress on osa tüübist (0x0.Valuuta.Münt и 0x1.Valuuta.Münt on eraldi tüübid, mida ei saa vaheldumisi kasutada)
  • Programmeerijad saavad kontole salvestada mitu seda tüüpi ressursi eksemplari, määratledes oma kohandatud ressursi - (ressurss TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Ressursile saate viidata selle nime järgi ilma konfliktideta, näiteks võite viidata kahele ressursile TwoCoins.c1 и TwoCoins.c2.

Müntide ressursi teadaanne

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra
Moodul nimega valuuta ja ressursi tüüp nimega Münt

Nekotoorsed hetked:

  • Münt on ühe tüübiväljaga struktuur u64 (64-bitine märgita täisarv)
  • Ainult mooduli protseduurid valuuta saab luua või hävitada tüüpi väärtusi Münt.
  • Teised moodulid ja skriptid saavad väärtusvälja kirjutada või sellele viidata ainult mooduli pakutavate avalike protseduuride kaudu.

Hoiuse müük

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

See protseduur aktsepteerib ressurssi Münt sisendiks ja ühendab selle ressursiga Müntsalvestatud saaja kontole:

  1. Sisendressursi mündi hävitamine ja selle väärtuse registreerimine.
  2. Saate saaja kontole salvestatud ainulaadse mündiressursi lingi.
  3. Müntide arvu väärtuse muutmine protseduuri kutsumisel parameetris edastatud väärtuse võrra.

Nekotoorsed hetked:

  • Paki lahti, BorrowGlobal - sisseehitatud protseduurid
  • Pakkige lahti See on ainus viis T-tüüpi ressursi kustutamiseks. Protseduur võtab ressursi sisendiks, hävitab selle ja tagastab ressursi väljadega seotud väärtuse.
  • BorrowGlobal võtab sisendiks aadressi ja tagastab viite T unikaalsele eksemplarile, mille see aadress avaldab (omab).
  • &mut münt see on link ressursile Münt

Väljavõtmise_saatjast_tagasi rakendamine

Sukeldu Move – Facebooki plokiahela programmeerimiskeelde Libra

See protseduur:

  1. Hangib lingi ainulaadsele ressursile Münt, lingitud saatja kontoga
  2. Vähendab ressursi väärtust Münt lingi kaudu määratud summa eest
  3. Loob ja tagastab uue ressursi Münt uuendatud saldoga.

Nekotoorsed hetked:

  • Hoius võib põhjustada igaüks, kuid tagasi_ saatjalt on juurdepääs ainult helistaja konto müntidele
  • GetTxnSenderAddress sarnane msg.sender aastal Solidity
  • Keeldu, välja arvatud juhul sarnane nõudma aastal Solidity. Kui see kontroll ebaõnnestub, peatatakse tehing ja kõik muudatused tühistatakse.
  • Pakkida see on ka sisseehitatud protseduur, mis loob uue T-tüüpi ressursi.
  • Sama hästi kui Pakkige lahti, Pakkida saab kutsuda ainult selle mooduli sees, kus ressurssi kirjeldatakse T

Järeldus

Uurisime Move keele põhiomadusi, võrdlesime seda Ethereumiga ja tutvusime ka skriptide põhisüntaksiga. Lõpetuseks soovitan tungivalt üle vaadata originaal valge paber. See sisaldab palju üksikasju programmeerimiskeele kujundamise põhimõtete kohta, samuti palju kasulikke linke.

Allikas: www.habr.com

Lisa kommentaar