Move'a Dalın - Facebook'un Libra blockchain programlama dili

Daha sonra, Move dilinin temel özelliklerini ve akıllı sözleşmeler için zaten popüler olan başka bir dil olan Solidity (Ethereum platformunda) ile olan temel farklarını ayrıntılı olarak ele alacağız. Materyal, mevcut çevrimiçi 26 sayfalık teknik incelemeye dayanmaktadır.

Giriş

Move, kullanıcı işlemlerini ve akıllı sözleşmeleri yürütmek için kullanılan yürütülebilir bir bayt kodu dilidir. Lütfen iki noktaya dikkat edin:

  1. Move, Move sanal makinesinde doğrudan çalıştırılabilen bir bayt kodu dili olsa da, Solidity (Ethereum'un akıllı sözleşme dili), bir EVM'de (Ethereum Sanal Makinesi) yürütülmeden önce bayt koduna derlenen daha yüksek seviyeli bir dildir.
  2. Move, yalnızca akıllı sözleşmeleri uygulamak için değil, aynı zamanda özel işlemler için de kullanılabilir (bundan sonra daha fazlası), Solidity yalnızca akıllı sözleşme dilidir.


Çeviri INDEX Protokolü proje ekibi tarafından gerçekleştirildi. Zaten tercüme ettik Libra projesini anlatan büyük materyal, şimdi Move diline biraz daha detaylı bakmanın zamanı geldi. Çeviri Habrauser ile ortaklaşa gerçekleştirildi coolsiu

Move'un önemli bir özelliği, özel kaynak türlerini doğrusal mantığa dayalı anlambilimle tanımlama yeteneğidir: bir kaynak hiçbir zaman kopyalanamaz veya örtülü olarak silinemez, yalnızca taşınır. İşlevsel olarak bu, Rust dilinin yeteneklerine benzer. Rust'ta değerler aynı anda yalnızca bir isme atanabilir. Bir değerin farklı bir isme atanması, o değerin önceki isimle kullanılamamasına neden olur.

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Örneğin, aşağıdaki kod parçası bir hata verecektir: Taşınan 'x' değerinin kullanımı. Bunun nedeni, Rust'ta çöp toplama olmamasıdır. Değişkenler kapsam dışına çıktığında, başvurdukları bellek de serbest bırakılır. Basitçe söylemek gerekirse, verilerin yalnızca bir "sahibi" olabilir. Bu örnekte x asıl sahibidir ve daha sonra y yeni sahibi olur. Bu davranış hakkında daha fazlasını buradan okuyun.

Açık sistemlerde dijital varlıkların temsili

Dijital olarak temsil edilmesi zor olan fiziksel varlıkların iki özelliği vardır:

  • enderlik (Kıtlık, aslen kıtlık). Sistemdeki varlık (emisyon) sayısı kontrol edilmelidir. Mevcut varlıkların çoğaltılması yasaklanmalıdır ve yenilerini oluşturmak ayrıcalıklı bir işlemdir.
  • Giriş kontrolu... Sistem katılımcısı, erişim kontrol ilkelerini kullanarak varlıkları koruyabilmelidir.

Fiziksel varlıklar için doğal olan bu iki özelliğin, varlık olarak değerlendirilmesini istiyorsak dijital nesneler için de uygulanması gerekir. Örneğin, nadir bir metalin doğal bir kıtlığı vardır ve ona yalnızca sizin erişiminiz vardır (örneğin elinizde tutarak) ve onu satabilir veya harcayabilirsiniz.

Bu iki özelliğe nasıl ulaştığımızı göstermek için aşağıdaki cümlelerle başlayalım:

Öneri 1: Kıtlık ve Erişim Kontrolü Olmadan En Basit Kural

Move'a Dalın - Facebook'un Libra blockchain programlama dili

  • G [K]: = n bir anahtarla erişilebilen bir numaraya yapılan güncellemeyi belirtir К blok zincirinin küresel durumunda, yeni bir anlamla n.
  • işlem ⟨Alice, 100⟩ Alice'in hesap bakiyesini 100'e ayarlamak anlamına gelir.

Yukarıdaki çözümün birkaç önemli sorunu vardır:

  • Alice, sadece göndererek sınırsız sayıda jeton alabilir. işlem ⟨Alice, 100⟩.
  • Alice'in Bob'a gönderdiği paralar işe yaramaz, çünkü Bob aynı tekniği kullanarak kendisine sınırsız sayıda jeton gönderebilir.

Öneri # 2: Açığı hesaba katmak

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Şimdi durumu izliyoruz, böylece jeton sayısı Ka en azından eşitti n transfer işleminden önce. Ancak bu, kıtlık sorununu çözerken, Alice'in paralarını kimin gönderebileceğine dair bir bilgi yok (şimdilik bunu herkes yapabilir, asıl mesele miktar sınırlama kuralını ihlal etmemek).

Öneri # 3: Kıtlık ve erişim kontrolünü birleştirmek

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Bu sorunu dijital imza mekanizmasıyla çözüyoruz doğrulama_sig Bakiyeyi kontrol etmeden önce, bu, Alice'in işlemi imzalamak ve madeni paralarının sahibi olduğunu onaylamak için özel anahtarını kullandığı anlamına gelir.

Blockchain programlama dilleri

Mevcut blockchain dilleri aşağıdaki problemlerle karşı karşıyadır (hepsi Move'da çözülmüştür (not: Ne yazık ki makalenin yazarı karşılaştırmalarında sadece Ethereum'a hitap ediyor, bu yüzden onları sadece bu bağlamda almaya değer. Örneğin, aşağıdakilerin çoğu da EOS'ta çözülmüştür.))):

Varlıkların dolaylı temsili. Bir varlık bir tam sayı kullanılarak kodlanır ancak bir tam sayı, bir varlıkla aynı şey değildir. Aslında Bitcoin/Ether/<Herhangi Bir Coin>'i temsil eden bir tür veya değer yoktur! Bu, varlıkları kullanan programların yazılmasını zorlaştırır ve hataya açık hale getirir. Varlıkların prosedürlere/prosedürlerden aktarılması veya varlıkların yapılar içinde saklanması gibi kalıplar, dilden özel destek gerektirir.

Açık genişletilemez... Dil yalnızca bir kıt varlığı temsil eder. Ek olarak, kıtlığa karşı çareler doğrudan dilin semantiğine bağlıdır. Geliştirici, özel bir varlık oluşturmak istiyorsa, kaynağın tüm yönlerini dikkatli bir şekilde kontrol etmelidir. Bunlar tam olarak Ethereum akıllı sözleşmelerinin sorunlarıdır.

Kullanıcılar, hem değeri hem de toplam arzı belirlemek için tamsayıları kullanarak varlıklarını, ERC-20 belirteçlerini yayınlar. Yeni jetonlar oluşturulduğunda, akıllı sözleşme kodunun emisyon kurallarına uygunluğu bağımsız olarak doğrulaması gerekir. Ek olarak, varlıkların dolaylı sunumu, bazı durumlarda ciddi hatalara yol açar - tekrarlama, çift harcama ve hatta varlıkların tamamen kaybolması.

Esnek erişim kontrolünün olmaması... Bugün kullanılan tek erişim kontrol politikası, asimetrik kriptografi kullanan bir imza şemasıdır. Kıtlık koruması gibi, erişim denetimi politikaları da dilin anlambilimine derinden gömülüdür. Ancak dilin, programcıların kendi erişim kontrol politikalarını tanımlamalarına izin verecek şekilde nasıl genişletileceği genellikle çok zor bir iştir.

Bu aynı zamanda akıllı sözleşmelerin erişim kontrolü için yerel kriptografi desteğine sahip olmadığı Ethereum için de geçerlidir. Geliştiricilerin, örneğin onlyOwner değiştiricisini kullanarak erişim kontrolünü manuel olarak ayarlaması gerekir.

Her ne kadar Ethereum'un büyük bir hayranı olsam da varlık özelliklerinin güvenlik amacıyla dil tarafından yerel olarak desteklenmesi gerektiğine inanıyorum. Özellikle, Ether'in akıllı bir sözleşmeye aktarılması, yeniden giriş güvenlik açıkları olarak bilinen yeni bir hata sınıfının ortaya çıkmasına neden olan dinamik gönderimi içerir. Buradaki dinamik dağıtım, kodun yürütme mantığının derleme zamanında (statik) değil, çalışma zamanında (dinamik) belirleneceği anlamına gelir.

Bu nedenle, Solidity'de, A sözleşmesi B sözleşmesindeki bir işlevi çağırdığında, B sözleşmesi A sözleşmesinin geliştiricisi tarafından amaçlanmayan bir kod çalıştırabilir ve bu da aşağıdakilerle sonuçlanabilir: yeniden giriş güvenlik açıkları (A sözleşmesi, hesap bakiyeleri gerçekten düşülmeden önce parayı çekmek için yanlışlıkla B sözleşmesi görevi görür).

Dil Tasarımının Temellerini Taşı

Birinci dereceden kaynaklar

Yüksek düzeyde, Move dilindeki modüller / kaynaklar / prosedürler arasındaki etkileşim, OOP dillerindeki sınıflar / nesneler ve yöntemler arasındaki ilişkiye çok benzer.
Hareket modülleri, diğer blok zincirlerdeki akıllı sözleşmelere benzer. Modül, beyan edilen kaynakları yaratma, yok etme ve güncelleme kurallarını tanımlayan kaynak türlerini ve prosedürlerini beyan eder. Ancak tüm bunlar sadece sözleşmelerdir (“jargon”) Hareket Halinde. Bu noktayı biraz sonra açıklayacağız.

Esneklik

Move, komut dosyası oluşturma yoluyla Libra'ya esneklik katar. Libra'daki her işlem, esasen işlemin temel prosedürü olan bir komut dosyası içerir. Komut dosyası, belirli bir eylemi (örneğin, belirli bir alıcı listesine ödeme yapmak) gerçekleştirebilir veya diğer kaynakları yeniden kullanabilir (örneğin, genel mantığın belirtildiği bir prosedürü çağırarak). Move işlem komut dosyalarının daha fazla esneklik sunmasının nedeni budur. Bir komut dosyası hem tek seferlik hem de tekrarlanan davranışları kullanabilirken, Ethereum yalnızca tekrarlanabilir komut dosyalarını çalıştırabilir (akıllı sözleşme yönteminde bir yöntemi çağırma). "Yeniden kullanılabilir" olarak adlandırılmasının nedeni, akıllı sözleşmenin işlevlerinin birden çok kez yürütülebilmesidir. (Not: Buradaki nokta çok incedir. Bir yandan Bitcoin'de sahte bayt kodu biçimindeki işlem komut dosyaları da mevcuttur. Öte yandan, anladığım kadarıyla Move bu dili aslında tam teşekküllü bir akıllı sözleşme dili seviyesine kadar genişletiyor).

güvenlik

Move yürütülebilir formatı bayt kodudur; bu, bir yandan montaj dilinden daha yüksek seviyeli bir dil, ancak kaynak kodundan daha düşük seviyeli bir dildir. Bayt kodu, bir bayt kodu doğrulayıcı kullanılarak kaynaklar, türler ve bellek güvenliği açısından çalışma zamanında (zincir üzerinde) kontrol edilir ve ardından yorumlayıcı tarafından yürütülür. Bu yaklaşım, Move'un kaynak kodun güvenliğini sağlamasına olanak tanır, ancak derleme süreci ve sisteme derleyici ekleme ihtiyacı yoktur. Move'u bayt kodu dili haline getirmek gerçekten iyi bir çözümdür. Solidity'de olduğu gibi kaynaktan derlenmesine gerek yoktur ve derleyici altyapısına gelebilecek olası arızalar veya saldırılar konusunda endişelenmenize gerek yoktur.

doğrulanabilirliği

Tüm bunlar zincir üzerinde yapıldığından kontrolleri mümkün olduğunca kolay gerçekleştirmeyi hedefliyoruz (not: çevrimiçi, her işlemin yürütülmesi sırasında, bu nedenle herhangi bir gecikme tüm ağın yavaşlamasına neden olur), ancak başlangıçta dil tasarımı zincir dışı statik doğrulama araçlarını kullanmaya hazırdır. Her ne kadar bu daha çok tercih edilse de, şimdilik doğrulama araçlarının (ayrı bir araç seti olarak) geliştirilmesi geleceğe ertelendi ve artık yalnızca çalışma zamanında (zincir üzerinde) dinamik doğrulama destekleniyor.

Modülerlik

Move modülleri, veri soyutlama sağlar ve kaynaklar üzerindeki kritik işlemleri yerelleştirir. Modül tarafından sağlanan kapsülleme, Move type sistemi tarafından sağlanan korumayla birleştiğinde, modülün türlerinde ayarlanan özelliklerin modülün dışındaki kodlar tarafından ihlal edilmemesini sağlar. Bu, oldukça iyi düşünülmüş bir soyutlama tasarımıdır, yani sözleşmenin içindeki verilerin yalnızca sözleşme çerçevesinde değişebileceği, ancak dışında değişemeyeceği anlamına gelir.

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Genel bakışı taşı

İşlem komut dosyası örneği, bir programcının bir modülün dışındaki kötü niyetli veya dikkatsiz eylemlerinin bir modülün kaynaklarının güvenliğini tehlikeye atamayacağını gösterir. Ardından, Libra blok zincirini programlamak için modüllerin, kaynakların ve prosedürlerin nasıl kullanıldığına dair örneklere bakacağız.

Eşler Arası ödemeler

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Tutar olarak belirtilen sayıda coin, gönderenin bakiyesinden alıcıya aktarılacaktır.
Burada birkaç yeni şey var (kırmızıyla vurgulanmıştır):

  • 0x0: modülün depolandığı hesabın adresi
  • Para birimi: Modül Adı
  • Sikke: kaynak tipi
  • Prosedür tarafından döndürülen jeton değeri, 0x0.Currency.Coin türünde bir kaynak değeridir.
  • hareket (): değer tekrar kullanılamaz
  • kopya (): değer daha sonra kullanılabilir

Kodu ayrıştırın: ilk adımda gönderen, geri çekme_from_sender depolanan bir modülden 0x0.Para Birimi. İkinci adımda gönderen, coinin kaynak değerini modülün yatırma prosedürüne taşıyarak parayı alıcıya aktarır. 0x0.Para Birimi.

Aşağıda, kontroller tarafından reddedilecek kod hatalarına ilişkin üç örnek verilmiştir:
Çağrıyı değiştirerek fonları çoğaltın hareket etmek (madeni para) üzerinde kopyalamak (madeni para). Kaynaklar yalnızca taşınabilir. Bir kaynağın bir miktarını çoğaltmaya çalışmak (örneğin, arayarak) kopyalamak (madeni para) yukarıdaki örnekte) bayt kodunu kontrol ederken bir hataya neden olacaktır.

Belirterek fonların yeniden kullanımı hareket etmek (madeni para) iki kere . Satır ekleme 0x0.Currency.deposit (kopyala (bir_diğer_payee), taşı (para)) örneğin, yukarıdakiler gönderenin paraları iki kez "harcamasına" olanak tanır; ilki alıcıyla ve ikincisi alıcıyla. some_other_payee. Bu, fiziksel bir varlıkla mümkün olmayan, istenmeyen bir davranıştır. Neyse ki Move bu programı reddedecek.

Reddetme nedeniyle para kaybı hareket etmek (madeni para). Kaynağı taşımazsanız (örneğin, içeren satırı silerek) hareket etmek (madeni para)), bir bayt kodu doğrulama hatası atılır. Bu, Move programcılarını kazara veya kötü niyetli fon kaybına karşı korur.

Para birimi modülü

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Her hesap 0 veya daha fazla modül (dikdörtgen olarak gösterilir) ve bir veya daha fazla kaynak değeri (silindir olarak gösterilir) içerebilir. Örneğin, bir hesap 0x0 modül içerir 0x0.Para Birimi ve kaynak türünün değeri 0x0.Currency.Coin. Adresteki hesap 0x1 iki kaynağı ve bir modülü vardır; Adresteki hesap 0x2 iki modüle ve bir kaynak değerine sahiptir.

Bazı anlar:

  • İşlem betiği atomiktir; ya tamamen yürütülür ya da hiç yürütülmez.
  • Modül, küresel olarak erişilebilen uzun ömürlü bir kod parçasıdır.
  • Küresel durum, anahtarın hesap adresi olduğu bir karma tablo olarak yapılandırılmıştır
  • Hesaplar, belirli bir türde birden fazla kaynak değeri ve belirli bir ada sahip birden fazla modül içeremez (şu adresteki hesap): 0x0 ek bir kaynak içeremez 0x0.Currency.Coin veya adlı başka bir modül Para birimi)
  • Bildirilen modülün adresi türün bir parçasıdır (0x0.Currency.Coin и 0x1.Currency.Coin birbirinin yerine kullanılamayan ayrı türlerdir)
  • Programcılar, özel kaynaklarını tanımlayarak bu tür bir kaynağın birden çok örneğini bir hesapta depolayabilir - (kaynak TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Bir kaynağa çakışma olmadan adıyla başvurabilirsiniz; örneğin, kullanarak iki kaynağa başvurabilirsiniz. TwoCoins.c1 и TwoCoins.c2.

Coin kaynağı duyurusu

Move'a Dalın - Facebook'un Libra blockchain programlama dili
Modül adı Para birimi ve adlı bir kaynak türü Sikke

Bazı anlar:

  • Sikke tek tip alanlı bir yapıdır u64 (64 bit işaretsiz tamsayı)
  • Yalnızca modül prosedürleri Para birimi türünde değerler oluşturabilir veya yok edebilir Sikke.
  • Diğer modüller ve komut dosyaları, değer alanına yalnızca modül tarafından sağlanan genel prosedürler aracılığıyla yazabilir veya referans verebilir.

Depozito satışı

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Bu prosedür bir kaynağı kabul eder Sikke girdi olarak kullanır ve onu kaynakla birleştirir Sikkealıcının hesabında saklanan:

  1. Giriş kaynağı Coin'in yok edilmesi ve değerinin kaydedilmesi.
  2. Alıcının hesabında saklanan benzersiz bir Coin kaynağına bağlantı alınması.
  3. Prosedür çağrılırken parametrede geçirilen değere göre Coin sayısının değerinin değiştirilmesi.

Bazı anlar:

  • Paketi açın, BorrowGlobal - yerleşik prosedürler
  • Paketi aç T türündeki bir kaynağı silmenin tek yolu budur. Prosedür, bir kaynağı girdi olarak alır, yok eder ve kaynağın alanlarıyla ilişkili değeri döndürür.
  • ÖdünçGlobal girdi olarak bir adres alır ve bu adres tarafından yayınlanan (sahip olunan) benzersiz bir T örneğine referans döndürür
  • &mut Coin bu kaynağa bir bağlantıdır Sikke

Draw_from_sender'ın uygulanması

Move'a Dalın - Facebook'un Libra blockchain programlama dili

Bu prosedür:

  1. Benzersiz bir kaynağa bağlantı alır Sikke, gönderenin hesabına bağlı
  2. Bir kaynağın değerini azaltır Sikke belirtilen miktar için bağlantı aracılığıyla
  3. Yeni bir kaynak oluşturur ve döndürür Sikke güncellenmiş bakiye ile.

Bazı anlar:

  • mevduat herkesten kaynaklanabilir ama geri çekme_from_sender yalnızca arayan hesabın paralarına erişebilir
  • GetTxnGönderenAdresi benzer msg.gönderen Sağlamlıkta
  • Reddet benzer gerektirir Sağlamlık'ta. Bu kontrol başarısız olursa işlem durdurulur ve tüm değişiklikler geri alınır.
  • Ambalaj aynı zamanda T tipinde yeni bir kaynak yaratan yerleşik bir prosedürdür.
  • Birlikte Paketi aç, Ambalaj yalnızca kaynağın tanımlandığı modülün içinde çağrılabilir T

Sonuç

Move dilinin temel özelliklerini inceledik, Ethereum ile karşılaştırdık ve ayrıca komut dosyalarının temel sözdizimine aşina olduk. Son olarak, kontrol etmenizi şiddetle tavsiye ederim orijinal beyaz kağıt. Programlama dili tasarım ilkelerine ilişkin birçok ayrıntının yanı sıra birçok yararlı bağlantı içerir.

Kaynak: habr.com

Yorum ekle