Farðu í Move - Libra blockchain forritunarmál Facebook

Næst munum við íhuga í smáatriðum helstu einkenni Move tungumálsins og hver er lykilmunurinn á því við annað, þegar vinsælt tungumál fyrir snjalla samninga - Solidity (á Ethereum pallinum). Efnið er byggt á rannsókn á 26 síðna hvítbók á netinu.

Inngangur

Move er keyranlegt bækikóða tungumál sem er notað til að framkvæma notendaviðskipti og snjalla samninga. Vinsamlegast athugaðu tvö atriði:

  1. Þó að Move sé bækikóðamál sem hægt er að keyra beint á Move sýndarvélinni, er Solidity (snjallsamningamál Ethereum) tungumál á hærra stigi sem er fyrst sett saman í bækióða áður en það er keyrt á EVM (Ethereum Virtual Machine).
  2. Hægt er að nota Move ekki aðeins til að innleiða snjalla samninga, heldur einnig fyrir sérsniðin viðskipti (nánar um þetta síðar), á meðan Solidity er snjallt samningsmál eingöngu.


Þýðingin var unnin af INDEX Protocol verkefnishópnum. Við höfum þegar þýtt stórt efni sem lýsir Vogverkefninu, nú er kominn tími til að skoða Move tungumálið aðeins nánar. Þýðingin var unnin í samvinnu við Habrauser coolsiu

Lykilatriði í Move er hæfileikinn til að skilgreina sérsniðnar auðlindagerðir með merkingarfræði byggða á línulegri rökfræði: auðlind er aldrei hægt að afrita eða óbeint eyða, aðeins færa. Virknilega séð er þetta svipað og getu Rust tungumálsins. Gildi í Rust er aðeins hægt að úthluta á eitt nafn í einu. Með því að úthluta gildi öðru nafni verður það ekki tiltækt undir fyrra nafni.

Farðu í Move - Libra blockchain forritunarmál Facebook

Til dæmis mun eftirfarandi kóðabútur henda villu: Notkun fært gildi 'x'. Þetta er vegna þess að það er engin sorphirða í Rust. Þegar breytur fara út fyrir gildissvið losnar minnið sem þær vísa til líka. Einfaldlega sagt, það getur aðeins verið einn „eigandi“ gagnanna. Í þessu dæmi x er upphaflegur eigandi og þá y verður nýr eigandi. Lestu meira um þessa hegðun hér.

Framsetning stafrænna eigna í opnum kerfum

Það eru tveir eiginleikar efnislegra eigna sem erfitt er að tákna stafrænt:

  • Sjaldgæfni (Skortur, upphaflega skortur). Stýra þarf fjölda eigna (losun) í kerfinu. Banna þarf fjölföldun á núverandi eignum og að búa til nýjar er forréttindaaðgerð.
  • Aðgangsstýring... Kerfisþátttakandi verður að geta verndað eignir með því að nota aðgangsstýringarstefnur.

Þessir tveir eiginleikar, sem eru eðlilegir fyrir efnislegar eignir, verður að útfæra fyrir stafræna hluti ef við viljum líta á þá sem eignir. Til dæmis hefur sjaldgæfur málmur náttúrulegan skort og aðeins þú hefur aðgang að honum (til dæmis með hann í höndunum) og þú getur selt eða eytt honum.

Til að sýna hvernig við komumst að þessum tveimur eiginleikum skulum við byrja á eftirfarandi setningum:

Tillaga # 1: Einfaldasta reglan án skorts og aðgangsstýringar

Farðu í Move - Libra blockchain forritunarmál Facebook

  • G [K]: = n táknar uppfærslu á númeri sem er aðgengilegt með lykli К í hnattrænu ástandi blockchain, með nýja merkingu n.
  • viðskipti ⟨Alice, 100⟩ þýðir að stilla reikningsstöðu Alice á 100.

Ofangreind lausn hefur nokkur stór vandamál:

  • Alice getur fengið ótakmarkaðan fjölda mynta með því einfaldlega að senda viðskipti ⟨Alice, 100⟩.
  • Myntirnar sem Alice sendir Bob eru gagnslausar þar sem Bob gæti sent sjálfum sér ótakmarkaðan fjölda mynta með sömu tækni.

Tillaga # 2: Að teknu tilliti til hallans

Farðu í Move - Libra blockchain forritunarmál Facebook

Nú erum við að fylgjast með ástandinu þannig að fjöldi mynt Ka var að minnsta kosti jafn n fyrir millifærsluviðskiptin. Hins vegar, á meðan þetta leysir skortsvandann, þá eru engar upplýsingar um hver getur sent mynt Alice (í augnablikinu getur hver sem er gert þetta, aðalatriðið er að brjóta ekki regluna um að takmarka magn).

Tillaga #3: Að sameina skort og aðgangsstýringu

Farðu í Move - Libra blockchain forritunarmál Facebook

Við leysum þetta vandamál með stafrænu undirskriftarkerfi sannreyna_sig áður en hún athugar stöðuna, sem þýðir að Alice notar einkalykilinn sinn til að skrifa undir viðskiptin og staðfesta að hún sé eigandi myntanna sinna.

Blockchain forritunarmál

Núverandi blockchain tungumál standa frammi fyrir eftirfarandi vandamálum (öll voru leyst í Move (athugið: því miður, höfundur greinarinnar höfðar aðeins til Ethereum í samanburði sínum, svo það er þess virði að taka þá aðeins í þessu samhengi. Til dæmis er flest af eftirfarandi einnig leyst í EOS.))):

Óbein framsetning eigna. Eign er kóðuð með heiltölu, en heiltala er ekki það sama og eign. Reyndar er engin tegund eða gildi sem táknar Bitcoin/Ether/<Any Coin>! Þetta gerir ritun forrita sem nota eignir erfið og villuhætt. Mynstur eins og að flytja eignir til/frá verklagi eða geyma eignir í mannvirkjum krefjast sérstaks stuðnings frá tungumálinu.

Hallinn er ekki stækkanlegur... Tungumál táknar aðeins eina af skornum skammti. Að auki eru úrræðin gegn skortinum tengd beint inn í merkingarfræði tungumálsins sjálfs. Framkvæmdaraðilinn, ef hann vill búa til sérsniðna eign, verður sjálfur að stjórna öllum þáttum auðlindarinnar vandlega. Þetta eru nákvæmlega vandamál Ethereum snjallsamninga.

Notendur gefa út eignir sínar, ERC-20 tákn, með því að nota heilar tölur til að ákvarða bæði verðmæti og heildarútgáfu. Í hvert skipti sem ný tákn eru búin til verður snjallsamningskóði sjálfstætt að sannreyna samræmi við losunarreglurnar. Að auki leiðir óbein framsetning eigna í sumum tilfellum til alvarlegra mistaka - tvíverknað, tvöföld eyðsla eða jafnvel algjört tap eigna.

Skortur á sveigjanlegri aðgangsstýringu... Eina aðgangsstýringarstefnan sem er í notkun í dag er undirskriftarkerfi sem notar ósamhverfa dulritun. Eins og skortsvörn er aðgangsstýringarstefna djúpt innbyggð í merkingarfræði tungumálsins. En hvernig á að útvíkka tungumálið til að leyfa forriturum að skilgreina eigin aðgangsstýringarstefnur er oft mjög flókið verkefni.

Þetta á einnig við um Ethereum, þar sem snjallsamningar eru ekki með innfæddan dulritunarstuðning fyrir aðgangsstýringu. Hönnuðir verða að stilla aðgangsstýringu handvirkt, til dæmis með því að nota onlyOwner breytileikann.

Jafnvel þó ég sé mikill aðdáandi Ethereum, tel ég að eignaeignir ættu að vera innfæddar studdar af tungumálinu í öryggisskyni. Sérstaklega, að flytja Ether yfir í snjallsamning felur í sér kraftmikla sendingu, sem hefur kynnt nýjan flokk af villum sem kallast endurinngönguveikleikar. Kvik sending þýðir hér að framkvæmdarrökfræði kóðans verður ákvörðuð á keyrslutíma (dýnamískt) frekar en á samantektartíma (static).

Þannig, í Solidity, þegar samningur A kallar á aðgerð í samningi B, getur samningur B keyrt kóða sem ekki var ætlaður af verktaki samnings A, sem getur leitt til veikleikar í endurkomu (samningur A virkar óvart sem samningur B um að taka út peninga áður en innstæður reikningsins eru í raun dregnar frá).

Move Language Design Fundamentals

Fyrstu röð úrræði

Á háu stigi er víxlverkun á milli eininga / auðlinda / verklags í Move tungumálinu mjög svipað og sambandið milli flokka / hluta og aðferða í OOP tungumálum.
Færa einingar eru svipaðar snjöllum samningum í öðrum blockchains. Einingin lýsir yfir gerðum tilfanga og verklagsreglum sem skilgreina reglur um að búa til, eyða og uppfæra yfirlýst tilföng. En allt eru þetta bara venjur (“hrognamál”) Á ferðinni. Við munum útskýra þetta atriði aðeins síðar.

Sveigjanleiki

Move bætir sveigjanleika við Vog í gegnum forskriftir. Sérhver viðskipti í Vog inniheldur handrit, sem er í meginatriðum kjarnaferlið í viðskiptunum. Handritið getur framkvæmt annað hvort eina tilgreinda aðgerð, til dæmis greiðslur til tiltekins lista yfir viðtakendur, eða endurnýtt önnur úrræði - til dæmis með því að kalla fram verklag þar sem almenn rökfræði er tilgreind. Þetta er ástæðan fyrir því að Færa viðskiptaforskriftir bjóða upp á meiri sveigjanleika. Forskrift getur notað bæði einskipti og endurtekna hegðun, á meðan Ethereum getur aðeins framkvæmt endurteknar forskriftir (kallar eina aðferð á snjallsamningsaðferð). Ástæðan fyrir því að það er kallað „endurnýtanlegt“ er vegna þess að hægt er að framkvæma aðgerðir snjallsamnings mörgum sinnum. (ath: Punkturinn hér er mjög lúmskur. Annars vegar eru viðskiptaforskriftir í formi gervibætakóða einnig til í Bitcoin. Á hinn bóginn, eins og ég skil það, stækkar Move þetta tungumál, í raun og veru upp á það stig sem er fullgilt snjallt samningamál).

öryggi

Move executable sniðið er bætikóði, sem er annars vegar tungumál á hærra stigi en samsetningarmál, en lægra stig en frumkóði. Bætakóðinn er athugaður í keyrslutíma (í keðju) fyrir tilföng, gerðir og minnisöryggi með því að nota bækakóða sannprófara og síðan keyrt af túlknum. Þessi nálgun gerir Move kleift að veita öryggi frumkóða, en án þess að safna saman ferlinu og þurfa að bæta þýðanda við kerfið. Það er mjög góð lausn að gera Move að bækikóðatungumáli. Það þarf ekki að safna saman frá uppruna eins og raunin er með Solidity, og það er engin þörf á að hafa áhyggjur af hugsanlegum bilunum eða árásum á þýðandainnviðina.

Staðfestan

Okkur er stefnt að því að framkvæma athuganir eins auðvelt og mögulegt er, þar sem allt er þetta gert á keðju (athugið: á netinu, meðan á framkvæmd hverrar færslu stendur, þannig að hvers kyns töf leiðir til hægfara á öllu netinu), þó í upphafi er tungumálahönnunin tilbúin til að nota truflanir sannprófunartæki utan keðju. Þó að þetta sé æskilegra, hefur þróun sannprófunarverkfæra (sem sérstakt verkfærasett) verið frestað til framtíðar, og nú er aðeins virk sannprófun í keyrslutíma (í keðju) studd.

Modularity

Færa einingar veita gagnaöflun og staðfæra mikilvægar aðgerðir á auðlindum. Umslagið sem einingin veitir, ásamt vörninni sem Move tegundarkerfið veitir, tryggir að ekki sé hægt að brjóta eiginleika sem settir eru á gerðir einingarinnar með kóða utan einingarinnar. Um er að ræða úthugsaða útdráttarhönnun sem þýðir að gögnum innan samnings er einungis hægt að breyta innan samningssviðs en ekki utan.

Farðu í Move - Libra blockchain forritunarmál Facebook

Færa yfirlit

Dæmið um viðskiptaskriftu sýnir að illgjarn eða kærulaus aðgerðir forritara utan eininga geta ekki teflt öryggi auðlinda einingarinnar í hættu. Næst munum við skoða dæmi um hvernig einingar, auðlindir og verklagsreglur eru notaðar til að forrita Libra blockchain.

Jafningjagreiðslur

Farðu í Move - Libra blockchain forritunarmál Facebook

Fjöldi mynta sem tilgreindur er í upphæð verður færður frá stöðu sendanda til viðtakanda.
Það eru nokkrir nýir hlutir hér (merktir með rauðu):

  • 0x0: heimilisfang reikningsins þar sem einingin er geymd
  • Gjaldmiðill: heiti eininga
  • Mynt: tegund auðlindar
  • Myntgildið sem aðferðin skilar er auðlindagildi af gerðinni 0x0.Currency.Coin
  • færa (): ekki er hægt að nota gildi aftur
  • afrita (): gildi er hægt að nota síðar

Þjálfa kóðann: í fyrsta skrefi kallar sendandi á málsmeðferð sem heitir draga_af_senanda úr einingu sem er geymd í 0x0. Gjaldmiðill. Í öðru skrefi flytur sendandinn fjármuni til viðtakandans með því að færa myntauðlindargildið inn í innborgunarferli einingarinnar 0x0. Gjaldmiðill.

Hér eru þrjú dæmi um villur í kóða sem verður hafnað með ávísunum:
Afritaðu fjármuni með því að breyta símtalinu færa (mynt) á afrit (mynt). Auðlindir er aðeins hægt að flytja. Reynt að afrita magn af auðlind (til dæmis með því að hringja afrit (mynt) í dæminu hér að ofan) mun leiða til villu við staðfestingu bækakóða.

Endurnýting fjármuna með því að tilgreina færa (mynt) tvisvar . Að bæta við línu 0x0.Currency.deposit (afrit (einhver_annar_greiðsluþegi), færa (mynt)) til dæmis mun ofangreint gera sendanda kleift að „eyða“ myntunum tvisvar - í fyrra skiptið með viðtakanda greiðslu og í seinna skiptið með einhver_annar_greiðsluþegi. Þetta er óæskileg hegðun sem er ekki möguleg með líkamlegri eign. Sem betur fer mun Move hafna þessu forriti.

Tap á fjármunum vegna synjunar færa (mynt). Ef þú færir ekki tilfangið (til dæmis með því að eyða línunni sem inniheldur færa (mynt)), mun bækikóða staðfestingarvilla birtast. Þetta verndar Move forritara fyrir slysni eða illgjarnri tapi fjármuna.

Gjaldeyriseining

Farðu í Move - Libra blockchain forritunarmál Facebook

Hver reikningur getur innihaldið 0 eða fleiri einingar (sýndar sem rétthyrningar) og eitt eða fleiri auðlindagildi (sýnt sem strokka). Til dæmis, reikningur á 0x0 inniheldur einingu 0x0. Gjaldmiðill og gildi auðlindategundarinnar 0x0.Currency.Coin. Reikningur á heimilisfangi 0x1 hefur tvær auðlindir og eina einingu; Reikningur á heimilisfangi 0x2 hefur tvær einingar og eitt auðlindagildi.

Nekotory augnablik:

  • Færsluhandritið er atómbundið - annað hvort er það keyrt alveg eða alls ekki.
  • Eining er langlífur kóða sem er aðgengilegur á heimsvísu.
  • Alheimsástandið er byggt upp sem kjötkássatöflu, þar sem lykillinn er heimilisfang reikningsins
  • Reikningar mega ekki innihalda fleiri en eitt auðlindagildi af tiltekinni gerð og ekki fleiri en eina einingu með tilteknu nafni (reikningur kl. 0x0 getur ekki innihaldið viðbótarúrræði 0x0.Currency.Coin eða önnur eining sem heitir Gjaldmiðill)
  • Heimilisfang uppgefnu einingarinnar er hluti af gerðinni (0x0.Currency.Coin и 0x1.Currency.Coin eru aðskildar tegundir sem ekki er hægt að nota til skiptis)
  • Forritarar geta geymt mörg tilvik af þessari tegund auðlinda á reikningi með því að skilgreina sérsniðna auðlind þeirra - (úrræði TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Þú getur vísað til auðlindar með nafni þess án árekstra, til dæmis geturðu vísað til tveggja auðlinda með því að nota TwoCoins.c1 и TwoCoins.c2.

Tilkynning um myntauðlind

Farðu í Move - Libra blockchain forritunarmál Facebook
Eining nefnd Gjaldmiðill og auðlindategund sem heitir Mynt

Nekotory augnablik:

  • Mynt er mannvirki með einu tegundarsviði u64 (64 bita óundirrituð heiltala)
  • Aðeins verklagsreglur Gjaldmiðill getur búið til eða eyðilagt gildi af gerðinni Mynt.
  • Aðrar einingar og forskriftir geta aðeins skrifað eða vísað í gildisreitinn með opinberum verklagsreglum sem einingin veitir.

Sala á innstæðu

Farðu í Move - Libra blockchain forritunarmál Facebook

Þessi aðferð tekur við auðlind Mynt sem inntak og sameinar það við auðlindina Myntgeymt á reikningi viðtakanda:

  1. Eyðileggja inntaksauðlindina Coin og skrá verðmæti þess.
  2. Að fá tengil á einstaka myntauðlind sem er geymd á reikningi viðtakanda.
  3. Breyting á gildi fjölda mynta með gildinu sem gefið er í færibreytunni þegar hringt er í aðferðina.

Nekotory augnablik:

  • Taktu upp, BorrowGlobal - innbyggðar verklagsreglur
  • Taka upp Þetta er eina leiðin til að eyða auðlind af gerðinni T. Aðferðin tekur auðlind sem inntak, eyðir henni og skilar gildinu sem tengist reitum auðlindarinnar.
  • BorrowGlobal tekur heimilisfang sem inntak og skilar tilvísun í einstakt tilvik af T sem gefið er út (í eigu) af því heimilisfangi
  • &mut Mynt þetta er tengill á auðlindina Mynt

Framkvæmd afturkalla_frá_senanda

Farðu í Move - Libra blockchain forritunarmál Facebook

Þessi aðferð:

  1. Fær hlekk á einstaka auðlind Mynt, tengdur við reikning sendanda
  2. Minnkar verðmæti auðlindar Mynt í gegnum tengilinn fyrir tilgreinda upphæð
  3. Býr til og skilar nýju tilfangi Mynt með uppfærðri stöðu.

Nekotory augnablik:

  • Innborgun getur stafað af hverjum sem er, en draga_af_senanda hefur aðeins aðgang að myntunum á hringingarreikningnum
  • GetTxnSenderAddress svipað msg.sender í Solidity
  • Hafna Nema svipað krefjast í Solidity. Ef þessi athugun mistekst er færslunni hætt og allar breytingar eru afturkallaðar.
  • Pakki það er líka innbyggt verklag sem býr til nýja auðlind af gerð T.
  • Sem og Taka upp, Pakki er aðeins hægt að kalla inni í einingunni þar sem tilfanginu er lýst T

Ályktun

Við skoðuðum helstu einkenni Move tungumálsins, bárum það saman við Ethereum og kynntumst einnig grunnsetningafræði skrifta. Að lokum mæli ég eindregið með að kíkja upprunalegur hvítur pappír. Það inniheldur mikið af smáatriðum varðandi hönnunarreglur forritunarmáls, auk margra gagnlegra tengla.

Heimild: www.habr.com

Bæta við athugasemd