Uronite u Move, Facebookov Libra Blockchain programski jezik

Zatim ćemo detaljno razmotriti glavne karakteristike jezika Move i koje su njegove ključne razlike s drugim, već popularnim jezikom za pametne ugovore - Solidity (na platformi Ethereum). Materijal se temelji na proučavanju dostupnog internetskog bijelog papira na 26 stranica.

Uvod

Move je izvršni jezik bajtkoda koji se koristi za izvršavanje korisničkih transakcija i pametnih ugovora. Obratite pažnju na dvije tačke:

  1. Dok je Move jezik bajt koda koji se može izravno izvršiti na virtualnoj mašini Move, Solidity (Ethereum-ov jezik pametnog ugovora) je jezik višeg nivoa koji se prvo kompajlira u bajt-kod prije nego što se izvrši na EVM-u (Ethereum Virtual Machine).
  2. Move se može koristiti ne samo za implementaciju pametnih ugovora, već i za prilagođene transakcije (više o tome kasnije), dok je Solidity jezik samo za pametne ugovore.


Prevod je uradio projektni tim INDEX Protocol. Prethodno smo prevodili odličan materijal koji opisuje projekat Libra, sada je vrijeme da pobliže pogledamo jezik Move. Prevod je rađen zajedno sa habrauzerom coolsiu

Ključna karakteristika Move-a je mogućnost definiranja prilagođenih tipova resursa sa semantikom zasnovanom na linearnoj logici: resurs se nikada ne može kopirati ili implicitno izbrisati, samo premjestiti. Funkcionalno, ovo je slično karakteristikama Rust jezika. Vrijednosti u Rustu mogu se dodijeliti samo jednom imenu. Dodjeljivanje vrijednosti drugom imenu čini ga nedostupnim pod prethodnim imenom.

Uronite u Move, Facebookov Libra Blockchain programski jezik

Na primjer, sljedeći isječak koda će izazvati grešku: Upotreba premještene vrijednosti 'x'. To je zato što u Rustu nema sakupljanja smeća. Kada varijable izlaze iz opsega, oslobađa se i memorija na koju se pozivaju. Jednostavno rečeno, može postojati samo jedan "vlasnik" podataka. U ovom primjeru x je prvobitni vlasnik, a zatim y postaje novi vlasnik. Više o ovom ponašanju pročitajte ovdje..

Predstavljanje digitalne imovine u otvorenim sistemima

Postoje dva svojstva fizičkih sredstava koja je teško digitalno predstaviti:

  • Retkost (Oskudica, izvorno oskudica). Broj imovine (emisija) u sistemu mora se kontrolirati. Umnožavanje postojeće imovine mora biti zabranjeno, a stvaranje nove je privilegirana operacija.
  • Kontrola pristupa... Učesnik u sistemu mora biti u stanju zaštititi imovinu koristeći politike kontrole pristupa.

Ove dvije karakteristike, koje su prirodne za fizička sredstva, moraju se primijeniti na digitalne objekte ako ih želimo smatrati sredstvima. Na primjer, rijetki metal - ima prirodnu oskudicu, a samo vi njemu imate pristup (držite ga, na primjer, u rukama) i možete ga prodati ili potrošiti.

Da bismo ilustrirali kako smo došli do ove dvije nekretnine, počnimo sa sljedećim rečenicama:

Prijedlog # 1: Najjednostavnije pravilo bez oskudice i kontrole pristupa

Uronite u Move, Facebookov Libra Blockchain programski jezik

  • G [K]: = n označava ažuriranje broja dostupnog ključem К u globalnom stanju blockchaina, sa novim značenjem n.
  • transakcija ⟨Alice, 100⟩ znači postaviti stanje Alisinog računa na 100.

Gore navedeno rješenje ima nekoliko velikih problema:

  • Alice može primiti neograničen broj kovanica jednostavnim slanjem transakcija liceAlice, 100⟩.
  • Novčići koje Alice šalje Bobu beskorisni su jer bi Bob mogao poslati neograničen broj kovanica koristeći istu tehniku.

Prijedlog # 2: Uzimanje u obzir deficita

Uronite u Move, Facebookov Libra Blockchain programski jezik

Sada pratimo situaciju tako da broj novčića Ka bila barem jednaka n prije transakcije prijenosa. Međutim, iako ovo rješava problem oskudice, nema podataka o tome tko može poslati Aliceine novčiće (za sada to može učiniti bilo tko, glavna stvar je ne prekršiti pravilo ograničavanja iznosa).

Prijedlog # 3: Kombiniranje oskudice i kontrole pristupa

Uronite u Move, Facebookov Libra Blockchain programski jezik

Ovaj problem rješavamo mehanizmom digitalnog potpisa verify_sig prije provjere stanja, što znači da Alice koristi svoj privatni ključ za potpisivanje transakcije i potvrdu da je vlasnik svojih kovanica.

Blockchain programski jezici

Postojeći jezici blockchaina suočavaju se sa sljedećim problemima (svi su riješeni u Moveu (napomena: nažalost, autor članka se u svojim poređenjima poziva samo na Ethereum, pa ih vrijedi uzeti samo u ovom kontekstu. Na primjer, većina sljedećeg je također riješena u EOS -u.)):

Posredno predstavljanje imovine. Imovina je kodirana pomoću cijelog broja, ali cjelobrojna vrijednost nije isto što i sredstvo. Zapravo, ne postoji vrsta ili vrijednost koja predstavlja bitcoin / eter / <Bilo koji novčić>! To otežava i čini podložnim greškama pisanje programa koji koriste sredstva. Obrasci kao što su prosleđivanje sredstava u/iz procedura ili skladištenje sredstava u strukturama zahtevaju posebnu podršku jezika.

Deficit se ne može proširiti... Jezik predstavlja samo jedno oskudno dobro. Osim toga, lijekovi protiv oskudice spojeni su direktno u semantiku samog jezika. Programer, ako želi stvoriti prilagođeno sredstvo, mora sam pažljivo kontrolirati sve aspekte resursa. Upravo su to problemi Ethereum pametnih ugovora.

Korisnici izdaju svoju imovinu, ERC-20 žetone, koristeći cijele brojeve za određivanje vrijednosti i ukupne ponude. Kad god se stvaraju novi žetoni, šifra pametnog ugovora mora neovisno provjeriti usklađenost s pravilima o emisiji. Osim toga, neizravno predstavljanje imovine dovodi do, u nekim slučajevima, ozbiljnih grešaka - dupliranja, dvostruke potrošnje ili čak potpunog gubitka imovine.

Nedostatak fleksibilne kontrole pristupa... Jedina politika kontrole pristupa koja se danas koristi je shema potpisa koja koristi asimetričnu kriptografiju. Kao i zaštita oskudice, politike kontrole pristupa duboko su ugrađene u semantiku jezika. No, kako proširiti jezik kako bi programeri mogli definirati vlastite politike kontrole pristupa često je vrlo škakljiv zadatak.

To vrijedi i za Ethereum, gdje pametni ugovori nemaju izvornu podršku za kriptografiju za kontrolu pristupa. Programeri moraju ručno napisati kontrolu pristupa, na primjer, koristeći modifikator onlyOwner.

Iako sam veliki obožavatelj Ethereuma, vjerujem da bi svojstva imovine trebala biti izvorno podržana jezikom iz sigurnosnih razloga. Konkretno, prenošenje Ethera u pametni ugovor omogućava dinamičko slanje, što je uvelo novu klasu grešaka poznatih kao ranjivosti pri ponovnom ulasku. Dinamičko otpremanje ovdje znači da će logika izvršavanja koda biti određena u vrijeme izvođenja (dinamičko), a ne u vrijeme kompajliranja (statičko).

Dakle, u Solidity-u, kada ugovor A poziva funkciju ugovora B, ugovor B može pokrenuti kod koji nije namijenio programer ugovora A, što može dovesti do ranjivosti pri ponovnom ulasku (ugovor A slučajno djeluje kao ugovor B za povlačenje novca prije nego što se stanje stvarno skine sa računa).

Premjestite osnove dizajna jezika

Resursi prvog reda

Na visokom nivou, interakcija između modula / resursa / procedura u jeziku Move vrlo je slična odnosu između klasa / objekata i metoda u OOP jezicima.
Move moduli slični su pametnim ugovorima u drugim blockchain -ovima. Modul deklarira vrste resursa i procedure koje definiraju pravila za kreiranje, uništavanje i ažuriranje deklariranih resursa. Ali sve su to samo konvencije (“žargon”) U pokretu. Ovo ćemo ilustrirati nešto kasnije.

Fleksibilnost

Move dodaje fleksibilnost Vagi kroz skriptiranje. Svaka transakcija u Libri uključuje skriptu, koja je zapravo glavna procedura transakcije. Skripta može ili izvršiti jednu određenu radnju, na primjer, plaćanje određenoj listi primatelja, ili ponovo koristiti druge resurse, na primjer, pozivanjem procedure koja definira zajedničku logiku. Zbog toga skripte za transakcije Move nude veliku fleksibilnost. Skripta može koristiti i jednokratna i ponavljajuća ponašanja, dok Ethereum može izvršavati samo ponavljajuće skripte (pozivajući metodu jednog pametnog ugovora). Razlog zašto se naziva "ponovljenim" je taj što se funkcije pametnog ugovora mogu izvršiti više puta. (Bilješka: ovde je trenutak veoma suptilan. S jedne strane, u Bitcoin-u postoje transakcijske skripte u obliku pseudo-bajtkoda. S druge strane, kako ja razumijem, Move proširuje ovaj jezik, zapravo, na nivo punopravnog jezika pametnog ugovora).

Sigurnost

Izvršni format Move je bajtkod, koji je, s jedne strane, jezik višeg nivoa od asemblera, ali nižeg nivoa od izvornog koda. Bajtkod se provjerava u vremenu izvođenja (na lancu) za resurse, tipove i sigurnost memorije pomoću verifikatora bajtkoda, a zatim ga izvodi interpreter. Ovaj pristup omogućava Move-u da obezbijedi sigurnost izvornog koda, ali bez procesa kompilacije i potrebe za dodavanjem kompajlera u sistem. Učiniti Move jezikom bajtkoda je zaista dobra ideja. Ne mora se kompajlirati iz izvora, kao u slučaju Solidity-a, nema potrebe da brinete o mogućim kvarovima ili napadima na infrastrukturu kompajlera.

proverljivost

Cilj nam je da provjere učinimo što jednostavnijim, jer sve ide u lancu (napomena: online, tokom izvršavanja svake transakcije, pa svako kašnjenje dovodi do usporavanja cijele mreže), ali u početku je dizajn jezika spreman za korištenje izvan lanca statičkih alata za verifikaciju. Iako je ovo poželjnije, razvoj alata za verifikaciju (kao zasebnog kompleta alata) je odložen za budućnost, a trenutno je podržana samo dinamička verifikacija u vremenu izvođenja (on-chain).

Modularnost

Moduli za premještanje pružaju apstrakciju podataka i lokaliziraju kritične operacije na resursima. Enkapsulacija koju pruža modul, u kombinaciji sa zaštitom koju pruža sistem Move type, osigurava da svojstva postavljena na tipovima modula ne mogu biti narušena kodom izvan modula. Ovo je dobro osmišljen dizajn apstrakcije, što znači da se podaci unutar ugovora mogu mijenjati samo unutar opsega ugovora, ali ne i eksterno.

Uronite u Move, Facebookov Libra Blockchain programski jezik

Premjesti pregled

Primjer skripte transakcije pokazuje da zlonamjerne ili neoprezne radnje programera izvan modula ne mogu ugroziti sigurnost resursa modula. Zatim ćemo pogledati primjere kako se moduli, resursi i procedure koriste za programiranje Libra blockchaina.

Peer-to-Peer plaćanja

Uronite u Move, Facebookov Libra Blockchain programski jezik

Broj kovanica naveden u iznosu će biti prebačen sa bilansa pošiljaoca na primaoca.
Ovdje ima nekoliko novih tačaka (naglašenih crvenim natpisima):

  • 0x0: adresa računa na kojem je modul pohranjen
  • valuta: naziv modula
  • Monet: vrsta resursa
  • Vrijednost novčića vraćena procedurom je vrijednost resursa tipa 0x0.Currency.Coin
  • premjestiti (): vrijednost se ne može ponovo koristiti
  • kopija (): vrijednost se može koristiti kasnije

Raščlanite kôd: u prvom koraku pošiljatelj poziva proceduru pod nazivom remove_from_sender iz modula pohranjenog u 0x0.Valuta. U drugom koraku, pošiljalac prenosi sredstva primaocu premještanjem vrijednosti resursa novčića u proceduru depozita modula 0x0.Valuta.

Evo tri primjera grešaka u kodu koji će biti odbijeni provjerama:
Duplirajte sredstva promjenom poziva potez (novčić) na kopija (novčić). Resursi se mogu samo premještati. Pokušaj dupliranja količine resursa (na primjer, pozivom kopija (novčić) u gornjem primjeru) će rezultirati greškom tokom provjere bajt koda.

Ponovna upotreba sredstava navođenjem potez (novčić) dva puta . Dodavanje linije 0x0.Currency.deposit(copy(some_other_payee), move(coin)) gornji primjer će omogućiti pošiljaocu da dva puta "potroši" kovanice - prvi put sa primaocem uplate, a drugi put sa neki_drugi_primatelj plaćanja. Ovo je nepoželjno ponašanje koje nije moguće sa fizičkom imovinom. Srećom, Move će odbiti ovaj program.

Gubitak sredstava zbog uskraćivanja potez (novčić). Ako ne premjestite resurs (na primjer, uklanjanjem reda koji sadrži potez (novčić)), pojavit će se greška verifikacije bajtkoda. Ovo štiti programere Move od slučajnog ili zlonamjernog gubitka sredstava.

Valutni modul

Uronite u Move, Facebookov Libra Blockchain programski jezik

Svaki račun može sadržavati 0 ili više modula (prikazano kao okviri) i jednu ili više vrijednosti resursa (prikazano kao cilindri). Na primjer, račun na 0x0 sadrži modul 0x0.Valuta i vrijednost resursa tipa 0x0.Currency.Coin. Račun na adresi 0x1 ima dva resursa i jedan modul; Račun na adresi 0x2 ima dva modula i jednu vrijednost resursa.

Nekotory momenti:

  • Transakciona skripta je atomska - ili je u potpunosti izvršena, ili nije uopšte.
  • Modul je dugotrajan dio koda koji je globalno dostupan.
  • Globalno stanje je strukturirano kao hash tabela, gdje je adresa računa ključ
  • Računi ne mogu sadržavati više od jedne vrijednosti resursa date vrste i najviše jednog modula sa datim imenom (nalog na 0x0 ne može sadržavati dodatni resurs 0x0.Currency.Coin ili neki drugi modul pod nazivom valuta)
  • Adresa deklariranog modula je dio tipa (0x0.Currency.Coin и 0x1.Currency.Coin su odvojeni tipovi koji se ne mogu koristiti naizmenično)
  • Programeri mogu pohraniti više instanci datog tipa resursa na nalog definiranjem svog prilagođenog resursa - (resurs TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Možete se pozivati ​​na resurs po njegovom imenu bez sukoba, na primjer možete se pozivati ​​na dva resursa koristeći TwoCoins.c1 и TwoCoins.c2.

Deklaracija o resursima kovanica

Uronite u Move, Facebookov Libra Blockchain programski jezik
Imenovani modul valuta i tip resursa pod nazivom Monet

Nekotory momenti:

  • Monet je struktura sa jednim poljem tipa u64 (64-bitni cijeli broj bez predznaka)
  • Samo procedure modula valuta može kreirati ili uništiti vrijednosti tipa Monet.
  • Drugi moduli i skripte mogu samo pisati ili upućivati ​​na polje vrijednosti kroz javne procedure koje modul pruža.

Implementacija depozita

Uronite u Move, Facebookov Libra Blockchain programski jezik

Ova procedura prihvata resurs Monet kao ulaz i spaja ga sa resursom Monetpohranjeni na računu korisnika:

  1. Uništavanje ulaznog resursa Coin i upisivanje njegove vrijednosti.
  2. Dobijanje veze do jedinstvenog Coin resursa pohranjenog na računu primatelja.
  3. Mijenjanje vrijednosti broja kovanica za vrijednost proslijeđenu u parametru prilikom pozivanja procedure.

Nekotory momenti:

  • Raspakujte, BorrowGlobal - ugrađene procedure
  • Raspakujte ovo je jedini način za brisanje resursa tipa T. Procedura uzima resurs kao ulaz, uništava ga i vraća vrijednost pridruženu poljima resursa.
  • BorrowGlobal uzima adresu kao ulaz i vraća referencu na jedinstvenu instancu T koji je objavljen (u vlasništvu) te adrese
  • &mut Coin ovo je veza do izvora Monet

Implementacija withdraw_from_sender

Uronite u Move, Facebookov Libra Blockchain programski jezik

Ova procedura:

  1. Dobiva vezu do jedinstvenog resursa Monet, povezan sa nalogom pošiljaoca
  2. Smanjuje vrijednost resursa Monet po referenci za navedeni iznos
  3. Kreira i vraća novi resurs Monet sa ažuriranim stanjem.

Nekotory momenti:

  • depozit može pozvati bilo ko, ali remove_from_sender ima pristup samo kovanicama računa za pozivanje
  • GetTxnSenderAddress slicno msg.sender u Solidity
  • RejectUnless slicno zahtijevati u Solidity. Ako ova provjera ne uspije, izvršenje transakcije se zaustavlja i sve promjene se poništavaju.
  • pack to je također ugrađena procedura koja kreira novi resurs tipa T.
  • Kao i Raspakujte, pack može se pozvati samo unutar modula gdje je resurs deklariran T

zaključak

Analizirali smo glavne karakteristike jezika Move, uporedili ga sa Ethereumom, a takođe smo se upoznali sa osnovnom sintaksom skripti. Na kraju, toplo preporučujem pregledavanje originalni bijeli papir. Sadrži mnogo detalja o principima dizajna programskog jezika, kao i mnoge korisne veze.

izvor: www.habr.com

Dodajte komentar