Sumisid sa Move - Libra blockchain programming language ng Facebook

Susunod, isasaalang-alang namin nang detalyado ang mga pangunahing katangian ng wikang Ilipat at kung ano ang mga pangunahing pagkakaiba nito sa isa pa, sikat na wika para sa mga matalinong kontrata - Solidity (sa platform ng Ethereum). Ang materyal ay batay sa isang pag-aaral ng magagamit na online na 26-pahinang whitepaper.

Pagpapakilala

Ang Move ay isang executable na bytecode na wika na ginagamit para magsagawa ng mga transaksyon ng user at mga smart contract. Mangyaring tandaan ang dalawang puntos:

  1. Habang ang Mov ay isang wikang bytecode na maaaring direktang maisagawa sa Move virtual machine, ang Solidity (matalinong wika ng kontrata ng Ethereum) ay isang mas mataas na antas na wika na unang naipunan sa bytecode bago naisagawa sa isang EVM (Ethereum Virtual Machine).
  2. Maaaring magamit ang paglipat hindi lamang upang magpatupad ng mga matalinong kontrata, kundi pati na rin para sa mga pasadyang transaksyon (higit pa sa paglaon), habang ang Solidity ay isang matalinong wika lamang sa kontrata.


Ang pagsasalin ay isinagawa ng pangkat ng proyekto ng INDEX Protocol. Nagtranslate na kami malaking materyal na naglalarawan sa proyekto ng Libra, ngayon ay oras na upang tingnan ang wikang Ilipat sa kaunti pang detalye. Ang pagsasalin ay isinagawa kasama ng Habrauser coolsiu

Ang isang pangunahing tampok ng Move ay ang kakayahang tumukoy ng mga custom na uri ng mapagkukunan na may mga semantika batay sa linear na lohika: ang isang mapagkukunan ay hindi kailanman makokopya o hindi malinaw na tatanggalin, inilipat lamang. Sa paggana, ito ay katulad ng mga kakayahan ng wikang Rust. Ang mga halaga sa Rust ay maaari lamang italaga sa isang pangalan sa isang pagkakataon. Ang pagtatalaga ng halaga sa ibang pangalan ay ginagawa itong hindi magagamit sa ilalim ng nakaraang pangalan.

Sumisid sa Move - Libra blockchain programming language ng Facebook

Halimbawa, ang sumusunod na snippet ng code ay magtatapon ng isang error: Paggamit ng inilipat na halaga na 'x'. Ito ay dahil walang koleksyon ng basura sa Rust. Kapag ang mga variable ay nawala sa saklaw, ang memorya na tinukoy nila ay napalaya rin. Sa madaling salita, maaari lamang magkaroon ng isang "may-ari" ng data. Sa halimbawang ito x ay ang orihinal na may-ari at pagkatapos y nagiging bagong may-ari. Magbasa nang higit pa tungkol sa pag-uugaling ito dito.

Ang representasyon ng mga digital na assets sa mga bukas na system

Mayroong dalawang mga katangian ng mga pisikal na pag-aari na mahirap na digital na kumatawan:

  • Rarity (Kakulangan, orihinal na kakulangan). Ang bilang ng mga assets (emission) sa system ay dapat kontrolin. Ang pagdoble ng mga mayroon nang mga pag-aari ay dapat na ipagbawal, at ang paglikha ng mga bago ay isang may pribilehiyong operasyon.
  • Pag-access control... Dapat na maprotektahan ng kalahok ng system ang mga assets gamit ang mga patakaran sa control control.

Ang dalawang katangiang ito, na likas para sa mga pisikal na pag-aari, ay dapat ipatupad para sa mga digital na bagay kung nais nating isaalang-alang ang mga ito bilang mga assets. Halimbawa

Upang ilarawan kung paano kami nakarating sa dalawang mga pag-aari, magsimula tayo sa mga sumusunod na pangungusap:

Mungkahi # 1: Ang Pinakasimpleng Panuntunan Nang Walang Kakulangan at Kontrol sa Pag-access

Sumisid sa Move - Libra blockchain programming language ng Facebook

  • G [K]: = n nagsasaad ng isang pag-update sa isang bilang na maa-access ng isang susi К sa pandaigdigang estado ng blockchain, na may bagong kahulugan n.
  • transaksyon ⟨Alice, 100⟩ nangangahulugang itatakda ang balanse ng account ni Alice sa 100.

Ang solusyon sa itaas ay may maraming mga pangunahing problema:

  • Maaaring makatanggap si Alice ng isang walang limitasyong bilang ng mga barya sa pamamagitan lamang ng pagpapadala transaksyon ⟨Alice, 100⟩.
  • Ang mga barya na ipinadala ni Alice kay Bob ay walang silbi, dahil maaaring magpadala si Bob sa kanyang sarili ng isang walang limitasyong bilang ng mga barya gamit ang parehong pamamaraan.

Mungkahi # 2: Isinasaalang-alang ang kakulangan

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ngayon ay sinusubaybayan namin ang sitwasyon upang ang bilang ng mga barya Ka ay pantay man lang n bago ang transaksyon sa paglipat. Gayunpaman, habang nalulutas nito ang problema ng kakulangan, walang impormasyon tungkol sa kung sino ang maaaring magpadala ng mga barya ni Alice (sa ngayon, maaaring gawin ito ng sinuman, ang pangunahing bagay ay hindi upang sirain ang patakaran ng paglilimita sa halaga).

Panukala # 3: Pinagsasama ang kakulangan at kontrol sa pag-access

Sumisid sa Move - Libra blockchain programming language ng Facebook

Malulutas namin ang problemang ito sa isang mekanismo ng digital signature i-verify_sig bago suriin ang balanse, na nangangahulugang ginagamit ni Alice ang kanyang pribadong key upang lagdaan ang transaksyon at kumpirmahing siya ang may-ari ng kanyang mga barya.

Mga wika ng programa ng Blockchain

Ang mga umiiral na mga wika ng blockchain ay nahaharap sa mga sumusunod na problema (lahat ng mga ito ay nalutas sa Paglipat (tala: sa kasamaang palad, ang may-akda ng artikulo ay umaapela lamang sa Ethereum sa kanyang mga paghahambing, kaya't sulit na dalhin lamang ang mga ito sa kontekstong ito. Halimbawa, ang karamihan sa mga sumusunod ay nalulutas din sa EOS.)):

Hindi direktang representasyon ng mga assets. Ang isang asset ay naka-encode gamit ang isang integer, ngunit ang isang integer ay hindi katulad ng isang asset. Sa katunayan, walang uri o halaga na kumakatawan sa Bitcoin/Ether/<Any Coin>! Ginagawa nitong mahirap at madaling kapitan ng error ang pagsusulat ng mga programang gumagamit ng mga asset. Ang mga pattern tulad ng pagpasa ng mga asset papunta/mula sa mga pamamaraan o pag-iimbak ng mga asset sa mga istruktura ay nangangailangan ng espesyal na suporta mula sa wika.

Ang depisit ay hindi napapalawak... Ang wika ay kumakatawan lamang sa isang mahirap makuha na pag-aari. Bilang karagdagan, ang mga remedyo laban sa kakulangan ay direktang pinagtaguyod sa mga semantiko ng wika mismo. Ang developer, kung nais niyang lumikha ng isang pasadyang pag-aari, dapat na maingat na kontrolin ang lahat ng mga aspeto ng mapagkukunan mismo. Ito mismo ang mga problema ng matalinong mga kontrata ng Ethereum.

Nag-isyu ang mga gumagamit ng kanilang mga assets, mga token ng ERC-20, na gumagamit ng mga integer upang matukoy ang parehong halaga at ang kabuuang supply. Kailan man nilikha ang mga bagong token, ang matalinong code ng kontrata ay dapat na independiyenteng i-verify ang pagsunod sa mga patakaran sa paglabas. Bilang karagdagan, ang hindi direktang pagtatanghal ng mga assets ay humahantong, sa ilang mga kaso, sa mga seryosong pagkakamali - pagkopya, doble na paggastos o kahit na kumpletong pagkawala ng mga assets.

Kakulangan ng kakayahang umangkop na kontrol sa pag-access... Ang tanging patakaran sa kontrol sa pag-access na may bisa ngayon ay isang signature scheme na gumagamit ng asymmetric cryptography. Tulad ng proteksyon ng kakapusan, ang mga patakaran sa pag-access sa pag-access ay malalim na naka-embed sa mga semantiko ng wika. Ngunit kung paano pahabain ang wika upang payagan ang mga programmer na tukuyin ang kanilang sariling mga patakaran sa kontrol sa pag-access ay madalas na isang napakahirap na gawain.

Totoo rin ito sa Ethereum, kung saan ang mga matalinong kontrata ay walang suporta sa katutubong cryptography para sa kontrol sa pag-access. Dapat manu-manong itakda ng mga developer ang kontrol sa pag-access, halimbawa, gamit ang tanging Owner modifier.

Kahit na ako ay isang malaking tagahanga ng Ethereum, naniniwala ako na ang mga ari-arian ng asset ay dapat na katutubong suportado ng wika para sa mga layuning pangseguridad. Sa partikular, ang paglilipat ng Ether sa isang matalinong kontrata ay nagsasangkot ng dynamic na pagpapadala, na nagpakilala ng bagong klase ng mga bug na kilala bilang mga kahinaan sa muling pagpasok. Ang dynamic na dispatch dito ay nangangahulugan na ang execution logic ng code ay tutukuyin sa runtime (dynamic) sa halip na sa compile time (static).

Kaya, sa Solidity, kapag ang kontrata A ay tumawag sa isang function sa kontrata B, ang kontrata B ay maaaring magpatakbo ng code na hindi nilayon ng developer ng kontrata A, na maaaring magresulta sa mga kahinaan sa muling pagpasok (Ang kontrata A ay hindi sinasadyang gumaganap bilang kontrata B upang mag-withdraw ng pera bago ang mga balanse ng account ay aktwal na ibabawas).

Ilipat ang Language Design Fundamentals

Mga mapagkukunang unang order

Sa isang mataas na antas, ang pakikipag-ugnayan sa pagitan ng mga modyul / mapagkukunan / pamamaraan sa wikang Ilipat ay halos kapareho ng ugnayan sa pagitan ng mga klase / bagay at pamamaraan sa mga wika ng OOP.
Ang mga module ng paglipat ay katulad ng mga matalinong kontrata sa iba pang mga blockchain. Inihahayag ng modyul ang mga uri ng mapagkukunan at pamamaraan na tumutukoy sa mga patakaran para sa paglikha, pagwasak, at pag-update ng mga idineklarang mapagkukunan. Ngunit ang lahat ng ito ay mga kombensiyon lamang ("jargon”) Sa Paggalaw. Ipapakita namin ang puntong ito nang kaunti sa paglaon.

Kakayahang umangkop

Ang Move ay nagdaragdag ng flexibility sa Libra sa pamamagitan ng scripting. Ang bawat transaksyon sa Libra ay may kasamang script, na mahalagang pangunahing pamamaraan ng transaksyon. Ang script ay maaaring magsagawa ng alinman sa isang tinukoy na aksyon, halimbawa, mga pagbabayad sa isang tinukoy na listahan ng mga tatanggap, o muling gumamit ng iba pang mga mapagkukunan - halimbawa, sa pamamagitan ng pagtawag sa isang pamamaraan kung saan ang pangkalahatang lohika ay tinukoy. Ito ang dahilan kung bakit ang mga script ng Move transaction ay nag-aalok ng higit na kakayahang umangkop. Ang isang script ay maaaring gumamit ng isang beses at paulit-ulit na pag-uugali, habang ang Ethereum ay maaari lamang magsagawa ng mga paulit-ulit na script (pagtawag ng isang paraan sa isang matalinong paraan ng kontrata). Ang dahilan kung bakit tinawag itong "magagamit muli" ay dahil ang mga function ng isang matalinong kontrata ay maaaring isagawa nang maraming beses. (tandaan: Ang punto dito ay napaka banayad. Sa isang banda, umiiral din sa Bitcoin ang mga script ng transaksyon sa anyo ng pseudo-bytecode. Sa kabilang banda, ayon sa pagkakaintindi ko, pinalawak ng Move ang wikang ito, sa katunayan, sa antas ng isang ganap na smart contract na wika).

katiwasayan

Ang Move executable na format ay bytecode, na, sa isang banda, ay isang mas mataas na antas ng wika kaysa sa assembly language, ngunit mas mababang antas kaysa sa source code. Ang bytecode ay sinusuri sa run-time (on-chain) para sa mga mapagkukunan, uri at kaligtasan ng memorya gamit ang isang bytecode verifier, at pagkatapos ay ipapatupad ng interpreter. Ang diskarte na ito ay nagbibigay-daan sa Move na magbigay ng seguridad ng source code, ngunit walang proseso ng compilation at ang pangangailangan na magdagdag ng compiler sa system. Ang paggawa ng Move ng isang bytecode na wika ay isang magandang solusyon. Hindi ito kailangang i-compile mula sa pinagmulan, tulad ng kaso sa Solidity, at hindi kailangang mag-alala tungkol sa mga posibleng pagkabigo o pag-atake sa imprastraktura ng compiler.

Pagpapatotoo

Layunin naming magsagawa ng mga pagsusuri sa pinakamadali hangga't maaari, dahil ang lahat ng ito ay ginagawa on-chain (tandaan: online, sa panahon ng pagpapatupad ng bawat transaksyon, kaya't ang anumang pagkaantala ay humahantong sa isang paghina ng buong network), gayunpaman, sa simula ang disenyo ng wika ay handa nang gumamit ng off-chain static na mga tool sa pag-verify. Bagama't ito ay mas kanais-nais, sa ngayon ang pagbuo ng mga tool sa pag-verify (bilang isang hiwalay na toolkit) ay ipinagpaliban para sa hinaharap, at ngayon lamang ang dynamic na pag-verify sa run-time (on-chain) ang sinusuportahan.

Modularity

Ang mga module ng paglipat ay nagbibigay ng abstraction ng data at naisalokal ang mga kritikal na pagpapatakbo sa mga mapagkukunan. Ang encapsulation na ibinigay ng module, na sinamahan ng proteksyon na ibinigay ng sistema ng uri ng Paglipat, ay tinitiyak na ang mga pag-aari na itinakda sa mga uri ng module ay hindi maaaring lumabag ng code sa labas ng module. Ito ay isang medyo naisip na disenyo ng abstraction, nangangahulugang ang data sa loob ng isang kontrata ay maaaring magbago lamang sa loob ng saklaw ng kontrata, ngunit hindi sa labas.

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ilipat ang pangkalahatang ideya

Ipinapakita ng halimbawa ng script ng transaksyon na ang nakakahamak o walang ingat na mga aksyon ng isang programmer sa labas ng isang module ay hindi maaaring ikompromiso ang seguridad ng mga mapagkukunan ng isang module. Susunod, titingnan namin ang mga halimbawa kung paano ginagamit ang mga module, mapagkukunan, at pamamaraan upang mai-program ang Libra blockchain.

Mga bayad sa Peer-to-Peer

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ang bilang ng mga barya na tinukoy sa halaga ay ililipat mula sa balanse ng nagpadala patungo sa tatanggap.
Mayroong ilang mga bagong bagay dito (naka-highlight sa pula):

  • 0x0: address ng account kung saan nakaimbak ang module
  • Pera: pangalan ng module
  • Barya: uri ng mapagkukunan
  • Ang halaga ng barya na ibinalik ng pamamaraan ay isang mapagkukunang halaga ng uri 0x0.Currency.Coin
  • ilipat (): hindi na magagamit muli ang halaga
  • kopya (): ang halaga ay maaaring magamit sa paglaon

I-parse ang code: sa unang hakbang, ang nagpadala ay tumatawag sa isang pamamaraan na pinangalanan mag-withdraw_from_sender mula sa isang modyul na nakaimbak sa 0x0. Kasalukuyan. Sa ikalawang hakbang, naglilipat ang nagpadala ng mga pondo sa tatanggap sa pamamagitan ng paglipat ng halaga ng mapagkukunan ng barya sa pamamaraan ng pagdedeposito ng module 0x0. Kasalukuyan.

Narito ang tatlong halimbawa ng mga error sa code na tatanggihan ng mga tseke:
Doblehin ang mga pondo sa pamamagitan ng pagbabago ng tawag ilipat (barya) sa kopya (barya). Ang mga mapagkukunan ay maaari lamang ilipat. Sinusubukang i-duplicate ang isang dami ng isang mapagkukunan (halimbawa, sa pamamagitan ng pagtawag kopya (barya) sa halimbawa sa itaas) ay magreresulta sa isang error habang sinusuri ang bytecode.

Paggamit muli ng mga pondo sa pamamagitan ng pagtukoy ilipat (barya) dalawang beses . Pagdaragdag ng linya 0x0.Currency.deposit (kopya (some_other_payee), ilipat (coin)) halimbawa, ang nasa itaas ay magbibigay-daan sa nagpadala na "gastusan" ang mga barya nang dalawang beses - sa unang pagkakataon kasama ang nagbabayad, at ang pangalawa ay may some_other_payee. Ito ay isang hindi kanais-nais na pag-uugali na hindi posible sa isang pisikal na asset. Sa kabutihang palad, tatanggihan ng Move ang programang ito.

Pagkawala ng pondo dahil sa pagtanggi ilipat (barya). Kung hindi mo ililipat ang mapagkukunan (halimbawa, sa pamamagitan ng pagtanggal ng linyang naglalaman ng ilipat (barya)), isang error sa pag-verify ng bytecode ang itatapon. Pinoprotektahan nito ang Move programmer mula sa hindi sinasadya o malisyosong pagkawala ng mga pondo.

Module ng pera

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ang bawat account ay maaaring maglaman ng 0 o higit pang mga module (ipinapakita bilang mga parihaba) at isa o higit pang mga halaga ng mapagkukunan (ipinapakita bilang mga cylinder). Halimbawa, ang isang account sa 0x0 naglalaman ng modyul 0x0. Kasalukuyan at ang halaga ng uri ng mapagkukunan 0x0.Currency.Coin. Account sa address 0x1 may dalawang mapagkukunan at isang module; Account sa address 0x2 may dalawang module at isang resource value.

Ilang sandali:

  • Ang script ng transaksyon ay atomic - ito ay ganap na naisakatuparan o hindi.
  • Ang module ay isang mahabang buhay na piraso ng code na naa-access sa buong mundo.
  • Ang pandaigdigang estado ay nakaayos bilang isang hash table, kung saan ang susi ay ang address ng account
  • Ang mga account ay maaaring maglaman ng hindi hihigit sa isang resource value ng isang partikular na uri at hindi hihigit sa isang module na may ibinigay na pangalan (account sa 0x0 hindi maaaring maglaman ng karagdagang mapagkukunan 0x0.Currency.Coin o ibang module na pinangalanan Pera)
  • Ang address ng ipinahayag na module ay bahagi ng uri (0x0.Currency.Coin ΠΈ 0x1.Currency.Coin ay magkahiwalay na mga uri na hindi maaaring palitan ng gamit)
  • Maaaring mag-imbak ang mga programmer ng maraming pagkakataon ng ganitong uri ng mapagkukunan sa isang account sa pamamagitan ng pagtukoy sa kanilang custom na mapagkukunan - (mapagkukunan TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Maaari kang sumangguni sa isang mapagkukunan sa pamamagitan ng pangalan nito nang walang mga salungatan, halimbawa maaari kang sumangguni sa dalawang mapagkukunan gamit TwoCoins.c1 ΠΈ TwoCoins.c2.

Anunsyo ng mapagkukunan ng barya

Sumisid sa Move - Libra blockchain programming language ng Facebook
Pinangalanan ang module Pera at isang uri ng mapagkukunan na pinangalanan Barya

Ilang sandali:

  • Barya ay isang istraktura na may isang larangan ng uri u64 (64-bit unsigned integer)
  • Mga pamamaraan ng module lamang Pera maaaring lumikha o makasira ng mga halaga ng uri Barya.
  • Ang ibang mga module at script ay maaari lamang sumulat o sumangguni sa value field sa pamamagitan ng mga pampublikong pamamaraan na ibinigay ng module.

Pagbebenta ng deposito

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ang pamamaraang ito ay tumatanggap ng isang mapagkukunan Barya bilang input at pinagsama ito sa mapagkukunan Baryanaka-imbak sa account ng tatanggap:

  1. Pagsira sa input resource Coin at pagtatala ng halaga nito.
  2. Pagtanggap ng link sa isang natatanging mapagkukunan ng Coin na nakaimbak sa account ng tatanggap.
  3. Pagbabago ng halaga ng bilang ng mga Coins sa pamamagitan ng halagang ipinasa sa parameter kapag tumatawag sa pamamaraan.

Ilang sandali:

  • I-unpack, BorrowGlobal - mga built-in na pamamaraan
  • I-unpack Ito ang tanging paraan upang tanggalin ang isang mapagkukunan ng uri T. Ang pamamaraan ay kumukuha ng isang mapagkukunan bilang input, sinisira ito, at ibinabalik ang halaga na nauugnay sa mga patlang ng mapagkukunan.
  • BorrowGlobal kumukuha ng address bilang input at nagbabalik ng reference sa isang natatanging instance ng T na na-publish (pagmamay-ari) ng address na iyon
  • &mut Coin ito ay isang link sa mapagkukunan Barya

Pagpapatupad ng withdraw_from_sender

Sumisid sa Move - Libra blockchain programming language ng Facebook

Ang pamamaraang ito:

  1. Nakakakuha ng link sa isang natatanging mapagkukunan Barya, naka-link sa account ng nagpadala
  2. Pinapababa ang halaga ng isang mapagkukunan Barya sa pamamagitan ng link para sa tinukoy na halaga
  3. Lumilikha at nagbabalik ng bagong mapagkukunan Barya na may na-update na balanse.

Ilang sandali:

  • Deposito maaaring sanhi ng sinuman, ngunit mag-withdraw_from_sender mayroon lamang access sa mga barya ng account sa pagtawag
  • GetTxnSenderAddress kapareho ng msg.sender sa Solidity
  • TanggihanUnless kapareho ng mangailangan sa Solidity. Kung nabigo ang pagsusuring ito, ihihinto ang transaksyon at ibabalik ang lahat ng pagbabago.
  • Pack isa rin itong built-in na pamamaraan na lumilikha ng bagong mapagkukunan ng uri T.
  • Pati na rin ang I-unpack, Pack matatawag lamang sa loob ng modyul kung saan inilalarawan ang mapagkukunan T

Konklusyon

Sinuri namin ang mga pangunahing katangian ng Move language, inihambing ito sa Ethereum, at naging pamilyar din sa pangunahing syntax ng mga script. Sa wakas, lubos kong inirerekumenda ang pag-check out orihinal na puting papel. Kabilang dito ang maraming detalye tungkol sa mga prinsipyo ng disenyo ng programming language, pati na rin ang maraming kapaki-pakinabang na link.

Pinagmulan: www.habr.com

Magdagdag ng komento