Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Sussegwentement, se nikkunsidraw fid-dettall il-karatteristiċi ewlenin tal-lingwa Move u x'inhuma d-differenzi ewlenin tagħha ma 'lingwa oħra, diġà popolari għal kuntratti intelliġenti - Solidità (fuq il-pjattaforma Ethereum). Il-materjal huwa bbażat fuq studju tal-whitepaper disponibbli onlajn ta ’26 paġna.

Introduzzjoni

Move hija lingwa bytecode eżekutibbli li tintuża biex tesegwixxi tranżazzjonijiet tal-utent u kuntratti intelliġenti. Jekk jogħġbok innota żewġ punti:

  1. Filwaqt li Move huwa lingwa ta ’bytecode li tista’ tiġi eżegwita direttament fuq il-magna virtwali Move, Solidity (il-lingwa ta ’kuntratt intelliġenti ta’ Ethereum) hija lingwa ta ’livell ogħla li l-ewwel tiġi kkumpilata għal bytecode qabel ma tiġi eżegwita fuq EVM (Ethereum Virtual Machine).
  2. Move jista 'jintuża mhux biss biex jimplimenta kuntratti intelliġenti, iżda wkoll għal tranżazzjonijiet tad-dwana (aktar dwar dan aktar tard), filwaqt li Solidity hija lingwa intelliġenti biss għal kuntratt.


It-traduzzjoni saret mit-tim tal-proġett tal-Protokoll INDEX. Diġà ttraduniejna materjal kbir li jiddeskrivi l-proġett Libra, issa wasal iż-żmien li nħarsu lejn il-lingwa Move fi ftit aktar dettall. It-traduzzjoni saret flimkien ma' Habrauser coolsiu

Karatteristika ewlenija ta 'Move hija l-abbiltà li tiddefinixxi tipi ta' riżorsi tad-dwana b'semantika bbażata fuq loġika lineari: riżors qatt ma jista 'jiġi kkupjat jew impliċitament imħassra, imċaqlaq biss. Funzzjonalment, dan huwa simili għall-kapaċitajiet tal-lingwa Rust. Il-valuri fis-sadid jistgħu jiġu assenjati biss għal isem wieħed kull darba. L-assenjazzjoni ta' valur għal isem differenti tagħmilha mhux disponibbli taħt l-isem preċedenti.

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Pereżempju, is-siltiet tal-kodiċi li ġejjin se jarmu żball: Użu tal-valur imċaqlaq 'x'. Dan għaliex m'hemm l-ebda ġbir ta 'żibel f'Rust. Meta l-varjabbli joħorġu mill-ambitu, il-memorja li jirreferu għaliha tinħeles ukoll. Fi kliem sempliċi, jista 'jkun hemm "sid" wieħed biss tad-dejta. F'dan l-eżempju x huwa s-sid oriġinali u mbagħad y isir is-sid il-ġdid. Aqra aktar dwar din l-imġieba hawn.

Rappreżentazzjoni ta 'assi diġitali f'sistemi miftuħa

Hemm żewġ proprjetajiet ta 'assi fiżiċi li huma diffiċli biex jirrappreżentaw b'mod diġitali:

  • Rarezza (Skarsezza, oriġinarjament skarsezza). In-numru ta 'assi (emissjoni) fis-sistema għandu jkun ikkontrollat. Id-duplikazzjoni ta 'assi eżistenti għandha tkun ipprojbita, u l-ħolqien ta' oħrajn ġodda hija operazzjoni privileġġata.
  • Kontroll tal-aċċess... Il-parteċipant tas-sistema għandu jkun kapaċi jipproteġi l-assi billi juża politiki ta 'kontroll ta' aċċess.

Dawn iż-żewġ karatteristiċi, li huma naturali għal assi fiżiċi, għandhom jiġu implimentati għal oġġetti diġitali jekk irridu nikkunsidrawhom bħala assi. Pereżempju, metall rari għandu skarsezza naturali, u int biss għandek aċċess għalih (billi żżommu f'idejk, pereżempju) u tista 'tbigħha jew tonfoqha.

Biex nuru kif wasalna f'dawn iż-żewġ proprjetajiet, ejja nibdew bis-sentenzi li ġejjin:

Suġġeriment # 1: L-Aktar Sempliċi Regola Mingħajr Kontroll tal-Akkont u l-Iskarsezza

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

  • G [K]: = n tindika aġġornament għal numru aċċessibbli minn ċavetta К fl-istat globali tal-blockchain, b'tifsira ġdida n.
  • transazzjoni iceAlice, 100⟩ tfisser li tissettja l-bilanċ tal-kont ta 'Alice għal 100.

Is-soluzzjoni ta 'hawn fuq għandha bosta problemi kbar:

  • Alice tista 'tirċievi numru illimitat ta' muniti billi sempliċement tibgħat transazzjoni iceAlice, 100⟩.
  • Il-muniti li Alice tibgħat lil Bob huma inutli, billi Bob jista 'jibgħat lilu nnifsu numru illimitat ta' muniti bl-istess teknika.

Suġġeriment # 2: Meta wieħed iqis id-defiċit

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Issa qed nimmonitorjaw is-sitwazzjoni sabiex in-numru ta 'muniti Ka kien mill-inqas ugwali n qabel it-transazzjoni tat-trasferiment. Madankollu, filwaqt li dan isolvi l-problema tal-iskarsezza, m'hemm l-ebda informazzjoni dwar min jista 'jibgħat il-muniti ta' Alice (għalissa, kulħadd jista 'jagħmel dan, il-ħaġa ewlenija mhix li tikser ir-regola li tillimita l-ammont).

Proposta # 3: Li tgħaqqad l-iskarsezza u l-kontroll tal-aċċess

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Aħna nsolvu din il-problema b'mekkaniżmu ta 'firma diġitali verifika_sig qabel ma tiċċekkja l-bilanċ, li jfisser li Alice tuża ċ-ċavetta privata tagħha biex tiffirma t-tranżazzjoni u tikkonferma li hija s-sid tal-muniti tagħha.

Lingwi ta 'programmazzjoni Blockchain

Il-lingwi eżistenti blockchain jiffaċċjaw il-problemi li ġejjin (kollha ġew solvuti fi Move (nota: sfortunatament, l-awtur tal-artiklu jappella biss għal Ethereum fil-paraguni tiegħu, għalhekk ta 'min jeħodhom biss f'dan il-kuntest. Pereżempju, ħafna minn dawn li ġejjin huma solvuti wkoll fl-EOS.)):

Rappreżentazzjoni indiretta ta 'assi. Ass huwa kodifikat bl-użu ta 'numru sħiħ, iżda numru sħiħ mhuwiex l-istess bħal assi. Fil-fatt, m'hemm l-ebda tip jew valur li jirrappreżenta Bitcoin/Ether/<Any Coin>! Dan jagħmel programmi tal-kitba li jużaw assi diffiċli u suxxettibbli għall-iżbalji. Mudelli bħall-mogħdija ta' assi lejn/minn proċeduri jew il-ħażna ta' assi fi strutturi jeħtieġu appoġġ speċjali mil-lingwa.

Id-defiċit mhuwiex espansibbli... Il-lingwa tirrappreżenta assi skars wieħed biss. Barra minn hekk, ir-rimedji kontra l-iskarsezza huma mqabbdin direttament fis-semantika tal-lingwa nnifisha. L-iżviluppatur, jekk irid joħloq assi tad-dwana, għandu jikkontrolla bir-reqqa l-aspetti kollha tar-riżorsa hu stess. Dawn huma eżattament il-problemi tal-kuntratti intelliġenti Ethereum.

L-utenti joħorġu l-assi tagħhom, tokens ERC-20, billi jużaw numri sħaħ biex jiddeterminaw kemm il-valur kif ukoll il-provvista totali. Kull meta jinħolqu tokens ġodda, il-kodiċi tal-kuntratt intelliġenti għandu jivverifika b'mod indipendenti l-konformità mar-regoli tal-emissjonijiet. Barra minn hekk, il-preżentazzjoni indiretta ta 'assi twassal, f'xi każijiet, għal żbalji serji - duplikazzjoni, infiq doppju jew saħansitra telf sħiħ ta' assi.

Nuqqas ta 'kontroll ta' aċċess flessibbli... L-unika politika ta ’kontroll tal-aċċess li qed tintuża llum hija skema ta’ firma li tuża kriptografija asimmetrika. Bħall-protezzjoni tal-iskarsezza, il-politiki tal-kontroll tal-aċċess huma mdaħħla sew fis-semantika tal-lingwa. Imma kif testendi l-lingwa biex tippermetti lill-programmaturi jiddefinixxu l-politiki ta 'kontroll ta' aċċess tagħhom stess spiss huwa kompitu diffiċli ħafna.

Dan jgħodd ukoll fuq Ethereum, fejn il-kuntratti intelliġenti m'għandhomx appoġġ għall-kriptografija nattiva għall-kontroll tal-aċċess. L-iżviluppaturi għandhom jissettjaw manwalment il-kontroll tal-aċċess, pereżempju, billi jużaw il-modifikatur onlyOwner.

Anke jekk jien fan kbir ta 'Ethereum, nemmen li l-proprjetajiet tal-assi għandhom ikunu appoġġjati b'mod nattiv mill-lingwa għal skopijiet ta' sigurtà. B'mod partikolari, it-trasferiment ta 'Ether għal kuntratt intelliġenti jinvolvi dispaċċ dinamiku, li introduċa klassi ġdida ta' bugs magħrufa bħala vulnerabbiltajiet ta 'dħul mill-ġdid. Id-dispaċċ dinamiku hawnhekk ifisser li l-loġika tal-eżekuzzjoni tal-kodiċi se tiġi determinata waqt ir-runtime (dinamika) aktar milli fil-ħin tal-kompilazzjoni (statiku).

Għalhekk, f’Solidity, meta l-kuntratt A jsejjaħ funzjoni fil-kuntratt B, il-kuntratt B jista’ jħaddem kodiċi li ma kienx maħsub mill-iżviluppatur tal-kuntratt A, li jista’ jirriżulta f’ vulnerabbiltajiet tad-dħul mill-ġdid (Il-kuntratt A aċċidentalment jaġixxi bħala kuntratt B biex jiġbed il-flus qabel ma jitnaqqsu l-bilanċi tal-kont).

Move Language Design Fundamentals

Riżorsi tal-ewwel ordni

F'livell għoli, l-interazzjoni bejn moduli / riżorsi / proċeduri fil-lingwa Move hija simili ħafna għar-relazzjoni bejn klassijiet / oġġetti u metodi f'lingwi OOP.
Il-moduli Move huma simili għal kuntratti intelliġenti fi blockchains oħra. Il-modulu jiddikjara tipi ta 'riżorsi u proċeduri li jiddefinixxu r-regoli għall-ħolqien, il-qerda u l-aġġornament tar-riżorsi ddikjarati. Iżda dawn kollha huma biss konvenzjonijiet ("jargon”) In Move. Se nillustraw dan il-punt ftit aktar tard.

Flessibilità

Move żżid il-flessibbiltà lil Libra permezz ta' scripting. Kull tranżazzjoni f'Libra tinkludi skript, li essenzjalment hija l-proċedura ewlenija tat-tranżazzjoni. L-iskript jista 'jwettaq jew azzjoni speċifika waħda, pereżempju, ħlasijiet lil lista speċifikata ta' riċevituri, jew jerġa 'jutilizza riżorsi oħra - pereżempju, billi ssejjaħ proċedura li fiha l-loġika ġenerali hija speċifikata. Huwa għalhekk li l-iskripts tat-tranżazzjonijiet Move joffru flessibilità akbar. Skript jista 'juża kemm imġieba ta' darba kif ukoll ripetuti, filwaqt li Ethereum jista 'jwettaq biss skripts ripetibbli (li jsejjaħ metodu wieħed fuq metodu ta' kuntratt intelliġenti). Ir-raġuni li tissejjaħ "li jistgħu jerġgħu jintużaw" hija minħabba li l-funzjonijiet ta 'kuntratt intelliġenti jistgħu jiġu eżegwiti diversi drabi. (Nota: Il-punt hawnhekk huwa sottili ħafna. Min-naħa waħda, skripts tat-tranżazzjonijiet fil-forma ta 'psewdo-bytecode jeżistu wkoll f'Bitcoin. Min-naħa l-oħra, kif nifhimha jien, Move tespandi din il-lingwa, fil-fatt, għal-livell ta’ lingwa għal kuntratt intelliġenti sħiħ.).

sigurtà

Il-format eżekutibbli Move huwa bytecode, li huwa, minn naħa waħda, lingwa ta 'livell ogħla minn lingwa tal-assemblaġġ, iżda livell aktar baxx mill-kodiċi tas-sors. Il-bytecode jiġi ċċekkjat fil-ħin tar-run-time (on-chain) għar-riżorsi, it-tipi u s-sikurezza tal-memorja bl-użu ta 'verifikatur tal-bytecode, u mbagħad eżegwit mill-interpretu. Dan l-approċċ jippermetti li Move tipprovdi s-sigurtà tal-kodiċi tas-sors, iżda mingħajr il-proċess ta 'kumpilazzjoni u l-ħtieġa li żżid kompilatur mas-sistema. Nagħmlu Move lingwa bytecode hija soluzzjoni tassew tajba. M'għandux għalfejn jiġi kkompilat mis-sors, bħalma huwa l-każ ma' Solidity, u m'hemmx għalfejn tinkwieta dwar fallimenti jew attakki possibbli fuq l-infrastruttura tal-kompilatur.

Verifikabilità

Aħna mmirati biex inwettqu kontrolli kemm jista 'jkun faċli, peress li dan kollu jsir fuq il-katina (nota: onlajn, waqt l-eżekuzzjoni ta 'kull tranżazzjoni, għalhekk kwalunkwe dewmien iwassal għal tnaqqis tan-netwerk kollu), madankollu, inizjalment id-disinn tal-lingwa huwa lest biex juża għodod ta' verifika statika barra mill-katina. Għalkemm dan huwa aktar preferibbli, għalissa l-iżvilupp ta 'għodod ta' verifika (bħala sett ta 'għodda separat) ġie pospost għall-futur, u issa hija appoġġjata biss verifika dinamika fil-ħin tar-run-time (on-chain).

Modularità

Il-moduli Move jipprovdu estrazzjoni tad-dejta u jillokalizzaw operazzjonijiet kritiċi fuq ir-riżorsi. L-inkapsulament ipprovdut mill-modulu, flimkien mal-protezzjoni pprovduta mis-sistema tat-tip Move, jiżgura li l-proprjetajiet stabbiliti fuq it-tipi tal-modulu ma jistgħux jinkisru b'kodiċi barra l-modulu. Dan huwa disinn ta 'estrazzjoni pjuttost maħsub tajjeb, li jfisser li d-dejta ġewwa l-kuntratt tista' tinbidel biss fil-qafas tal-kuntratt, iżda mhux barra.

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Ċaqlaq ħarsa ġenerali

L-eżempju tal-iskritt tat-tranżazzjoni juri li azzjonijiet malizzjużi jew traskurati minn programmatur barra modulu ma jistgħux jikkompromettu s-sigurtà tar-riżorsi tal-modulu. Sussegwentement, inħarsu lejn eżempji ta 'kif il-moduli, ir-riżorsi u l-proċeduri jintużaw biex tiġi programmata l-blockchain Libra.

Ħlasijiet bejn il-pari

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

In-numru ta' muniti speċifikati fl-ammont jiġi trasferit mill-bilanċ ta' min jibgħat lir-riċevitur.
Hemm ftit affarijiet ġodda hawn (enfasizzati bl-aħmar):

  • 0x0: indirizz tal-kont fejn jinħażen il-modulu
  • munita: isem tal-modulu
  • Coin: tip ta 'riżorsa
  • Il-valur tal-munita rritornat mill-proċedura huwa valur tar-riżorsa tat-tip 0x0.Currency.Coin
  • mossa (): il-valur ma jistax jerġa 'jintuża
  • kopja (): il-valur jista 'jintuża aktar tard

Analizza l-kodiċi: fl-ewwel pass, il-mittent isejjaħ proċedura msemmija jirtira_mill-mittent minn modulu maħżun fi 0x0.Munita. Fit-tieni pass, il-mittent jittrasferixxi fondi lir-riċevitur billi jċaqlaq il-valur tar-riżorsi tal-muniti fil-proċedura tad-depożitu tal-modulu 0x0.Munita.

Hawn huma tliet eżempji ta 'żbalji fil-kodiċi li se jiġu rrifjutati mill-kontrolli:
Duplika fondi billi tbiddel is-sejħa imxi (munita) fuq kopja (munita). Ir-riżorsi jistgħu jiġu mċaqalqa biss. Jipprova jidduplika kwantità ta’ riżorsa (pereżempju, billi ċċempel kopja (munita) fl-eżempju ta 'hawn fuq) jirriżulta fi żball waqt li tiċċekkja l-bytecode.

Użu mill-ġdid ta 'fondi billi tispeċifika imxi (munita) darbtejn . Żieda ta 'linja 0x0.Currency.deposit (kopja (some_other_payee), ċaqliq (munita)) pereżempju, dan ta' hawn fuq jippermetti lil min jibgħat il-muniti li "jonfoq" il-muniti darbtejn - l-ewwel darba mal-benefiċjarju, u t-tieni ma ' xi_ieħor_pagatur. Din hija imġieba mhux mixtieqa li mhix possibbli b'assi fiżiku. Fortunatament, Move se tirrifjuta dan il-programm.

Telf ta' fondi minħabba rifjut imxi (munita). Jekk ma tmexxix ir-riżorsa (per eżempju, billi tħassar il-linja li fiha imxi (munita)), se jintrema żball ta 'verifika bytecode. Dan jipproteġi lill-programmaturi Move minn telf aċċidentali jew malizzjuż ta' fondi.

Modulu tal-munita

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Kull kont jista' jkun fih 0 jew aktar moduli (muri bħala rettangoli) u valur tar-riżorsi wieħed jew aktar (muri bħala ċilindri). Per eżempju, kont fuq 0x0 fih modulu 0x0.Munita u l-valur tat-tip ta' riżorsa 0x0.Munita.Munita. Kont fl-indirizz 0x1 għandha żewġ riżorsi u modulu wieħed; Kont fl-indirizz 0x2 għandha żewġ moduli u valur tar-riżorsi wieħed.

Mumenti Nekotory:

  • L-iskrittura tat-tranżazzjoni hija atomika - jew tiġi esegwita kompletament jew xejn.
  • Modulu huwa biċċa kodiċi li ħajja twila li hija aċċessibbli globalment.
  • L-istat globali huwa strutturat bħala tabella hash, fejn iċ-ċavetta hija l-indirizz tal-kont
  • Il-kontijiet ma jistax ikun fihom aktar minn valur tar-riżorsi wieħed ta’ tip partikolari u mhux aktar minn modulu wieħed b’isem partikolari (kont fi 0x0 ma jistax ikun fih riżors addizzjonali 0x0.Munita.Munita jew modulu ieħor imsemmi munita)
  • L-indirizz tal-modulu ddikjarat huwa parti mit-tip (0x0.Munita.Munita и 0x1.Munita.Munita huma tipi separati li ma jistgħux jintużaw minflok xulxin)
  • Il-programmaturi jistgħu jaħżnu każijiet multipli ta’ dan it-tip ta’ riżors f’kont billi jiddefinixxu r-riżorsa tad-dwana tagħhom - (riżors TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Tista 'tirreferi għal riżors b'isimha mingħajr kunflitti, pereżempju tista' tirreferi għal żewġ riżorsi bl-użu TwoCoins.c1 и TwoCoins.c2.

Tħabbir tar-riżorsi tal-muniti

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook
Modulu msemmi munita u tip ta' riżorsa msemmi Coin

Mumenti Nekotory:

  • Coin hija struttura b'qasam wieħed tat-tip u64 (64-bit numru sħiħ mhux iffirmat)
  • Proċeduri tal-modulu biss munita jistgħu joħolqu jew jeqirdu valuri tat-tip Coin.
  • Moduli u skripts oħra jistgħu jiktbu jew jirreferu biss għall-qasam tal-valur permezz ta' proċeduri pubbliċi pprovduti mill-modulu.

Bejgħ ta' depożitu

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Din il-proċedura taċċetta riżorsa Coin bħala input u jgħaqqadha mar-riżorsa Coinmaħżun fil-kont tar-riċevitur:

  1. Il-qerda tar-riżorsa tal-input Coin u r-reġistrazzjoni tal-valur tagħha.
  2. Jirċievu link għal riżors ta’ Muniti uniku maħżun fil-kont tar-riċevitur.
  3. Nibdlu l-valur tan-numru ta 'Muniti bil-valur mgħoddi fil-parametru meta ssejjaħ il-proċedura.

Mumenti Nekotory:

  • Unpack, BorrowGlobal - proċeduri integrati
  • Ħu l-pakkett Dan huwa l-uniku mod biex titħassar riżors tat-tip T. Il-proċedura tieħu riżorsa bħala input, teqredha, u tirritorna l-valur assoċjat mal-oqsma tar-riżorsa.
  • BorrowGlobal jieħu indirizz bħala input u jirritorna referenza għal istanza unika ta' T ippubblikata (proprjetà) minn dak l-indirizz
  • &mut Coin din hija link għar-riżorsa Coin

Implimentazzjoni ta' withdraw_from_sender

Għaddas f'Move - il-lingwa ta' programmar blockchain Libra ta' Facebook

Din il-proċedura:

  1. Iġib link għal riżors uniku Coin, marbuta mal-kont tal-mittent
  2. Tnaqqas il-valur ta' riżorsa Coin permezz tal-link għall-ammont speċifikat
  3. Joħloq u jirritorna riżors ġdid Coin bil-bilanċ aġġornat.

Mumenti Nekotory:

  • depożitu jista jkun ikkawżat minn xi ħadd, imma jirtira_mill-mittent għandu aċċess biss għall-muniti tal-kont li jċempel
  • GetTxnSenderAddress simili għal msg.sender fis-Solidità
  • IrrifjutaSakemm simili għal jeħtieġu fis-Solidità. Jekk dan il-kontroll jonqos, it-tranżazzjoni titwaqqaf u l-bidliet kollha jiġu rtirati lura.
  • Pakkett hija wkoll proċedura integrata li toħloq riżors ġdid tat-tip T.
  • Kif ukoll Ħu l-pakkett, Pakkett jista 'jissejjaħ biss ġewwa l-modulu fejn ir-riżors huwa deskritt T

Konklużjoni

Aħna eżaminajna l-karatteristiċi ewlenin tal-lingwa Move, qabbilha ma 'Ethereum, u sirna wkoll familjari mas-sintassi bażika tal-iskripts. Fl-aħħarnett, nirrakkomanda ħafna li tiċċekkja karta bajda oriġinali. Jinkludi ħafna dettalji dwar il-prinċipji tad-disinn tal-lingwa tal-ipprogrammar, kif ukoll ħafna links utli.

Sors: www.habr.com

Żid kumment