Starknet Gelişmiş Dilbilgisinin Tam Yorumu

Orijinal: Geliştirilmiş Starknet Sözdizimi

Çeviri ve redaksiyon: "Starknet Chinese Community"

Starknet'in gelişmiş gramerinin tam yorumu

genel bakış

Kahire derleyicisinin 2. sürümü, kodu daha açık ve güvenli hale getirmek için Starknet sözdiziminde değişiklikler sunar. Akıllı sözleşme genel arayüzü, özellikler kullanılarak tanımlanır ve depolamaya erişim, ContractState özelliği aracılığıyla yapılır. Özel yöntemler, genel arabirimden farklı bir uygulama ile tanımlanmalıdır. Olaylar artık numaralandırmalar olarak tanımlanıyor, burada her değişken aynı ada sahip bir yapı.

Feragatname: Burada kullanılan terimler, Kahire derleyicisinin farklı sürümlerine atıfta bulunur ve sözdizimi geçicidir, çünkü Starknet topluluğu hala en iyi terimin hangisi olduğunu tartışmaktadır. Belirlendikten sonra, bu makale buna göre güncellenecektir.

Derleyici v2

Daha geçen hafta, Kahire derleyicisinin yeni bir ana sürümü 2.0.0-rc0 Github'da yayınlandı. Yeni derleyici, Starknet eklentisinde önemli iyileştirmeler sağlayarak kodumuzu daha güvenli, daha açık ve daha tekrar kullanılabilir hale getiriyor. Derleyicinin bu yeni sürümünün, entegre ortamda halen üzerinde çalışıldığı için Starknet testnet veya mainnet üzerinde henüz desteklenmediğini unutmayın.

Bu makalenin amacı, Kahire derleyici sürüm 1.x için oluşturulan bir Starknet akıllı sözleşmesini, derleyici sürüm 2.x ile uyumlu bir akıllı sözleşmeye nasıl yeniden yazacağınızı göstermektir. Başlangıç noktamız, bir önceki yazıda oluşturulan ve Cario derleyici sürüm 1.x ile uyumlu Ownable akıllı sözleşmedir.

[contract] Mod Sahip Olunabilir {starknet::ContractAddress kullanın;starknet kullanın::get_caller_address;

[event] fn OwnershipTransferred(önceki_sahip: SözleşmeAdresi, yeni_sahip: SözleşmeAdresi) {}

yapı Depolama {sahip: SözleşmeAdresi}

[constructor] fn yapıcı() {dağıtıcıya izin ver = get_caller_address();owner::write(deployer);}

[view] fn get_owner() -> SözleşmeAdresi {sahip::oku()}

[external] fn aktarım_sahiplik(yeni_sahip: SözleşmeAdresi) {only_owner();önceki_sahip = sahip::oku();sahip::yazma(yeni_sahip);Sahiplik Aktarıldı(önceki_sahip, yeni_sahip) ;}

fn only_owner() {arayan = get_caller_address();assert(arayan == sahibi::oku(), 'Arayan, sahip değil');

Proje ayarları

Protostar henüz derleyici v2'yi desteklemediğinden, bu makale onu destekleyen Scarb ön sürümüne (sürüm 0.5.0-alpha.1) dayanacaktır. Scarb'ın söz konusu sürümünü kurmak için aşağıdaki komutu kullanabilirsiniz.

$ --proto '=https' --tlsv1.2 -sSf | bash -s -- -v 0.5.0-alpha.1

Yükleme tamamlandıktan sonra, doğru sürüme sahip olduğunuzu doğrulayın.

$ scarb --version>>>scarb 0.5.0-alpha.1 (546dad33d 2023-06-19)cairo:2.0.0-rc3()

Artık bir Scarb projesi oluşturulabilir.

$ Scarb yeni kahire1_v2$cdcairo1_v2

Aşağıdaki gibi bir klasör yapısı elde etmelisiniz.

$ ağacı .>>>.├── Scarb.toml└── src└──lib.cairo

Scarb'ın Starknet akıllı sözleşmelerini derlemesi için, Starknet eklentisinin bir bağımlılık olarak etkinleştirilmesi gerekir.

// Scarb.toml... [dependencies] starknet="2.0.0-rc3"

Kurulum tamamlandıktan sonra src/lib.cairo adresine giderek akıllı sözleşmeler yazmaya başlayabiliriz.

Depolama ve oluşturucu

Kahire derleyicisinin 2. sürümünde, akıllı sözleşmeler hala bir sözleşme özniteliğiyle açıklama eklenmiş modüller tarafından tanımlanmaktadır, yalnızca bu kez öznitelik, onu tanımlayan eklentinin, bu durumda starknet'in adını almıştır.

#[starknet::contract]Moda Sahip Olunabilir {}

Dahili depolama, yine de Depolama olarak adlandırılması gereken bir yapı olarak tanımlanır, ancak bu sefer bir depolama özniteliği ile açıklanması gerekir.

#[starknet::contract]mod Sahip Olunabilir {use super::ContractAddress; # [storage] yapı Depolama {sahibi: SözleşmeAdresi,

Kurucuyu tanımlamak için, v1'de yaptığımız gibi, işlevi yapıcı özelliği ile annotize ediyoruz, avantajı şu ki, işlev artık herhangi bir ada sahip olabilir, v1'deki gibi "yapıcı" olarak adlandırılmasına gerek yoktur. Zorunlu olmamakla birlikte, ben yine de işleve alışılmışın dışında bir "yapıcı" diyeceğim, ancak siz onu farklı şekilde arayabilirsiniz.

Diğer bir önemli değişiklik, şimdi yapıcının otomatik olarak değişkenleri depolamak için bir aracı görevi gören, bu durumda "sahip" olan ContractState'e bir referans iletmesidir.

#[starknet::contract]mod Sahip Olunabilir {use super::ContractAddress; # [storage] yapı Depolama {sahip: SözleşmeAdresi,} # [constructor] fn yapıcı(ref self: ContractState) {diployer = get_caller_address();self.owner.write(deployer);

Depolamayı yazma ve okuma sözdiziminin v1'den bu yana değiştiğini unutmayın. Owner::write() yapmadan önce, şimdi self.owner.write() yapıyoruz. Aynı durum bellekten okuma için de geçerlidir.

Bu arada, ContractState türünün manüel olarak kapsama getirilmesi gerekmez, başlangıca dahil edilmiştir.

Genel Yöntemler

Kahire derleyicisinin 1. versiyonundan önemli bir fark, artık starknet::interface özniteliği ile açıklamalı özellikleri kullanarak bir akıllı sözleşmenin genel arayüzünü açıkça tanımlamamız gerektiğidir.

starknet::ContractAddress'i kullanın;

#[starknet::interface]trait OwnableTrait { fn aktarım_sahiplik(kendi kendine referans: T, yeni_sahibi: SözleşmeAdresi); fn get_owner(self: @T) -> SözleşmeAdresi;}

#[starknet::contract]sahip olunan mod { ...}

v1'deki orijinal kodu hatırlarsanız, akıllı sözleşmemizin iki "genel" yöntemi (alma_sahibi ve aktarma_sahipliği) ve bir "özel" yöntemi (yalnızca_sahibi) vardır. Bu özellik yalnızca genel yöntemlerle ilgilenir ve hangi yöntemlerin sözleşmenin durumunu değiştirebileceğini ve hangi yöntemlerin değiştiremeyeceğini belirtmek için "harici" veya "görünüm" özniteliklerine dayanmaz. Bunun yerine, bu artık self parametresinin türü tarafından açık hale getirilmiştir.

Bir yöntem, bir SözleşmeStorage referansı gerektiriyorsa (bir kez uygulandığında genel T bunu yapar), bu yöntem akıllı sözleşmenin dahili durumunu değiştirebilir. Bu, "dış" bir yöntem olarak adlandırdığımız şeydir. Öte yandan, bir yöntem, ContractStorage'ın anlık görüntüsünü gerektiriyorsa, onu yalnızca okuyabilir, değiştiremez. Bu, "görüntüleme" yöntemi olarak adlandırdığımız şeydir.

Şimdi az önce impl anahtar kelimesini kullanarak tanımladığımız özellik için bir uygulama oluşturabiliriz. Unutmayın, Kahire, uygulamaların adları olması bakımından Rust'tan farklıdır.

starknet::ContractAddress'i kullanın;

#[starknet::interface]trait OwnableTrait { fn aktarım_sahiplik(kendi kendine referans: T, yeni_sahibi: SözleşmeAdresi); fn get_owner(self: @T) -> SözleşmeAdresi;}

#[starknet::contract]mod Sahip Olunabilir { ... #[external(v0)] impl OwnableImpl of super::OwnableTrait { fn aktarım_sahiplik(ref self: SözleşmeState, yeni_sahip: SözleşmeAdresi) { let önceki_sahip = self.sahibi.read(); self.owner.write(yeni_sahip); }

fn get_owner(self: @ContractState) -> SözleşmeAdresi { self.owner.read() }

Akıllı sözleşmeyi tanımlayan modülün içindeki özelliğimiz için bir uygulama oluşturuyoruz, ContractState türünü genel bir T türü olarak geçiriyoruz, böylece depolamaya bir oluşturucu gibi erişilebiliyor.

Uygulamamız, external(v0) özniteliğiyle açıklanmıştır. Nitelikteki sürüm 0, geçmişte olduğu gibi seçicinin yalnızca yöntem adından türetildiği anlamına gelir. Dezavantajı, akıllı sözleşmeniz için farklı bir özelliğin başka bir uygulamasını tanımlarsanız ve iki özellik yöntemlerinden biri için aynı adı kullanırsa, derleyicinin yinelenen seçici nedeniyle bir hata vermesidir.

Bu özelliğin gelecekteki bir sürümü, çakışmaları önlemek için seçicileri değerlendirmenin yeni bir yolunu ekleyebilir, ancak bu henüz çalışmıyor. Şu anda, harici özelliklerin yalnızca 0 sürümünü kullanabiliyoruz.

Özel Yöntemler

Ayrıca akıllı sözleşme için başka bir yöntem tanımlamamız gerekiyor, sadece_sahip. Bu yöntem, onu arayan kişinin akıllı sözleşmenin sahibi olup olmadığını kontrol eder.

Bu, dışarıdan çağrılmasına izin verilmeyen özel bir yöntem olduğundan, OwnableTrait'in (akıllı sözleşmenin genel arayüzü) bir parçası olarak tanımlanamaz. Bunun yerine, otomatik oluşturulan özelliğin yeni bir uygulamasını oluşturmak içincreate_trait niteliğini kullanacağız.

...#[starknet::contract]mod Sahip Olunabilir { ... #[generate_trait] PrivateMethods of PrivateMethodsTrait { yalnızca fn_owner(self: @ContractState) { izin arayan = get_caller_address(); iddia(arayan == self.owner.read(), 'Arayan, sahip değil'); }

Only_owner yöntemi artık gerektiğinde self.only_owner() çağrılarak kullanılabilir.

#[starknet::contract]mod Sahip Olunabilir { ... #[external(v0)] impl OwnableImpl of super::OwnableTrait { fn aktarım_sahiplik(ref self: ContractState, new_owner: ContractAddress) { self.only_owner (); ... } ... }

#[generate_trait] PrivateMethodsTrait'in PrivateMethods'unu uygula { yalnızca fn_owner(self: @ContractState) { ... }

etkinlik

Kahire v1'de bir olay gövdesi olmayan ve olay özniteliğiyle açıklamalı bir işlevken, v2'de bir olay aynı öznitelikle açıklamalı bir sıralamadır, ancak şimdi türetme bazı ek özellikler kullanılarak uygulanmaktadır.

...#[starknet::contract]mod Sahip Olunabilir { ... # [event] #[derive(Drop, starknet::Event)] enum Event { OwnershipTransferred: OwnershipTransferred, }

#[derive(Drop, starknet::Event)] struct OwnershipTransferred { # [key] önceki_sahibi: SözleşmeAdresi, # [key] yeni_sahibi: SözleşmeAdresi,

Olay sıralamasının her değişkeni, aynı ada sahip bir yapı olmalıdır. Bu yapıda, yaymak istediğimiz tüm değerleri tanımlamak, Starknet'in hangi değerleri dizine eklemesini istediğimizi sisteme bildirmek, böylece dizin oluşturucunun daha hızlı arama ve alma yapabilmesi için isteğe bağlı anahtar özniteliğini kullanıyoruz. Bu durumda, iki değeri (önceki_sahip ve yeni_sahip) dizine eklemek istiyoruz.

ContractState özelliği, olayları yaymak için kullanılabilecek bir yayma yöntemini tanımlar.

...#[starknet::contract]mod Sahip Olunabilir { ... #[harici(v0)] impl OwnableImpl of super::OwnableTrait { fn aktarım_sahiplik(ref self: SözleşmeState, yeni_sahip: SözleşmeAdresi) { .. self.emit(Event::OwnershipTransferred(OwnershipTransferred { önceki_sahip: önceki_sahip, yeni_sahip: yeni_sahip, })); } ... } ...}

Bu son özellikle, Sahip olunabilir akıllı sözleşmenin v1'den v2'ye geçişini tamamladık. Tam kod aşağıda gösterilmiştir.

starknet::ContractAddress'i kullanın;

#[starknet::interface]trait OwnableTrait { fn aktarım_sahiplik(kendi kendine referans: T, yeni_sahibi: SözleşmeAdresi); fn get_owner(self: @T) -> SözleşmeAdresi;}

#[starknet::contract]mod Sahip Olunabilir { use super::ContractAddress; starknet::get_caller_address'i kullanın;

[event] #[derive(Drop, starknet::Event)] enum Event { OwnershipTransferred: OwnershipTransferred, }

#[derive(Drop, starknet::Event)] struct OwnershipTransferred { # [key] önceki_sahibi: SözleşmeAdresi, # [key] yeni_sahibi: SözleşmeAdresi, }

[storage] yapı Depolama { sahibi: SözleşmeAdresi, }

[constructor] fn yapıcı(ref self: ContractState) { izin konuşlandırıcı = get_caller_address(); self.owner.write(dağıtıcı); }

#[harici(v0)] impl OwnableImpl of super::OwnableTrait { fn aktarım_sahiplik(ref self: ContractState, new_owner: ContractAddress) { self.only_owner(); önceki_sahip = self.owner.read(); self.owner.write(yeni_sahip); self.emit(Event::OwnershipTransferred(OwnershipTransferred { önceki_sahip: önceki_sahip, yeni_sahip: yeni_sahip, })); }

fn get_owner(self: @ContractState) -> SözleşmeAdresi { self.owner.read() } }

#[generate_trait] PrivateMethodsTrait of PrivateMethods'u uygular { yalnızca fn_owner(self: @ContractState) { let arayan = get_caller_address(); iddia(arayan == self.owner.read(), 'Arayan, sahip değil'); }

Bu kodu Github'da da bulabilirsiniz.

Sonuç olarak

Kahire derleyicisinin 2. sürümü, Starknet'e yeni bir sözdizimi getirerek akıllı sözleşme kodunun Kahire'nin kendisiyle daha tutarlı ve dolayısıyla daha çok Rust benzeri görünmesini sağlıyor. Daha hantal kod pahasına bile, güvenlik avantajları ödün vermeye değer.

Bu makalede, yeni sözdizimiyle ilgili her şeye, özellikle de diğer akıllı sözleşmelerle nasıl etkileşime girdiğine değinmedik, ancak daha fazlasını öğrenmek için derleyicinin değişiklik günlüğünü okuyabilir, forumdaki bu gönderiyi okuyabilir veya StarkWare'in YouTube kanalında bir video izleyebilirsiniz. hakkında daha fazla bilgi edinmek için.

Derleyicinin bu yeni sürümü birkaç hafta içinde Starknet'in test ağında ve birkaç hafta içinde ana ağda mevcut olacak, bu yüzden bu kodu henüz dağıtmaya çalışmayın, henüz çalışmayacaktır.

Kahire daha iyiye gitmeye devam ediyor.

kaynak

  • Sözleşme Sözdizimi - Geçiş Kılavuzu
  • Kahire 1: sözleşme sözdizimi gelişiyor
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • Comment
  • Share
Comment
0/400
No comments
  • Pin
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate app
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)