Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

In seguitu, avemu da guardà in detail à e caratteristiche principali di a lingua Move è quale sò e so differenzi chjave cù un altru, lingua digià populari per i cuntratti intelligenti - Solidità (nantu à a piattaforma Ethereum). U materiale hè basatu annantu à un studiu di un whitepaper di 26 pagine dispunibule in linea.

Introduzione

Move hè una lingua bytecode eseguibile chì hè aduprata per eseguisce transazzioni di l'utilizatori è cuntratti intelligenti. Per piacè nutate dui punti:

  1. Mentre Move hè una lingua bytecode chì pò esse direttamente eseguita nantu à a Move Virtual Machine, Solidità (a lingua di cuntrattu intelligente in Ethereum) hè una lingua di livellu più altu chì hè prima compilata in bytecode prima di l'esekzione in l'EVM (Ethereum Virtual Machine).
  2. Move pò esse usatu micca solu per implementà i cuntratti intelligenti, ma ancu per e transazzione di l'utilizatori (più nantu à questu più tardi), mentri Solidità hè una lingua intelligente solu di cuntrattu.


A traduzzione hè stata realizata da u gruppu di prughjettu di u Protocolu INDEX. Avemu digià traduttu grande materiale chì descrive u prughjettu Libra, Avà hè u tempu di guardà a lingua Move in un pocu più dettu. A traduzzione hè stata realizata cumuna cù Habrauser coolsiu

Una funzione chjave di Move hè a capacità di definisce tipi di risorse persunalizati cù semantica basata nantu à a logica lineale: una risorsa ùn pò mai esse copiata o sguassata implicitamente, solu spustata. Funzionalmente, questu hè simile à e capacità di a lingua Rust. I valori in Rust ponu esse attribuiti solu à un nome à tempu. Assignà un valore à un nome diversu rende micca dispunibile sottu u nome precedente.

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Per esempiu, u snippet di codice seguente hà da esse un errore: L'usu di u valore mossu 'x'. Questu hè chì Rust ùn hà micca cullizzioni di basura. Quandu e variàbili sò fora di u scopu, a memoria chì si riferiscenu hè ancu liberata. Simply put, ùn pò esse solu un "proprietari" di i dati. In questu esempiu x hè u pruprietariu originale è dopu y diventa u novu pruprietariu. Leghjite più nantu à stu cumpurtamentu quì.

Rappresentà l'assi digitale in sistemi aperti

Ci hè duie pruprietà di l'assi fisichi chì sò difficiuli di rapprisintà digitale:

  • Rarità (Scarcity, in l'uriginale - scarsità). U numaru di assi (emissione) in u sistema deve esse cuntrullatu. A duplicazione di l'assi esistenti deve esse pruibita, è a creazione di novi hè una operazione privilegiata.
  • Cuntrollu d'accessu. U participante di u sistema deve esse capace di prutezzione di l'assi utilizendu pulitiche di cuntrollu di accessu.

Queste duie caratteristiche, chì sò naturali per l'assi fisichi, devenu esse implementate ancu per l'uggetti digitali si vulemu cunsiderà cum'è attivu. Per esempiu, un metallu raru hà una scarsità naturali, è solu avete accessu à questu (tinghjendu in e vostre mani, per esempiu) è pudete vende o spende.

Per illustrà cumu avemu ghjuntu à sti dui pruprietà, cuminciamu cù e seguenti frasi:

Proposizione #1: A regula più simplice senza scarsità è cuntrollu di accessu

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

  • G[K]:=n denota l'aghjurnamentu di un numeru accessibile per chjave К in u statu glubale di u blockchain, cù un novu significatu n.
  • transazzione ⟨Alice, 100⟩ significa mette u saldo di u contu di Alice à 100.

A suluzione di sopra hà parechji prublemi seri:

  • Alice pò riceve un numeru illimitatu di muniti solu per mandà transazzione ⟨Alice, 100⟩.
  • E muniti chì Alice manda à Bob ùn valenu micca valore, postu chì Bob puderia mandà un numeru illimitatu di muniti cù a stessa tecnica.

Suggerimentu n ° 2 : Pigliate in contu u deficit

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Avà seguitemu a situazione per chì u numeru di muniti Ka era almenu uguali n prima di a transazzione di trasferimentu. In ogni casu, mentre chì questu risolve u prublema di scarsità, ùn ci hè micca infurmazione nantu à quale pò mandà muniti Alice (per avà, qualcunu pò fà questu, sempre chì ùn rompe micca a regula di limitu di quantità).

Pruposta #3: Unisce a scarsità è u cuntrollu di l'accessu

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Risolvemu stu prublema usendu un mecanismu di firma digitale verifica_sig prima di verificà l'equilibriu, chì significa chì Alice usa a so chjave privata per firmà a transazzione è cunfirmà ch'ella hè u pruprietariu di e so muniti.

Linguaggi di prugrammazione Blockchain

Lingue esistenti blockchain face i seguenti prublemi (tutti sò stati risolti in Move). Sfurtunatamente, l'autore di l'articulu si riferisce solu à Ethereu in i so paraguni, cusì deve esse pigliatu solu in questu cuntestu. Per esempiu, a maiò parte di i seguenti sò ancu risolti in EOS)):

Rappresentazione indiretta di l'assi. Un asset hè codificatu cù un integer, ma un integer ùn hè micca u listessu cum'è un asset. In fatti, ùn ci hè micca un tipu o valore chì rapprisenta Bitcoin / Ether / <Any Coin>! Questu rende i prugrammi di scrittura chì utilizanu l'assi difficili è propensu à l'errore. I mudelli cum'è u passaghju di l'assi à / da e prucedure o l'almacenamiento di l'assi in strutture necessitanu un supportu speciale da a lingua.

U deficit ùn hè micca espansione. A lingua rapprisenta solu un asset scarsu. Inoltre, i mezi di prutezzione contr'à a carenza sò direttamente direttamente in a semantica stessa di a lingua. Un sviluppatore, s'ellu vole creà un attivu persunalizatu, deve cuntrullà cù cura tutti l'aspettu di a risorsa stessu. Quessi sò esattamente i prublemi cù i cuntratti intelligenti Ethereum.

L'utilizatori emettenu i so assi, tokens ERC-20, utilizendu interi per determinà u valore è l'offerta tutale. Ogni volta chì sò creati novi tokens, u codice di u cuntrattu intelligente deve verificà indipindentamente u rispettu di e regule di emissioni. Inoltre, a rapprisintazioni indiretta di l'assi porta, in certi casi, à errori serii - duplicazione, doppia spesa o ancu a perdita completa di l'assi.

Mancanza di cuntrollu di accessu flexible. L'unica pulitica di cuntrollu di l'accessu attualmente infurzata hè un schema di firma cù a criptografia asimmetrica. Cum'è a prutezzione di scarsità, a pulitica di cuntrollu di l'accessu hè prufonda in a semantica di a lingua. Ma cumu allargà a lingua per permette à i programatori di definisce e so propiu pulitiche di cuntrollu di accessu hè spessu un compitu assai sfida.

Questu hè ancu veru in Ethereu, induve i cuntratti intelligenti ùn anu micca supportu di criptografia nativa per u cuntrollu di l'accessu. I sviluppatori anu da stabilisce manualmente u cuntrollu di l'accessu, per esempiu, usendu u solu modificatore di u pruprietariu.

Ancu s'ellu sò un grande fan di Ethereu, crede chì e pruprietà di l'attivu anu da esse supportatu nativamente da a lingua per scopi di sicurità. In particulare, u trasferimentu di Ether à un cuntrattu intelligente implica dispatch dinamica, chì hà introduttu una nova classa di bug cunnisciuti cum'è vulnerabilità di re-entrancy. A spedizione dinamica quì significa chì a logica di esecuzione di u codice serà determinata in runtime (dinamica) piuttostu cà in tempu di compilazione (static).

Cusì, in Solidità, quandu u cuntrattu A chjama una funzione in u cuntrattu B, u cuntrattu B pò eseguisce un codice chì ùn era micca intesu da u sviluppatore di u cuntrattu A, chì pò esse vulnerabilità di rientrata (U cuntrattu A agisce accidentalmente cum'è u cuntrattu B per ritirà soldi prima chì i saldi di u contu sò veramente deduti).

Move Language Design Fundamentals

Risorse di primu ordine

Parlendu à un altu livellu, l'interazzione trà moduli / risorse / prucedure in a lingua Move hè assai simili à e relazioni trà e classi / oggetti è metudi in lingue OOP.
I moduli in Move sò simili à i cuntratti intelligenti in altri blockchains. U modulu dichjara i tipi di risorse è e prucedure chì specificanu e regule per a creazione, a distruzzione è l'aghjurnamentu di e risorse dichjarate. Ma tuttu questu hè solu cunvenzioni ("gergo") in Move. Illustreremu stu puntu un pocu dopu.

Flessibilità

Move aghjunghjenu flessibilità à Libra attraversu scripting. Ogni transazzione in Libra include un script, chì hè essenzialmente a prucedura core di a transazzione. U script pò esse realizatu sia una azzione specifica, per esempiu, pagamentu à una lista specifica di destinatari, o reutilizà altre risorse - per esempiu, chjamà una prucedura in quale a logica generale hè specifica. Hè per quessa chì i script di transazzione Move offrenu una flessibilità più grande. Un script pò aduprà cumpurtamenti una volta è ripetiri, mentri Ethereu pò eseguisce solu scripts ripetibili (chjamendu un metudu nantu à un metudu di cuntrattu intelligente). U mutivu chì hè chjamatu "reusable" hè chì e funzioni di un cuntrattu intelligenti ponu esse eseguite parechje volte. (nota: U puntu quì hè assai sottile. Da una banda, i script di transazzione in forma di pseudo-bytecode esistenu ancu in Bitcoin. Per d 'altra banda, cum'è l'aghju capitu, Move espansione sta lingua, in fattu, à u livellu di una lingua di cuntrattu intelligente.).

Seguretat

U furmatu eseguibile Move hè bytecode, chì hè, da una banda, una lingua di livellu più altu ch'è a lingua di assemblea, ma un livellu più bassu di u codice fonte. U bytecode hè verificatu in run-time (on-chain) per risorse, tipi è salvezza di memoria utilizendu un verificatore di bytecode, è dopu eseguitu da l'interprete. Stu approcciu permette à Move di furnisce a sicurità di u codice fonte, ma senza u prucessu di compilazione è a necessità di aghjunghje un compilatore à u sistema. Fà Move una lingua bytecode hè una suluzione veramente bona. Ùn hè micca bisognu di esse compilatu da a fonte, cum'è u casu cù Solidità, è ùn ci hè bisognu di preoccupassi di pussibuli fallimenti o attacchi à l'infrastruttura di compilatore.

Verificabilità

Avemu u scopu di fà cuntrolli u più faciule pussibule, postu chì tuttu questu hè fattu in catena (nota: in linea, durante l'esekzione di ogni transazzione, cusì ogni ritardu porta à una rallentazione di tutta a reta), in ogni modu, inizialmente u disignu di a lingua hè pronta per aduprà strumenti di verificazione statica off-chain. Ancu s'ellu hè più preferibile, per avà u sviluppu di l'arnesi di verificazione (cum'è un toolkit separatu) hè stata posposta à u futuru, è avà solu a verificazione dinamica in run-time (on-chain) hè supportata.

Modularità

I moduli Move furniscenu l'astrazione di dati è localizzanu l'operazioni di risorse critiche. L'incapsulazione furnita da un modulu, cumminata cù a prutezzione furnita da u sistema di tipu Move, assicura chì e proprietà stabilite nantu à i tipi di moduli ùn ponu esse violate da codice fora di u modulu. Questu hè un disignu abbastanza intelligente di l'astrazione, chì significa chì e dati in u cuntrattu ponu esse cambiatu solu in u scopu di u cuntrattu, è micca da fora.

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Move a rivista

L'esempiu di script di transazzione dimostra chì l'azzioni maliziusi o trascurati da un programatore fora di u modulu ùn ponu micca cumprumissu a sicurità di e risorse di u modulu. In seguitu, fighjemu esempi di cumu i moduli, risorse è prucedure sò utilizati per programà a blockchain Libra.

Pagamenti Peer-to-Peer

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

U numeru di muniti specificati in quantità serà trasferitu da u saldo di u mittente à u destinatariu.
Ci hè uni pochi di cose novi quì (evidenziate in rossu):

  • 0x0: indirizzu di u contu induve u modulu hè almacenatu
  • Currency: nome di u modulu
  • Coin: tipu di risorsa
  • U valore di munita tornatu da a prucedura hè un valore di risorsa chì u tipu hè 0x0.Currency.Coin
  • move (): u valore ùn pò micca esse usatu di novu
  • copia (): valore pò esse usatu dopu

Fighjemu u codice: in u primu passu, u mittente chjama una prucedura chjamata ritirare_da_sender da un modulu almacenatu in 0x0.Currency. In u sicondu passu, u mittente trasferisce fondi à u destinatariu movendu u valore di risorsa di munita in a prucedura di depositu di u modulu. 0x0.Currency.

Eccu trè esempi di errori in codice chì saranu rifiutati da i cuntrolli:
Duplicate i fondi cambiendu a chjama move (moneta) nantu copia (moneta). E risorse ponu esse spustate solu. Pruvate di duplicà una quantità di una risorsa (per esempiu, chjamendu copia (moneta) in l'esempiu sopra) hà da esse un errore durante a verificazione di bytecode.

Reutilizazione di fondi specificendu move (moneta) duie volte . Aghjunghjendu una linea 0x0.Currency.deposit (copia (some_other_payee), move (coin)) per esempiu, quì sopra permetterà à u mittente di "passà" e muniti duie volte - a prima volta cù u beneficiariu, è a seconda cù qualcunu_altru_beneficiu. Questu hè un cumpurtamentu indesevule chì ùn hè micca pussibule cun un attivu fisicu. Per furtuna, Move rifiuterà stu prugramma.

Perdita di fondi per u rifiutu move (moneta). Se ùn move micca a risorsa (per esempiu, sguassendu a linea chì cuntene move (moneta)), un errore di verificazione di bytecode serà ghjittatu. Questu prutege i programatori Move da a perdita accidentale o maliciosa di fondi.

Modulu di valuta

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Ogni contu pò cuntene 0 o più moduli (mostrati cum'è rettanguli) è unu o più valori di risorse (mostrati cum'è cilindri). Per esempiu, un contu à 0x0 cuntene u modulu 0x0.Currency è u valore di u tipu di risorsa 0x0.Currency.Coin. Cuntu à l'indirizzu 0x1 hà duie risorse è un modulu; Cuntu à l'indirizzu 0x2 hà dui moduli è un valore di risorse.

Certi mumenti:

  • U script di transazzione hè atomicu - o hè eseguitu cumpletamente o micca in tuttu.
  • Un modulu hè un pezzu di codice longu chì hè accessibile in u mondu.
  • U statu glubale hè strutturatu cum'è una table hash, induve a chjave hè l'indirizzu di u contu
  • I cunti ponu cuntene micca più di un valore di risorsa di un tipu datu è micca più di un modulu cù un nome datu (cuntu à 0x0 ùn pò micca cuntene una risorsa supplementaria 0x0.Currency.Coin o un altru modulu chjamatu Currency)
  • L'indirizzu di u modulu dichjaratu hè parti di u tipu (0x0.Currency.Coin и 0x1.Currency.Coin sò tippi separati chì ùn ponu micca esse usati in modu intercambiable)
  • I programatori ponu almacenà parechje istanze di stu tipu di risorsa in un contu definendu a so risorsa persunalizata - (risorsa TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Pudete riferite à una risorsa cù u so nome senza cunflitti, per esempiu pudete riferite à dui risorse usendu TwoCoins.c1 и TwoCoins.c2.

Annunciu di risorsa di munita

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook
Modulu chjamatu Currency è un tipu di risorsa chjamatu Coin

Certi mumenti:

  • Coin hè una struttura cù un campu di tipu u64 (64-bit unsigned integer)
  • Prucedure di modulu solu Currency pò creà o distrughje valori di tipu Coin.
  • L'altri moduli è script ponu solu scrive o riferimentu à u campu di valore per mezu di e prucedure publiche furnite da u modulu.

Vendita di depositu

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Sta prucedura accetta una risorsa Coin cum'è input è combina cù a risorsa Coincullucatu in u contu di u destinatariu:

  1. Distrughjendu a risorsa di input Coin è arregistrendu u so valore.
  2. Riceve un ligame à una risorsa Coin unica almacenata in u contu di u destinatariu.
  3. Cambia u valore di u numeru di Coins da u valore passatu in u paràmetru quandu chjamà a prucedura.

Certi mumenti:

  • Unpack, BorrowGlobal - prucedure integrate
  • Unpack Questu hè l'unicu modu per sguassà una risorsa di tipu T. A prucedura piglia una risorsa cum'è input, a distrugge, è torna u valore assuciatu cù i campi di u risorsu.
  • BorrowGlobal piglia un indirizzu cum'è input è torna una riferimentu à una istanza unica di T publicata (proprietà) da quellu indirizzu
  • &mut Coin questu hè un ligame à a risorsa Coin

Implementazione di withdraw_from_sender

Immergete in Move, a lingua di prugrammazione Libra Blockchain di Facebook

Sta prucedura:

  1. Ottene un ligame à una risorsa unica Coin, ligata à u contu di u mittente
  2. Diminuisce u valore di una risorsa Coin via u ligame per a quantità specificata
  3. Crea è torna una nova risorsa Coin cù equilibriu aghjurnatu.

Certi mumenti:

  • Vale à dì pò esse causatu da qualcunu, ma ritirare_da_sender hà solu accessu à e muniti di u contu chjamatu
  • GetTxnSenderAddress simile à msg.sender in Solidità
  • Rifiuta À ​​menu chì simile à esse dumandate in Solidità. Se sta verificazione falla, a transazzione hè fermata è tutti i cambiamenti sò rimossi.
  • Pack hè ancu una prucedura integrata chì crea una nova risorsa di tipu T.
  • Cum'è Unpack, Pack pò esse chjamatu solu in u modulu induve a risorsa hè descritta T

cunchiusioni

Avemu esaminatu e caratteristiche principali di a lingua Move, paragunatu cù Ethereu, è ancu diventatu familiarizatu cù a sintassi di basa di scripts. Infine, vi cunsigliu assai di verificà carta bianca originale. Include assai dettagli in quantu à i principii di cuncepimentu di lingua di prugrammazione, è ancu parechji ligami utili.

Source: www.habr.com

Add a comment