Dive into Move – programovací jazyk Libra blockchain od Facebooku

Ďalej budeme podrobne zvažovať hlavné charakteristiky jazyka Move a aké sú jeho kľúčové rozdiely s iným, už populárnym jazykom pre inteligentné zmluvy - Solidity (na platforme Ethereum). Materiál je založený na štúdii dostupného online 26-stranového dokumentu.

Úvod

Move je spustiteľný jazyk bajtového kódu, ktorý sa používa na vykonávanie používateľských transakcií a inteligentných zmlúv. Všimnite si prosím dva body:

  1. Zatiaľ čo Move je jazyk bajtového kódu, ktorý je možné priamo vykonávať na virtuálnom stroji Move, Solidity (inteligentný zmluvný jazyk Ethereum) je jazyk vyššej úrovne, ktorý sa najskôr skompiluje do bajtkódu a až potom sa spustí na EVM (Ethereum Virtual Machine).
  2. Move je možné použiť nielen na implementáciu inteligentných zmlúv, ale aj na vlastné transakcie (o tom neskôr), zatiaľ čo Solidity je inteligentný jazyk iba na zmluvy.


Preklad vykonal projektový tím INDEX Protocol. Už sme prekladali veľký materiál popisujúci projekt Libra, teraz je čas pozrieť sa na jazyk Move trochu podrobnejšie. Preklad bol realizovaný v spolupráci s Habrauserom coolsiu

Kľúčovou vlastnosťou Move je schopnosť definovať vlastné typy zdrojov so sémantikou založenou na lineárnej logike: zdroj nemožno nikdy skopírovať ani implicitne odstrániť, iba presunúť. Funkčne je to podobné schopnostiam jazyka Rust. Hodnoty v Rust môžu byť priradené iba jednému názvu naraz. Priradením hodnoty k inému názvu bude nedostupná pod predchádzajúcim názvom.

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Nasledujúci útržok kódu napríklad spôsobí chybu: Použitie posunutej hodnoty „x“. Dôvodom je, že v Rusti nie je žiadny zber odpadu. Akonáhle sa premenné dostanú mimo rozsah, uvoľní sa aj pamäť, na ktorú odkazujú. Jednoducho povedané, „vlastník“ údajov môže byť iba jeden. V tomto prípade x je pôvodným majiteľom a potom y sa stáva novým vlastníkom. Prečítajte si viac o tomto správaní tu.

Reprezentácia digitálnych aktív v otvorených systémoch

Existujú dve vlastnosti fyzických aktív, ktoré je ťažké digitálne znázorniť:

  • rarita (Nedostatok, pôvodne nedostatok). Počet aktív (emisií) v systéme musí byť kontrolovaný. Duplikácia existujúcich aktív musí byť zakázaná a vytváranie nových je privilegovanou operáciou.
  • Kontrola prístupu... Účastník systému musí byť schopný chrániť majetok pomocou zásad riadenia prístupu.

Tieto dve charakteristiky, ktoré sú prirodzené pre fyzické aktíva, musia byť implementované pre digitálne objekty, ak ich chceme považovať za aktíva. Napríklad vzácny kov má prírodný nedostatok a máte k nemu prístup iba vy (napríklad ho držíte v rukách) a môžete ho predať alebo minúť.

Na ilustráciu toho, ako sme k týmto dvom vlastnostiam dospeli, začnime nasledujúcimi vetami:

Návrh č. 1: Najjednoduchšie pravidlo bez nedostatku a riadenia prístupu

Dive into Move – programovací jazyk Libra blockchain od Facebooku

  • G [K]: = n označuje aktualizáciu čísla prístupného pomocou klávesu К v globálnom stave blockchainu, s novým významom n.
  • transakcia lice Alice, 100⟩ znamená nastavenie zostatku na Alicinom účte na 100.

Vyššie uvedené riešenie má niekoľko závažných problémov:

  • Alice môže jednoduchým spôsobom odoslať neobmedzený počet mincí transakcia liceAlice, 100⟩.
  • Mince, ktoré Alice posiela Bobovi, sú nanič, pretože Bob si mohol rovnakou technikou poslať neobmedzený počet mincí.

Návrh č. 2: Zohľadnenie deficitu

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Teraz monitorujeme situáciu, aby bol počet mincí Ka bol prinajmenšom rovnaký n pred prevodovou transakciou. Aj keď sa tým problém s nedostatkom rieši, neexistujú žiadne informácie o tom, kto môže posielať Alicine mince (zatiaľ to môže urobiť ktokoľvek, hlavnou vecou nie je porušiť pravidlo obmedzenia sumy).

Návrh č. 3: Kombinácia nedostatku a riadenia prístupu

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Tento problém riešime mechanizmom digitálneho podpisu over_sig pred kontrolou zostatku, čo znamená, že Alice používa svoj súkromný kľúč na podpísanie transakcie a potvrdenie, že je vlastníkom jej coinov.

Blockchain programovacie jazyky

Existujúce jazyky blockchainu čelia nasledujúcim problémom (všetky boli vyriešené v programe Move (poznámka: bohužiaľ, autor článku apeluje na Ethereum iba vo svojich porovnaniach, preto stojí za to ich brať iba v tomto kontexte. V EOS je napríklad vyriešená aj väčšina z nasledujúcich.)):

Nepriame zastúpenie majetku. Majetok je zakódovaný pomocou celého čísla, ale celé číslo nie je to isté ako majetok. V skutočnosti neexistuje žiadny typ alebo hodnota predstavujúca bitcoin/éter/<akúkoľvek mincu>! Vďaka tomu je písanie programov, ktoré využívajú aktíva, zložité a náchylné na chyby. Vzory, ako je odovzdávanie aktív do/z procedúr alebo ukladanie aktív v štruktúrach, vyžadujú špeciálnu podporu zo strany jazyka.

Deficit nie je rozšíriteľný... Jazyk predstavuje iba jedno vzácne aktívum. Prostriedky ochrany pred nedostatkom sú navyše pevne zapojené priamo do sémantiky samotného jazyka. Ak chce vývojár vytvoriť vlastné dielo, musí starostlivo ovládať všetky aspekty zdroja sám. To sú presne problémy inteligentných zmlúv Ethereum.

Používatelia vydávajú svoje aktíva, tokeny ERC-20, pomocou celých čísel určujú hodnotu aj celkovú ponuku. Kedykoľvek sa vytvoria nové tokeny, kód inteligentnej zmluvy musí nezávisle overiť súlad s emisnými pravidlami. Nepriama prezentácia majetku navyše v niektorých prípadoch vedie k závažným chybám - duplikácii, zdvojnásobeniu výdavkov alebo dokonca k úplnej strate majetku.

Nedostatok flexibilného riadenia prístupu... Jedinou dnes používanou politikou riadenia prístupu je schéma podpisu využívajúca asymetrickú kryptografiu. Rovnako ako ochrana pred nedostatkom sú politiky riadenia prístupu hlboko zakorenené v sémantike jazyka. Ale ako rozšíriť jazyk, aby programátori mohli definovať svoje vlastné politiky riadenia prístupu, je často veľmi ošemetná úloha.

Platí to aj pre Ethereum, kde smart kontrakty nemajú natívnu kryptografickú podporu pre riadenie prístupu. Vývojári musia manuálne nastaviť riadenie prístupu, napríklad pomocou modifikátora onlyOwner.

Aj keď som veľkým fanúšikom Etherea, verím, že vlastnosti aktív by mali byť natívne podporované jazykom z bezpečnostných dôvodov. Prevod Etheru na inteligentnú zmluvu zahŕňa najmä dynamické odosielanie, ktoré zaviedlo novú triedu chýb známych ako zraniteľnosti pri opakovanom vstupe. Dynamické odosielanie tu znamená, že logika vykonávania kódu bude určená skôr v čase behu (dynamický) ako v čase kompilácie (statický).

Takže v Solidity, keď zmluva A volá funkciu v zmluve B, zmluva B môže spustiť kód, ktorý vývojár zmluvy A nezamýšľal, čo môže mať za následok opätovný vstup (zmluva A náhodne funguje ako zmluva B na výber peňazí pred skutočným odpočítaním zostatkov na účte).

Move Language Design Fundamentals

Zdroje prvého poriadku

Na vysokej úrovni je interakcia medzi modulmi / prostriedkami / postupmi v jazyku Move veľmi podobná vzťahu medzi triedami / objektmi a metódami v jazykoch OOP.
Moduly Move sú podobné inteligentným zmluvám v iných blockchainoch. Modul deklaruje typy a postupy zdrojov, ktoré definujú pravidlá pre vytváranie, ničenie a aktualizáciu deklarovaných zdrojov. Ale to všetko sú len konvencie („žargón”) V pohybe. Tento bod ilustrujeme o niečo neskôr.

flexibilita

Move pridáva Váhu flexibilitu prostredníctvom skriptovania. Každá transakcia v Libre obsahuje skript, ktorý je v podstate základnou procedúrou transakcie. Skript môže vykonať buď jednu zadanú akciu, napríklad platby určenému zoznamu príjemcov, alebo opätovne použiť iné zdroje – napríklad volaním procedúry, v ktorej je špecifikovaná všeobecná logika. To je dôvod, prečo transakčné skripty Move ponúkajú väčšiu flexibilitu. Skript môže používať jednorazové aj opakujúce sa správanie, zatiaľ čo Ethereum môže vykonávať iba opakovateľné skripty (volaním jednej metódy na metóde inteligentnej zmluvy). Dôvod, prečo sa nazýva „opakovane použiteľný“, je ten, že funkcie inteligentnej zmluvy možno vykonať viackrát. (Poznámka: Pointa je tu veľmi jemná. Na jednej strane v Bitcoine existujú aj transakčné skripty vo forme pseudobytekódu. Na druhej strane, ako tomu dobre rozumiem, Move rozširuje tento jazyk v podstate na úroveň plnohodnotného smart contract language).

zabezpečenia

Spustiteľný formát Move je bytecode, čo je na jednej strane jazyk vyššej úrovne ako jazyk symbolických inštrukcií, ale nižšia úroveň ako zdrojový kód. Bytový kód sa kontroluje za behu (on-chain) na zdroje, typy a bezpečnosť pamäte pomocou overovača bajtového kódu a potom ho vykoná interpret. Tento prístup umožňuje Move poskytnúť bezpečnosť zdrojového kódu, ale bez procesu kompilácie a potreby pridania kompilátora do systému. Urobiť z Move jazyk bajtového kódu je naozaj dobré riešenie. Netreba ho kompilovať zo zdrojového kódu, ako je to v prípade Solidity, a netreba sa obávať prípadných porúch či útokov na infraštruktúru kompilátora.

overiteľnosť

Naším cieľom je vykonávať kontroly čo najjednoduchšie, pretože to všetko sa vykonáva v reťazci (poznámka: online, počas vykonávania každej transakcie, takže akékoľvek oneskorenie vedie k spomaleniu celej siete), na začiatku je však jazykový dizajn pripravený na použitie nástrojov statickej verifikácie mimo reťazca. Aj keď je to vhodnejšie, nateraz bol vývoj verifikačných nástrojov (ako samostatného súboru nástrojov) odložený do budúcnosti a teraz je podporované iba dynamické overovanie za behu (on-chain).

Modularita

Presunúť moduly poskytujú abstrakciu údajov a lokalizujú dôležité operácie so zdrojmi. Zapuzdrenie poskytnuté modulom v kombinácii s ochranou poskytovanou systémom typu Move zaisťuje, že vlastnosti nastavené na typoch modulu nemožno narušiť kódom mimo modulu. Toto je pomerne dobre premyslený návrh abstrakcie, čo znamená, že údaje vo vnútri zmluvy sa môžu meniť iba v rámci zmluvy, ale nie mimo nej.

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Prehľad pohybu

Príklad transakčného skriptu ukazuje, že škodlivé alebo nedbalé akcie programátora mimo modulu nemôžu ohroziť bezpečnosť zdrojov modulu. Ďalej sa pozrieme na príklady toho, ako sa moduly, zdroje a postupy používajú na programovanie blockchainu Libra.

Platby typu peer-to-peer

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Počet mincí uvedený v sume bude prevedený zo zostatku odosielateľa na príjemcu.
Je tu niekoľko nových vecí (zvýraznené červenou farbou):

  • 0x0: adresa účtu, kde je modul uložený
  • mena: názov modulu
  • Mince: typ zdroja
  • Hodnota mince vrátená postupom je hodnotou zdroja typu 0x0.Currency.Coin
  • pohnúť sa (): hodnotu nemožno znova použiť
  • kopírovať (): hodnota môže byť použitá neskôr

Analyzujte kód: v prvom kroku odosielateľ zavolá procedúru s názvom stiahnuť_od_ odosielateľa z modulu uloženého v priečinku 0x0. Mena. V druhom kroku odosielateľ prevedie prostriedky príjemcovi presunutím hodnoty zdroja mincí do procedúry vkladu modulu 0x0. Mena.

Tu sú tri príklady chýb v kóde, ktoré budú zamietnuté kontrolami:
Duplikujte finančné prostriedky zmenou výzvy ťah (mince) na kópia (mince). Zdroje je možné iba presúvať. Pokus o duplikovanie množstva zdroja (napríklad volaním kópia (mince) vo vyššie uvedenom príklade) bude mať za následok chybu počas overovania bajtového kódu.

Opätovné použitie finančných prostriedkov špecifikovaním ťah (mince) dvakrát . Pridanie riadku 0x0.Currency.deposit (kopírovať (nejaký_ostatný_platiteľ), presunúť (minca)) napríklad vyššie uvedené umožní odosielateľovi „minúť“ mince dvakrát – prvýkrát s príjemcom platby a druhýkrát s some_other_payee. Toto je nežiaduce správanie, ktoré nie je možné s fyzickým majetkom. Našťastie Move tento program odmietne.

Strata finančných prostriedkov v dôsledku odmietnutia ťah (mince). Ak zdroj nepresuniete (napríklad odstránením riadku obsahujúceho ťah (mince)), bude vyvolaná chyba overenia bajtového kódu. To chráni programátorov Move pred náhodnou alebo úmyselnou stratou finančných prostriedkov.

Menový modul

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Každý účet môže obsahovať 0 alebo viac modulov (zobrazených ako obdĺžniky) a jednu alebo viac hodnôt zdrojov (zobrazených ako valce). Napríklad účet na 0x0 obsahuje modul 0x0. Mena a hodnotu typu zdroja 0x0.Currency.Coin. Účet na adrese 0x1 má dva zdroje a jeden modul; Účet na adrese 0x2 má dva moduly a jednu hodnotu zdroja.

Nekotorické momenty:

  • Transakčný skript je atomický – buď sa vykoná úplne, alebo sa nevykoná vôbec.
  • Modul je kus kódu s dlhou životnosťou, ktorý je globálne dostupný.
  • Globálny stav je štruktúrovaný ako hašovacia tabuľka, kde kľúčom je adresa účtu
  • Účty môžu obsahovať najviac jednu hodnotu zdroja daného typu a najviac jeden modul s daným názvom (účet na 0x0 nemôže obsahovať dodatočný zdroj 0x0.Currency.Coin alebo iný modul s názvom mena)
  • Adresa deklarovaného modulu je súčasťou typu (0x0.Currency.Coin и 0x1.Currency.Coin sú samostatné typy, ktoré sa nedajú zameniť)
  • Programátori môžu uložiť viacero inštancií tohto typu zdroja v účte definovaním vlastného zdroja - (zdroj TwoCoins {c1: 0x0.Currency.Coin, C2: 0x0.Currency.Coin})
  • Môžete odkazovať na zdroj jeho názvom bez konfliktov, napríklad môžete odkazovať na dva zdroje pomocou TwoCoins.c1 и TwoCoins.c2.

Oznámenie o zdroji mincí

Dive into Move – programovací jazyk Libra blockchain od Facebooku
Modul pomenovaný mena a typ zdroja s názvom Mince

Nekotorické momenty:

  • Mince je štruktúra s jedným poľom typu u64 (64-bitové celé číslo bez znamienka)
  • Len procedúry modulu mena môže vytvárať alebo ničiť hodnoty typu Mince.
  • Iné moduly a skripty môžu písať alebo odkazovať na pole hodnoty iba prostredníctvom verejných procedúr poskytovaných modulom.

Predaj zálohy

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Tento postup akceptuje zdroj Mince ako vstup a kombinuje ho so zdrojom Minceuložené na účte príjemcu:

  1. Zničenie vstupného zdroja Coin a zaznamenanie jeho hodnoty.
  2. Prijatie odkazu na jedinečný zdroj mincí uložený na účte príjemcu.
  3. Zmena hodnoty počtu Coinov o hodnotu odovzdanú v parametri pri volaní procedúry.

Nekotorické momenty:

  • Rozbaľte, požičajte si Global - vstavané postupy
  • Rozbaľte Toto je jediný spôsob, ako odstrániť zdroj typu T. Procedúra vezme zdroj ako vstup, zničí ho a vráti hodnotu priradenú k poliam zdroja.
  • BorrowGlobal berie adresu ako vstup a vracia odkaz na jedinečnú inštanciu T publikovanú (vlastnenú) touto adresou
  • &mut Coin toto je odkaz na zdroj Mince

Implementácia remove_from_sender

Dive into Move – programovací jazyk Libra blockchain od Facebooku

Tento postup:

  1. Získa odkaz na jedinečný zdroj Mince, prepojený s účtom odosielateľa
  2. Znižuje hodnotu zdroja Mince cez odkaz za uvedenú sumu
  3. Vytvorí a vráti nový zdroj Mince s aktualizovaným zostatkom.

Nekotorické momenty:

  • Záloha môže spôsobiť ktokoľvek, ale stiahnuť_od_ odosielateľa má prístup len k minciam volajúceho účtu
  • GetTxnSenderAddress podobný msg.sender v Solidite
  • OdmietnuťPokiaľ podobný vyžadovať v Solidite. Ak táto kontrola zlyhá, transakcia sa zastaví a všetky zmeny sa vrátia späť.
  • Balenie je to tiež vstavaná procedúra, ktorá vytvára nový zdroj typu T.
  • Rovnako ako aj Rozbaľte, Balenie možno volať iba v module, kde je popísaný zdroj T

Záver

Preskúmali sme hlavné charakteristiky jazyka Move, porovnali sme ho s Ethereom a oboznámili sme sa aj so základnou syntaxou skriptov. Nakoniec vrelo odporúčam pozrieť sa originálny biely papier. Obsahuje veľa podrobností o princípoch návrhu programovacieho jazyka, ako aj mnoho užitočných odkazov.

Zdroj: hab.com

Pridať komentár