Aelf Teknik Konuşmalar - AElf Akıllı Sözleşme Geliştirme - İlk AElf Akıllı Sözleşme - Bölüm 2



2. Bir akıllı sözleşme projesi oluşturulması

Sözleşme klasöründe “AElf.Contracts.HelloWorld” adlı bir dosya oluşturun ve csproj dosyasını aşağıdaki gibi değiştirin:



Geçerli proje bir proto dosyasında tanımlanan bir hizmeti uygulamak istiyorsa, proto dosyasına başvurmak için ContractCode etiketini kullanır.

AELf.Contracts.HelloWorld projesini derlemeden önce, projede HelloWorldContractState adlı bir C# kod dosyası oluşturun (veya Class1'i HelloWorldContractState olarak yeniden adlandırın) ve HelloWorldContractState'in ContractState'ten devralmasına izin verin, aksi halde derleme bir hata ile başarısız olur:

… "HelloWorldContractState" türü veya ad alanı adı, "AElf.Contracts.HelloWorld" ad alanında mevcut değildir (bir başvuru derlemesi mi eksik?)

Başarılı bir şekilde derledikten sonra, projenin dizin yapısı şöyle olmalıdır:



Sözleşme durumunu tanımlamak için HelloWorldContractState.cs kullanılır. Mevcut kod:



Son olarak bu projede hizmet uygulaması sağlamak için bir C# kod dosyası HelloWorldContract.cs verilir ve içindeki sınıflar HelloWorldContractContainer.HelloWorldContractBase ve C #'ın geçersiz kılma mekanizması hizmetlerini uygulamak için kullanılabilir.

HelloWorldContract kodunu uygulamadan önce, bu üç hizmetin işlevlerini analiz ediyoruz.

Greet hizmeti göreceli olarak basittir, yani “Merhaba Dünya!” Çağrıdan sonra işlem yürütme sonucu olarak döndürülür.

GreetTo, Greet'e benzerdir. Ancak döndürülen yürütme sonucu, işlem gönderen tarafından belirtilen diziyi içerir. GetGreetedList, önceki GreetTo işlemlerinin işlem parametrelerinin kaydını sorgulamak için kullanılır. Şimdilik veri temizleme sorunlarını görmezden gelebilirsiniz. Kayıtlar, durum olarak kaydedilmelidir. Bu nedenle, HelloWorldContractState'teki öznitelikler aracılığıyla bir GreetedList öğesinin SingletonState türünü tanımlamanız gerekir:



Yukarıdaki GreetedList için State.GreetedList'i doğrudan HelloWorldContract'ta kullanabilirsiniz. State.GreetedList'i veritabanının girişi olarak düşünebilirsiniz. Bu SingletonState veritabanı türünün geçerli değerini almak için State.GreetedList.Value kullanınız (SingletonState'in değer özelliğine erişerek AELf sözleşme geliştirme SDK'sı derleme anahtarını tamamlayacak ve önbellek ve veritabanı işlemlerini sırayla okuyacaktır) .

Daha sonra bu üç hizmetin nasıl uygulanacağına bakacağız.



3. Akıllı Sözleşme Test Projesi oluşturulması

TestKit kullanılması


AElf Sözleşmesi TestKit, AElf akıllı sözleşmelerini test etmek için özel olarak kullanılan bir test yapısıdır. Bu çerçevede, bir Saplama (stub) oluşturur ve işlem yürütmelerini simüle etmek için Saplama örneği tarafından sağlanan yöntemleri kullanır (genellikle sözleşmenin Eylem yöntemine karşılık gelir). Ayrıca test senaryosunda işlem yürütme sonuçlarını sorgulamanın yanı sıra (genellikle sözleşmenin Görünüm yöntemine karşılık gelir) sorgular. Bunu takiben, sözleşme yönteminin test görevini tamamlarsınız.

Test klasöründe AELf akıllı sözleşme test projesi olarak bir xUnit projesi oluşturun veya csproj dosyasını şu şekilde değiştirin:



Mevcut projenin gönderme veya sorgulama işlemlerini simüle etmek için bir sözleşme Saplaması kullanması gerekiyorsa, proto dosyasına başvurmak için ContractStub etiketini kullanın.

İpuçları:

• RootNamespace, bu proje altında açıkça bir varsayılan ad alanı belirtir. Varsayılan ad alanı, sözleşme koduyla tutarlı olacak şekilde değiştirilir. Bu gerekli değildir.
• Üçüncü taraf sınıf kitaplığına başvuru eklenip eklenmeyeceğine karar verebilirsiniz.
• Ana zincirin AELf.Contracts.TestKit referansı eklenmelidir. Bu belge yazılırken, AELf'in en son yayınlanan sürümü 0.9.0'dır.
• Bu projenin amacı HelloWorld sözleşmesini test etmek olduğundan, sözleşme projesine bir referans eklememiz gerekiyor.
• Test ortamı başlatıldığında, HelloWorld sözleşmesinin sıfır sözleşmeyle dağıtılması gerekir; bu, sıfır sözleşmenin saplamasını referans almak için ContractStub etiketinin de kullanılması gerektiği anlamına gelir.

Test Modülü

XXModule, kodun ABP yapısı tarafından modüler yönetimi için bir birimdir. Sözleşme testi durum projeleri için AELf varsayılan olarak sözleşmeyi isteğe bağlı dağıtma iznini kapattığından yalnızca ContractTestModule'e güvenmesi gerekir. Test ortamını hazırlarken, sözleşmeyi dağıtmak için izni el ile açmanız gerekir.



Test Base

Test Base, test durumunda kullanılan değişkenleri (sözleşme saplama ve sözleşme adresi vb.) başlatmak ve sözleşmeyi test için dağıtmak için kullanılır.

HelloWorldContractTestBase'de, sıfır sözleşme DeploySystemSmartContract yöntemini çağırarak HelloWorld sözleşmesini dağıttık ve sözleşme testi durumunda HelloWorldContractStub ve HelloWorldContractAddress adlı iki önemli değişkeni başlattık.





Test Durumları

Test Base tamamen hazırlandığında yazı kısmı kolay olacaktır.

Örneğin, test durumunda işlem gönderme işlemini simüle etmek istiyorsanız, HelloWorld sözleşmesinde bir Greet işlemi göndermek istiyorsanız, Test Base'de doğrudan başlatılan HelloWorldContractStub'ı kullanabilir ve await HelloWorldContractStub.Greet.SendAsync (yeni Empty ())'yı çağırabilirsiniz. Çağrı bittikten sonra, dönüş değerini almak için TransactionResult türünde bir değişken kullanılır ve bu işlemin yürütme sonucu denetlenir.

Greet, GreetTo ve GetGreetedList yöntemlerinin üç yöntemi için en temel test örnekleri aşağıdadır:





SendAsync kullanmanın öncülünün test durumu yazılırken ilgili işlemin başarıyla yürütülmesi gerektiğini varsaymak olduğunu lütfen unutmayın. İşlem yürütme hatası istisnasını test etmek istiyorsanız, başka bir yöntem kullanmanız gerekir: SendWithExceptionAsync.



Bu serinin 3. bölümünde, geliştirdiğimiz akıllı sözleşmelerin dağıtımını tartışacağız.

KAYNAK: https://medium.com/aelfblockchain/aelf-tech-talks-aelf-smart-contract-development-the-first-aelf-smart-contract-part-2-c05e5c6f64c6