Kod bacarıqlarınızı artırmaq üçün Solidity ipuçlarına rast gəlmiş ola bilərsiniz ki, bu da sizə qazdan qənaət etməyə kömək edəcək, amma bu gün Ethereum Virtual Machine-i başa düşməyin ağıllı müqavilələrinizdə qaz xərclərini effektiv şəkildə necə azaldacağını daha çox diqqət mərkəzində saxlamaq istəyirəm.

Ethereum-a dalmağımıza hazır olduğumuz üçün burada opcode-lərin qaz xərclərini göstərən Yellow Paper-in parçalarını buraxıram və məqalə boyunca onlara istinad edəcəyik.



İpucu #1: Soğuk giriş VS isti giriş

Gcoldsload: 2100 qaz

Gwarmaccess: 100 qaz

Burada ilk OPCODES-lərimiz var, birincisi bir dəyişənə ilk dəfə (ya da soyuq erişim) daxil olmağın nə qədər başa gələcəyini göstərir, ikincisi isə dəyişənə ikinci dəfə və daha sonra (isti erişim) daxil olmağın nə qədər başa gələcəyini göstərir. Qiymət fərqi olduqca böyükdür, buna görə bunu başa düşmək ağıllı müqavilənizin əməliyyat xərclərində böyük fərq yarada bilər. Gəlin bir nümunəyə baxaq.





Solidity-də bir funksiyada məlumatların önbelleğe alınması daha az qaz istifadəsinə səbəb ola bilər, hətta daha çox kod sətirlərinə ehtiyac duyarsa da. Bu halda, array-in yerini dəyişərək, onu storage-dan istifadə etmək əvəzinə, hər dəfə döngədə soyuq erişim etmədən, array-i ucuz olan memory-də saxlayır.

İpucu #2: Sıfır vs qeyri-sıfır dəyərləri və qaz geri ödəmələri

Gsset = 20,000 qaz

Rsclear = {icra qiymətində endirim}

Ethereum blockchain-də bir dəyəri 0-dan qeyri-sıfıra dəyişdirmək bahalıdır, Gsset-in qiymətində gördüyümüz kimi, lakin qeyri-sıfırdan 0-a dəyişdirmək sizə Rsclear opcode-u üzrə qaz dəyərində bir geri ödəmə verə bilər. Geri ödəmədən istifadə etməmək üçün, yalnız ümumi əməliyyat xərclərinin maksimum 20%-ni geri ala biləcəyiniz müəyyən edilir.

Belə bir ssenarini blockchain-də çox yaygın bir ssenaridə tapa bilərsiniz, yəni ağıllı müqavilələrdə ünvanların balansını yeniləmək. Hər birinin bir nümunəsinə baxaq:





  • Birinci nümunədə ZeroToNonZero müqaviləsi, qeyri-sıfırdan qeyri-sıfıra (5,000 qaz*) + sıfırdan qeyri-sıfıra (20,000 qaz) = 25,000 qaz

  • İkinci nümunədə NonZeroToZero müqaviləsi, sıfırdan sıfıra (5,000 qaz*) + sıfırdan qeyri-sıfıra (20,000 qaz) — Geri ödəmə (4,800 qaz) = 21,200 qaz

*2,100 (Gcolssload) + 2,900 (Gsreset) = 5,000 qaz

İpucu #3: Dövlət dəyişənlərinin sırası əhəmiyyətlidir

Saxlama, bir Solidity ağıllı müqaviləsinin dövlət dəyişənlərinin dəyərlərini saxlayan açar-dəyər məlumat strukturu kimidir.

Saxlamağı bir sıra kimi düşünə bilərsiniz ki, bu da bunu vizuallaşdırmağa kömək edəcək. Bu saxlamadakı hər bir yer “slot” adlanır və 32 bayt (256 bit) məlumat saxlayır və ağıllı müqavilədə elan olunan hər bir dövlət dəyişəni, elan mövqeyinə və növünə görə bir slotu tutacaq.

Bütün məlumat tipləri hər slotun 32 baytını tutmur, çünki bəzi məlumat tipləri (bool, uint8, address…) ondan azını tutur.

Buradakı fənd odur ki, əgər iki/üç və ya daha çox dəyişən bir yerdə 32 bayt və ya daha azdırsa, solidity’nin tərtibatçısı onları tək bir slotda birləşdirməyə çalışacaq, lakin bu dəyişənlər bir-birinin yanında müəyyən edilməlidir.





Burada bool (1 bayt), address (20 bayt) və uint256 (32 bayt) məlumat tiplərindən istifadə edirik. Bu dəyişənlərin ölçüsünü bilmək sizə asanlıqla başa düşməyə imkan tanıyır ki, TwoSlots müqaviləsinin ilk nümunəsində bool və address bir yerdə olduğuna görə (1 + 20 = 21 bayt, 32 baytdan azdır) onlar bir slotu tutacaqlar. ThreeSlots müqaviləsində isə bool ilə uint256 eyni slotda ola bilməz (1 + 32 = 33 bayt, slot tutumu 32 baytdan çoxdur) nəticədə üç slotdan istifadə edəcəyik.

İndi, bunun bu qədər vacib olmasının səbəbi nədir?

SLOAD opcode-u 2100 qaz dəyərindədir və Storage slotlarından oxumaq üçün istifadə edilir, buna görə əgər dəyişənləri daha az slotda saxlaya bilsəniz, qaz qazanmaqda sona çata bilərsiniz.

İpucu #4: uint256 uint8-dan daha ucuzdur

İpucu #3-də öyrənmişik ki, uint256 (256 bit = 32 bayt) öz başına bir slotu tutur və uint8-in 32 baytdan az olduğunu da öyrənmişik. Beləliklə, 8 bitin 256 bitdən daha kiçik olduğunu bilmək bir qədər düz görünür, bəs uint256 niyə daha ucuzdur?

Bunu anlamaq üçün bilmək vacibdir ki, əgər bir dəyişən özünü tam slot doldurmursa və bu slot başqa bir dəyişən tərəfindən doldurulmamışsa, EVM qalan bitləri “0” ilə dolduracaq ki, onu manipulyasiya edə biləsiniz.

EVM tərəfindən edilən bu “0” əlavə edilməsi qaz xərcləyəcək, yəni əməliyyat qazını saxlamaq üçün uint256-dan istifadə etmək daha yaxşıdır.

__________________

Ümid edirəm ki, ağıllı müqavilələrinizdə qaz xərclərini azaltmaq üçün bu ipuclarını öyrənərkən EVM-in necə işlədiyi haqqında da bir az öyrənmişsiniz.

__________________

Twitter @TheBlockChainer-dan daha çox gündəlik yeniliklər tapmaq üçün Smart Contracts, Web3 Təhlükəsizliyi, Solidity, ağıllı müqavilələrin yoxlanılması və daha çox.

__________________