Aelf Teknik Konuşmalar - AElf Akıllı Sözleşme Geliştirme - İlk AElf Akıllı Sözleşmesi - Bölüm 1
Bu makale Aelf Kıdemli Geliştiricisi Yiqi Zhao tarafından yazılmıştır.
![](https://i.ibb.co/B2526W4/1.png)
İlk Aelf akıllı sözleşmesi
Bu 4 bölümlük seride bir Aelf akıllı sözleşmesinin geliştirilmesinden bahsedeceğiz.
AELf staging projesi normal olarak başlatılabilir ve bloklar oluşturmak için tek bir düğüm kullanırsa, ilk akıllı sözleşme olan Merhaba Dünya (Hello World) üzerinde çalışmaya başlayabilirsiniz.
AELf akıllı sözleşmelerinin geliştirilmesi için yalnızca C# sözdizimi (Sentaks) gerektirir ve bu sözdizimleri, aşağıdaki öğreticide demo aracılığıyla açıkça gösterilecektir. Minimum programlama deneyimine sahip okuyucular, temel geliştirme sürecini anladıktan sonra akıllı sözleşmeler geliştirmeye başlayabilmelidir.
Şimdi bir akıllı sözleşme projesi oluşturmaya başlayalım.
Henüz akıllı sözleşme projeleri oluşturmayan bir AElf.Boilerplate çözümümüz olduğunu varsayın. AElf.Boilerplate.sln dosyasını VS veya Rider gibi IDE ile açtıktan sonra, dizin yapısı aşağıdaki gibi olmalıdır:
![](https://i.ibb.co/M1bRYCL/2.png)
Sözleşme klasöründeki Directory.Build.props dosyası, sözleşme dizinindeki tüm projelerin AELf.Sdk.CSharp'ın aynı sürümüne referansına yardımcı olmak amacıyla oradadır; böylece bir akıllı sözleşme projesi oluşturduktan sonra bir sonraki sürüme el ile bir referans eklemeniz gerekmeyecektir. Ayrıca props dosyası, Protobuf'ta tanımlanan bazı yöntemleri ve yapı kodu oluşturma komut dosyalarını tanımlamak için MSBUILD kullanan AELf.Contract.Tools.targets dosyasını içe aktarır.
Src klasörü; başka bir bölümde açıklanacak olan staging başlatma, sistem sözleşmesi dağıtımı ve simüle edilmiş işlem testi gibi öğeleri içerir.
1. Akıllı sözleşmenin hizmetlerinin ve yapısının tanımlanması (Proto dosyası)
Akıllı sözleşme geliştirmenin ilk adımı, akıllı sözleşmenin harici olarak sağlayabileceği bazı arayüzleri (GRpc'deki hizmetlere karşılık gelen) ve veri yapılarını (GRpc'deki mesajlara karşılık gelen) tanımlamaktır.
AElf akıllı sözleşmelerini geliştirmek için AElf’in Staging’ini kullanırken, sözleşme hizmetlerini ve veri yapılarını tanımlayan proto dosyalarını AElf.Boilerplate projesinin protobuf klasörü altına yerleştirmenizi öneririz:
![](https://i.ibb.co/HBxWsDL/3.png)
Protobuf klasöründe, AELf sistem sözleşmesinin proto dosyaları ve bir dizi AELf sözleşme standardı (acs * .proto) dahil olmak üzere önemli sayıda proto dosya bulunduğunu görebiliriz. AELF klasöründe core.proto ve options.proto'yu bulabiliriz, bunlar geliştirme sürecini daha kolay hale getirmek için AELF tarafından tanımlanan genel türler ve uzantılardır. AELF akıllı sözleşme geliştirmesi, kaçınılmaz olarak bu iki dosyanın (ve Google tarafından tanımlanan diğer bazı proto dosyaları) içe aktarılmasını gerektirir.
Yöntemden bağımsız olarak geliştiricilerin protobuf klasöründe hello_world_contract.proto adlı bir dosya oluşturmaları gerekir (bu gerekli olmasa da “sözleşme adı_contract.proto” adlı sözleşmeyle ilgili proto dosyalarını öneririz) ve daha sonra sözleşme hizmetleri ve veri yapıları tanımlamaya başlayabiliriz:
![](https://i.ibb.co/Z6nfVjP/4.png)
csharp_namespace = “AElf.Contracts.HelloWorld”, karşılık gelen C# kodunun AElf.Contracts.HelloWorld ad alanı (namespace) altında olması gerektiği anlamına gelir.
option (aelf.csharp_state) = “AElf.Contracts.HelloWorld.HelloWorldContractState”, sözleşmenin durumunun HelloWorldContractState sınıfında AElf.Contracts.HelloWorld ad alanı altında tanımlanması gerektiği anlamına gelir.
Hello_world_contract.proto'da iki eylem hizmeti tanımlanır (hizmet çağrıldıktan sonra blok zincirinin durumu değiştirilebilir; bu, çağrıdan sonra küresel defterin (ledger) değişeceği olarak anlaşılabilir): Greet ve GreetTo. Greet, girdinin google.protobuf.Empty türü (boş giriş için yer tutucu olarak anlaşılabilir) olmasını ve çıktının google.protobuf.StringValue (geleneksel string) olmasını gerektirir; GreetTo, girdinin bu proto dosyası için özelleştirilmiş GreetToOutput türünü veren google.protobuf.StringValue olmasını gerektirir.
Ek olarak bir Görünüm (View) hizmeti tanımlanır (yalnızca Blockchain'in geçerli durumunu sorgulamak için bir yöntem olarak kullanılır): Girdinin google.protobuf.Empty türü ve çıktının özelleştirilmiş bir GreetingsList türü olmasını gerektiren GetGreetedList. GreetingsList’in aslında bir string Listeleri olduğunu görebilirsiniz.
İPUÇLARI:
• Google.protobuf.Empty kullanmanın öncülü, google/protobuf/empty.proto’yu içe aktarmaktır.
• Google.protobuf.Timestamp kullanmanın öncülü, google/protobuf/timestamp.proto’yu içe aktarmaktır.
• Google.protobuf.StringValue kullanmanın öncülü, google/protobuf/wrappers.proto’yu içe aktarmaktır.
• (Aelf.is_view) = true seçeneği kullanıldığında hizmetin blok zincirinin durumunu değiştirmeyeceği bildirilir. Bu işlemin Aelf/options.proto’ya aktarılması gerekmektedir (Ayrıca aelf.csharp_state'i kullanmadan önce aelf/options.proto’yu içe aktarmanız gerekir).
Proto dosyası oluşturulduktan sonra, içinde tanımlanan üç hizmeti uygulamaya başlayabiliriz. Bölüm 2’de akıllı sözleşme geliştirilmesi için bu sürece devam edilecektir.
KAYNAK: https://medium.com/aelfblockchain/aelf-tech-talks-aelf-smart-contract-development-the-first-aelf-smart-contract-part-1-4b51f5756b24