Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Sonra, Move dilinin əsas xüsusiyyətlərini və ağıllı müqavilələr üçün digər populyar dildən - Solidity (Ethereum platformasında) ilə əsas fərqlərini nədən ibarət olduğunu ətraflı şəkildə nəzərdən keçirəcəyik. Material, mövcud 26 səhifəlik ağ kağızın araşdırılmasına əsaslanır.

Giriş

Move istifadəçi əməliyyatlarını və ağıllı müqavilələri yerinə yetirmək üçün istifadə olunan icra edilə bilən bayt kodu dilidir. İki nöqtəyə diqqət yetirin:

  1. Move, birbaşa Move virtual maşınında icra oluna bilən bir bayt kod dilidir, Solidity (Ethereumun ağıllı müqavilə dili) bir EVM-də (Ethereum Virtual Maşın) icra edilməzdən əvvəl baytodda tərtib edilmiş daha yüksək səviyyəli bir dildir.
  2. Move yalnız ağıllı müqavilələr həyata keçirmək üçün deyil, həm də xüsusi əməliyyatlar üçün də istifadə edilə bilər (bu barədə daha sonra), Solidity isə yalnız ağıllı müqaviləyə əsaslanan bir dildir.


Tərcümə INDEX Protocol layihə komandası tərəfindən həyata keçirilib. Əvvəllər tərcümə etmişik Tərəzi layihəsini təsvir edən əla material, indi Move dilini daha yaxından nəzərdən keçirməyin vaxtıdır. Tərcümə habrauzerlə birlikdə aparılmışdır sərin

Move-un əsas xüsusiyyəti xətti məntiqə əsaslanan semantika ilə xüsusi resurs növlərini müəyyən etmək imkanıdır: resurs heç vaxt kopyalana bilməz və ya dolayısı ilə silinə bilməz, yalnız köçürülə bilər. Funksional olaraq bu, Rust dilinin xüsusiyyətlərinə bənzəyir. Rust-dakı dəyərlər eyni anda yalnız bir ada təyin edilə bilər. Başqa bir ada dəyər təyin etmək onu əvvəlki adla əlçatmaz edir.

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Məsələn, aşağıdakı kod parçası səhv salacaq: Daşınan 'x' dəyərinin istifadəsi. Bunun səbəbi, Rustdə zibil yığımının olmamasıdır. Dəyişənlər əhatə dairəsindən çıxdıqda, istinad etdikləri yaddaş da azad olur. Sadəcə olaraq, məlumatların yalnız bir "sahibi" ola bilər. Bu nümunədə x sonra orijinal sahibidir y yeni sahibi olur. Bu davranış haqqında daha çox oxuyun..

Rəqəmsal aktivlərin açıq sistemlərdə təmsil olunması

Rəqəmsal olaraq təqdim etmək çətin olan iki fiziki varlıq var:

  • Nadirlik (Qıtlıq, əslində qıtlıq). Sistemdəki aktivlərin sayı (emissiya) nəzarət edilməlidir. Mövcud aktivlərin təkrarlanması qadağan edilməlidir və yeniləri yaratmaq imtiyazlı bir əməliyyatdır.
  • Giriş nəzarəti... Sistem iştirakçısı, giriş nəzarəti siyasətlərindən istifadə edərək aktivləri qorumağı bacarmalıdır.

Fiziki varlıqlar üçün təbii olan bu iki xüsusiyyət rəqəmsal obyektlər üçün tətbiq edilməlidir ki, əgər onları varlıq hesab edək. Məsələn, nadir bir metalın təbii çatışmazlığı var və buna yalnız siz daxil ola bilərsiniz (məsələn, əlinizdə tutaraq) və sata və ya xərcləyə bilərsiniz.

Bu iki mülkə necə gəldiyimizi göstərmək üçün aşağıdakı cümlələrlə başlayaq:

Təklif # 1: Qıtlıq və Giriş Nəzarəti Olmayan Ən Sadə Qayda

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

  • G [K]: = n açarla əldə edilə bilən bir nömrənin yenilənməsini bildirir К yeni bir məna ilə qlobal blockchain vəziyyətində n.
  • əməliyyat l Alice, 100⟩ Alice'in hesab balansını 100 olaraq təyin etmək deməkdir.

Yuxarıdakı həll bir neçə əsas problemə malikdir:

  • Alice sadəcə göndərməklə sınırsız sayda sikkə ala bilər əməliyyat "Alice, 100".
  • Alicein Boba göndərdiyi sikkələr faydasızdır, çünki Bob eyni texnikadan istifadə edərək sınırsız sayda sikkə göndərə bilər.

Təklif # 2: Açığı nəzərə alaraq

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

İndi vəziyyəti izləyirik ki, sikkələrin sayı çox olsun Ka heç olmasa bərabər idi n köçürmə əməliyyatından əvvəl. Ancaq bu, qıtlıq problemini həll etsə də, Alisin sikkələrini kimin göndərə biləcəyi haqqında heç bir məlumat yoxdur (hələlik bunu hər kəs edə bilər, əsas odur ki, məbləği məhdudlaşdırmaq qaydasını pozmayın).

Təklif # 3: Qıtlıq və giriş nəzarətinin birləşdirilməsi

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Bu problemi rəqəmsal imza mexanizmi ilə həll edirik təsdiq_sig balansı yoxlamadan əvvəl, yəni Alice əməliyyatı imzalamaq və sikkələrinin sahibi olduğunu təsdiq etmək üçün şəxsi açarından istifadə edir.

Blockchain proqramlaşdırma dilləri

Mövcud blockchain dilləri aşağıdakı problemlərlə üzləşir (hamısı Move -da həll edildi (qeyd: Təəssüf ki, məqalənin müəllifi yalnız Ethereum -a müraciət edərkən müraciət edir, buna görə də bunları yalnız bu çərçivədə götürməyə dəyər. Məsələn, aşağıdakıların çoxu EOS -da həll olunur.)):

Aktivlərin dolayı təmsil olunması. Aktiv tam ədəddən istifadə etməklə kodlaşdırılır, lakin tam ədəd dəyəri aktivlə eyni deyil. Əslində, bitcoin / eter / <Hər Sikkə> təmsil edən heç bir növ və ya dəyər yoxdur! Bu, aktivlərdən istifadə edən proqramların yazılmasını çətinləşdirir və xətaya meyilli edir. Prosedurlara/prosedurlardan aktivlərin ötürülməsi və ya strukturlarda aktivlərin saxlanması kimi nümunələr dildən xüsusi dəstək tələb edir.

Açığı genişləndirmək mümkün deyil... Dil yalnız bir çatışmazlığı ifadə edir. Bundan əlavə, qıtlığa qarşı vasitələr birbaşa dilin özünün semantikasına daxil edilir. Geliştirici, xüsusi bir varlıq yaratmaq istəsə, mənbənin bütün aspektlərini diqqətlə nəzarət etməlidir. Bunlar Ethereum ağıllı müqavilələrinin problemidir.

İstifadəçilər, həm dəyəri, həm də ümumi tədarükü təyin etmək üçün tam ədədlərdən istifadə edərək aktivlərini, ERC-20 tokenlərini buraxırlar. Yeni ayələr yaradıldıqda, ağıllı müqavilə kodu, emissiya qaydalarına uyğunluğu müstəqil olaraq yoxlamalıdır. Bundan əlavə, aktivlərin dolayı yolla təqdim edilməsi bəzi hallarda ciddi səhvlərə gətirib çıxarır - təkrarlama, ikiqat xərcləmə və ya hətta aktivlərin tamamilə itirilməsi.

Çevik giriş nəzarətinin olmaması... Bu gün istifadə olunan yeganə giriş nəzarət siyasəti asimmetrik kriptoqrafiyadan istifadə edən bir imza sxemidir. Qıtlığın qorunması kimi, girişə nəzarət siyasəti də dilin semantikasına dərindən daxil edilmişdir. Proqramçıların öz giriş nəzarət siyasətlərini təyin etmələrinə imkan vermək üçün dili necə genişləndirmək çox vaxt çətin bir işdir.

Bu, ağıllı müqavilələrin girişə nəzarət üçün kriptoqrafiya üçün yerli dəstəyi olmadığı Ethereum üçün də doğrudur. Tərtibatçılar giriş nəzarətini əl ilə yazmalıdır, məsələn, onlyOwner dəyişdiricisindən istifadə etməklə.

Ethereum-un böyük bir pərəstişkarı olsam da, inanıram ki, aktiv xassələri təhlükəsizlik baxımından dil tərəfindən yerli olaraq dəstəklənməlidir. Xüsusilə, Ether-in ağıllı müqaviləyə ötürülməsi dinamik göndərməyə imkan verir ki, bu da yenidən giriş zəiflikləri kimi tanınan yeni səhvlər sinfini təqdim edir. Burada dinamik göndərmə o deməkdir ki, kodun icrası məntiqi tərtib zamanı (statik) deyil, icra zamanı (dinamik) müəyyən ediləcək.

Beləliklə, Solidity-də, A müqaviləsi B müqaviləsinin funksiyasını çağırdıqda, B müqaviləsi A müqaviləsinin tərtibçisi tərəfindən nəzərdə tutulmayan kodu işlədə bilər və bu, yenidən giriş zəiflikləri (qalıqlar faktiki hesabdan çıxılmazdan əvvəl A müqaviləsi təsadüfən pul çıxarmaq üçün B müqaviləsi kimi çıxış edir).

Move Language Design Fundamentals

Birinci dərəcəli qaynaqlar

Yüksək səviyyədə, Move dilində modullar / qaynaqlar / prosedurlar arasındakı qarşılıqlı əlaqə, OOP dillərindəki siniflər / obyektlər və metodlar arasındakı əlaqəyə çox bənzəyir.
Move modulları digər blockchainlərdəki ağıllı müqavilələrə bənzəyir. Modul, elan edilmiş mənbələrin yaradılması, məhv edilməsi və yenilənməsi qaydalarını təyin edən resurs növləri və prosedurları elan edir. Ancaq bunların hamısı konvensiyalardır ("jargon") Hərəkətdə. Bu fikri bir az sonra izah edəcəyik.

Esneklik

Move skript vasitəsilə Tərəziyə çeviklik əlavə edir. Tərəzidə hər bir əməliyyat əslində əməliyyatın əsas proseduru olan bir skript ehtiva edir. Skript ya müəyyən edilmiş bir hərəkəti yerinə yetirə bilər, məsələn, müəyyən edilmiş alıcılar siyahısına ödənişlər edə bilər və ya ümumi məntiqi müəyyən edən proseduru çağırmaqla digər resurslardan təkrar istifadə edə bilər. Buna görə Move əməliyyat skriptləri çox rahatlıq təklif edir. Skript həm birdəfəlik, həm də təkrarlanan davranışlardan istifadə edə bilər, Ethereum isə yalnız təkrarlanan skriptləri icra edə bilər (tək ağıllı müqavilə metodunu çağırır). Bunun "təkrarlanan" adlandırılmasının səbəbi, ağıllı müqavilə funksiyalarının bir neçə dəfə icra oluna bilməsidir. (Qeyd: burada an çox incədir. Bir tərəfdən Bitcoin-də psevdobayt kod şəklində əməliyyat skriptləri var. Digər tərəfdən, mənim başa düşdüyüm kimi, Move bu dili, əslində, tam hüquqlu ağıllı müqavilə dili səviyyəsinə qədər genişləndirir.).

təhlükəsizlik

Move icra edilə bilən formatı bayt kodudur, bir tərəfdən assemblerdən daha yüksək səviyyəli dildir, lakin mənbə kodundan daha aşağı səviyyəli dildir. Bayt kodu bayt kodu yoxlayıcısından istifadə etməklə resurslar, növlər və yaddaş təhlükəsizliyi üçün işləmə müddətində (zəncirdə) yoxlanılır və sonra tərcüməçi tərəfindən yerinə yetirilir. Bu yanaşma Move-a mənbə kodunun təhlükəsizliyini təmin etməyə imkan verir, lakin kompilyasiya prosesi və sistemə kompilyator əlavə etmək ehtiyacı olmadan. Move-u bayt kodu dili etmək həqiqətən yaxşı fikirdir. Mənbədən tərtib etmək lazım deyil, Solidity vəziyyətində olduğu kimi, kompilyator infrastrukturuna mümkün uğursuzluqlar və ya hücumlar barədə narahat olmağa ehtiyac yoxdur.

Doğrulama

Biz yoxlamaları mümkün qədər asanlaşdırmağa çalışırıq, çünki hər şey zəncirvari şəkildə gedir (qeyd: hər bir əməliyyatın icrası zamanı onlayn olaraq hər hansı bir gecikmə bütün şəbəkənin yavaşlamasına səbəb olur), lakin əvvəlcə dil dizaynı zəncirdənkənar statik yoxlama vasitələrindən istifadə etməyə hazırdır. Baxmayaraq ki, bu daha çox üstünlük təşkil edir, doğrulama vasitələrinin inkişafı (ayrıca alətlər dəsti kimi) gələcək üçün təxirə salınıb və hazırda yalnız iş vaxtında dinamik yoxlama (zəncirdə) dəstəklənir.

Modulluq

Move modulları məlumatların çıxarılmasını təmin edir və mənbələr üzərində kritik əməliyyatları lokallaşdırır. Modul tərəfindən təmin edilən inkapsulyasiya, Move tipli sistem tərəfindən təmin edilən qorunma ilə birlikdə, modul tiplərində təyin olunan xüsusiyyətlərin modul xaricindəki kodla pozulmamasını təmin edir. Bu, kifayət qədər yaxşı düşünülmüş bir abstraksiya dizaynıdır, yəni müqavilənin içindəki məlumatların yalnız müqavilə çərçivəsində dəyişə biləcəyini, ancaq xaricində deyil.

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Baxışa keçin

Əməliyyat skript nümunəsi göstərir ki, bir proqramçı tərəfindən moduldan kənarda edilən zərərli və ya ehtiyatsız hərəkətlər modul mənbələrinin təhlükəsizliyini poza bilməz. Bundan sonra, Libra blokçainini proqramlaşdırmaq üçün modulların, mənbələrin və prosedurların necə istifadə edildiyinə dair nümunələrə baxacağıq.

Peer-to-Peer ödənişləri

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Məbləğdə göstərilən sikkələrin sayı göndərənin balansından alıcıya köçürüləcək.
Burada bir neçə yeni məqam var (qırmızı yazılarla vurğulanıb):

  • 0x0: modulun saxlandığı hesabın ünvanı
  • Valyuta: modul adı
  • Sikkə: resurs növü
  • Prosedurla qaytarılmış sikkə dəyəri, 0x0.Currency.Coin tipli bir qaynaq dəyəridir
  • hərəkət et (): dəyər yenidən istifadə edilə bilməz
  • nüsxə (): dəyər sonra istifadə edilə bilər

Kodu təhlil edin: ilk addımda göndərən adlı proseduru çağırır Göndərəndən geri çəkin saxlanılan bir moduldan 0x0.Valyuta. İkinci addımda, göndərici sikkə resursunun dəyərini modulun depozit proseduruna köçürməklə pulu alıcıya köçürür. 0x0.Valyuta.

Çeklərlə rədd ediləcək koddakı səhvlərin üç nümunəsi bunlardır:
Zəngi dəyişdirərək pulu təkrarlayın hərəkət (sikkə) haqqında surət (sikkə). Resurslar yalnız köçürülə bilər. Resursun miqdarını təkrarlamağa cəhd etmək (məsələn, zəng etməklə surət (sikkə) yuxarıdakı nümunədə) bayt kodunu yoxlayarkən bir səhvlə nəticələnəcək.

Müəyyən etməklə vəsaitlərin təkrar istifadəsi hərəkət (sikkə) iki dəfə . Xəttin əlavə edilməsi 0x0.Currency.deposit(surəti (bəzi_digər_ödəyici), köçürmə(coin)) Yuxarıdakı nümunə göndərənə sikkələri iki dəfə "xərcləməyə" imkan verəcək - birinci dəfə alıcı ilə, ikinci dəfə isə başqa_alıcı. Bu, fiziki aktivlə mümkün olmayan arzuolunmaz davranışdır. Xoşbəxtlikdən, Move bu proqramı rədd edəcək.

İnkar səbəbindən vəsait itkisi hərəkət (sikkə). Mənbəni köçürməsəniz (məsələn, ehtiva edən xətti silməklə hərəkət (sikkə)), bayt kodu doğrulama xətası qaldırılacaq. Bu, Move proqramçılarını təsadüfi və ya zərərli vəsait itkisindən qoruyur.

Valyuta modulu

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Hər bir hesabda 0 və ya daha çox modul (qutu kimi təsvir olunur) və bir və ya daha çox resurs dəyəri (silindr kimi təsvir olunur) ola bilər. Məsələn, bir hesab 0x0 modulu ehtiva edir 0x0.Valyuta və növün resurs dəyəri 0x0.Currency.Coin. Ünvanda hesab 0x1 iki resurs və bir modul var; Ünvanda hesab 0x2 iki modul və bir resurs dəyəri var.

Nekotory anlar:

  • Əməliyyat skripti atomikdir - ya tamamilə yerinə yetirilir, ya da ümumiyyətlə deyil.
  • Modul qlobal səviyyədə mövcud olan uzunömürlü kod parçasıdır.
  • Qlobal vəziyyət hesab ünvanı əsas olduğu bir hash cədvəli kimi qurulmuşdur
  • Hesablar müəyyən bir növün birdən çox resurs dəyərini və verilmiş ada malik birdən çox modulu ehtiva edə bilməz. 0x0 əlavə resurs ehtiva edə bilməz 0x0.Currency.Coin və ya adlı başqa bir modul Valyuta)
  • Elan edilmiş modulun ünvanı növün bir hissəsidir (0x0.Currency.Coin и 0x1.Currency.Coin bir-birini əvəz edə bilməyən ayrı növlərdir)
  • Proqramçılar öz xüsusi resursunu təyin etməklə, müəyyən resurs növünün bir neçə nümunəsini hesabda saxlaya bilərlər - (resurs TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Siz mənbəyə ziddiyyət olmadan adı ilə müraciət edə bilərsiniz, məsələn, istifadə edərək iki resursa müraciət edə bilərsiniz TwoCoins.c1 и TwoCoins.c2.

Sikkə resursu bəyannaməsi

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın
Adlandırılmış Modul Valyuta və adlı resurs növü Sikkə

Nekotory anlar:

  • Sikkə bir tip sahəsi olan strukturdur u64 (64 bit işarəsiz tam ədəd)
  • Yalnız modul prosedurları Valyuta tipli dəyərlər yarada və ya məhv edə bilər Sikkə.
  • Digər modullar və skriptlər yalnız modulun təqdim etdiyi ictimai prosedurlar vasitəsilə dəyər sahəsinə yaza və ya istinad edə bilər.

Depozitin həyata keçirilməsi

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Bu prosedur resursu qəbul edir Sikkə giriş kimi və onu resursla əlaqələndirir Sikkəbenefisiarın hesabında saxlanılır:

  1. Coin giriş resursunun məhv edilməsi və dəyərinin yazılması.
  2. Alıcının hesabında saxlanılan unikal Coin resursuna keçid əldə etmək.
  3. Proseduru çağırarkən Sikkələrin sayının parametrdə verilən dəyərlə dəyişdirilməsi.

Nekotory anlar:

  • Paketdən çıxarın, BorrowGlobal - daxili prosedurlar
  • Paketdən çıxarın bu, T tipli resursu silməyin yeganə yoludur. Prosedur resursu giriş kimi qəbul edir, onu məhv edir və resursun sahələri ilə əlaqəli dəyəri qaytarır.
  • BorrowGlobal giriş kimi ünvanı qəbul edir və həmin ünvan tərəfindən dərc edilmiş (sahibi) T-nin unikal nümunəsinə istinad qaytarır
  • &mut Coin bu mənbəyə keçiddir Sikkə

geri_göndərən_from həyata keçirilir

Facebook-un Libra Blockchain Proqramlaşdırma Dili olan Move-a dalın

Bu prosedur:

  1. Unikal mənbəyə keçid əldə edir Sikkə, göndərənin hesabı ilə əlaqələndirilir
  2. Resursun dəyərini azaldır Sikkə müəyyən edilmiş məbləğə istinadla
  3. Yeni resurs yaradır və qaytarır Sikkə yenilənmiş balansla.

Nekotory anlar:

  • Əmanət hər kəs zəng edə bilər, lakin Göndərəndən geri çəkin yalnız zəng edən hesabın sikkələrinə çıxışı var
  • GetTxnSenderAddress oxşar msg.sender Möhkəmlikdə
  • Rədd etmə oxşar tələb Möhkəmlikdə. Bu yoxlama uğursuz olarsa, əməliyyatın icrası dayandırılır və bütün dəyişikliklər geri qaytarılır.
  • paket həm də T tipli yeni resurs yaradan daxili prosedurdur.
  • Eləcə də Paketdən çıxarın, paket yalnız resursun elan olunduğu modul daxilində çağırıla bilər T

Nəticə

Biz Move dilinin əsas xüsusiyyətlərini təhlil etdik, onu Ethereum ilə müqayisə etdik, həmçinin skriptlərin əsas sintaksisi ilə tanış olduq. Nəhayət, gözdən keçirməyi çox tövsiyə edirəm orijinal ağ kağız. Buraya proqramlaşdırma dilinin dizayn prinsipləri haqqında bir çox təfərrüatlar, eləcə də bir çox faydalı bağlantılar daxildir.

Mənbə: www.habr.com

Добавить комментарий