Logo

Solidity Fork Test Geliştirme Darboğazlarını Azaltma

April 1, 2024

Hız İhtiyacı


Yazılım geliştirmenin amacı, amaçlandığı gibi çalışmasını sağlamaktır. Bunu başarmak için birden fazla test iterasyonu gereklidir ve eldeki görevi mümkün olan en kısa sürede tamamlamaya çalışırken iterasyonlar arasındaki süre kritik öneme sahiptir.

Origin'de geliştirme için birim ve çatal testleri kullanıyoruz. Çatal testlerini çalıştırmak sıkıcı bir şekilde yavaş olabilir, ancak çatal testlerinin yürütme süresini (bazı durumlarda) 4 kat azaltmayı başardık. Bu makalede, çatal testlerinizin hızını nasıl artırabileceğinizi açıklayacağım, böylece kodunuzu kısa sürede amaçlandığı gibi çalıştırabilirsiniz.
 


Birim Testi mi Çatal Testi mi?

Tipik olarak, çatal testi mi yoksa birim testi mi kullanacağınız, geliştirilen protokolün mimarisine bağlıdır. Bazı ekipler yalnızca birim testleri kullanırken bazıları hem birim hem de çatal testleri kullanır. Origin'de sözleşmelerimiz çeşitli 3. taraf protokollerle (Curve, Uniswap, Balancer, Convex...) etkileşim halindedir ve entegrasyondaki hatalar feci fon kayıplarına neden olabilir.

Birim testlerini kullanarak, 3. taraf protokolün ABI'sini taklit ediyor ve sözleşmelerimizin programatik olarak doğru şekilde entegre olduğunu test ediyoruz. Ancak 3. taraf bir protokolün davranışını tüm incelikleriyle ve protokolün içinde bulunabileceği çeşitli (meşru veya manipüle edilmiş) durumlarla test etmek, çatal testlerinin parladığı yerdir. Ekibimizdeki bazı mühendisler için çatal testleri kullanarak test odaklı geliştirme, birincil geliştirme modudur. "Kod değişikliği" ile "test yürütme" süresini azaltmak çok önemlidir.

 

Çatal Testi Geliştirme Döngüsü

Origin'de Solidity geliştirme yığınımız için Hardhat kullanıyoruz. Geliştirme döngüsü süresini kısaltmak için bir fork test çalışmasının hangi adımlardan oluştuğunu anlamamız önemlidir. Basit olması için, bir seferde yalnızca 1 çatal testi çalıştıracağız - akıllı bir sözleşme üzerinde çalışırken genellikle yaklaşım budur.

  •  Derleme - Solidity sözleşmelerinde kod değişiklikleri yaparken bu gerekli bir adımdır. Hem fork hem de birim testlerinde gerçekleşir ve harcanan zaman son derlemeden bu yana değiştirilen sözleşme sayısına bağlıdır.
  • Dağıtımlar - dağıtımlar için hardhat-deploy eklentisini kullanıyoruz. Deploy dosyaları, protokol deposu değişikliklerini ana ağda yayınlamak için kullanılır. Çatal ortamının ana ağı mümkün olduğunca taklit etmesini istediğimiz için, bu dosyalar çatal ortamında neredeyse hiç değiştirilmeden çalıştırılır. Dikkate alınması gereken birkaç husus da vardır:
  • Çatal blok yüksekliğine bağlı olarak yalnızca çatallanan düğüme henüz yansıtılmamış dağıtımlar çalıştırılır.
  • OUSD ve OETH bir DAO tarafından yönetildiğinden, her dağıtımın yönetişim prosedüründen geçmesi gerekir. Önce bir teklif yayınlanır, ardından oy kullanmak için bir oylama süresi vardır ve bundan sonra teklif sıraya alınır ve yürütülür. Tüm bu adımların düğüm üzerinde simüle edilmesi değerli döngü süresini alır.
  • Dağıtım sonrası - test hesaplarının finanse edildiği ve ödeneklerinin sıfırlandığı tüm testler için genel bir adı
  • Test fikstürü - bazı testler, bir testin yapılabilmesi için protokolün belirli bir duruma getirilmesini gerektirir.
  • Test - çatal testinin kendisi

 

En Yavaş Yaklaşım

En yavaş yaklaşım, çatal testlerini en son bloktan düğüm çatallamasıyla çalıştırmaktır. Bu şekilde, testler her çalıştırıldığında farklı bir blok yüksekliği seçilir ve hardhat, ana ağ sağlayıcısından depolama yuvalarını okuyarak herhangi bir önbellekleme yapamaz. Bu da 101 saniyelik yavaş yürütme hızına yansımaktadır.

slowcycle_98e5628509.png

Bu özel çatal testi, varlıkları bir Dengeleyici havuzuna dağıtan likidite madenciliği stratejilerimizden birine fon gönderir. Bu, çok sayıda depolama yuvası okumasına neden olur ve yürütmenin yavaş "test" kısmının ana nedenidir (yukarıdaki çubuğun turuncu kısmı).

 

Daha hızlı bir alternatif

Bariz düşük asılı meyve, blok yüksekliğini sabitlemektir, böylece Hardhat, depolama yuvası okumalarının yerel bir önbelleğini kullanarak büyük ölçüde zaman kazanabilir. Derleme süresi bu optimizasyondan etkilenmez, ancak diğer tüm adımlar etkilenir. Döngü süresini büyük ölçüde 27 saniyeye düşürür (bu, hardhat önbelleğinin zaten ısınmış olduğu testin ilk çalıştırmaları dışındaki tüm çalıştırmalar için geçerlidir).

Screenshot_2023_11_30_at_01_10_45_dcd61afb68.png

 

Daha da Hızlı Olabilir mi?

Yukarıdaki yaklaşım durumu önemli ölçüde iyileştirir, ancak yine de birim testlerinin hızından uzaktır ve zaman zaman sinir bozucu derecede yavaş görünebilir. Sadece bir sözleşmeyi değiştirdik. İdeal olarak sadece 1 (veya daha fazla) solidity sözleşmesinin bayt kodunun değiştirilmesi gerekirken neden aynı dağıtımları ve dağıtım sonrasını yeniden çalıştırmamız gerekiyor? Elbette derlemeler arasında depolama yuvası düzenini veya durumunu değiştirmediğimiz göz önüne alındığında. Sıcak dağıtımlara girin.

 

Sıcak Dağıtımlar: Hız Şeytanı

Hot-deploy, değiştirilmekte olan sözleşmeyi dağıtır ve bayt kodunu alır. Hardhat test paketi anlık görüntülerini kullanarak, testler çalıştırılmadan önceki bir durumda bu sözleşmenin önceki sürümünü bulur ve bayt kodunu yeni derlenmiş olanla değiştirir. Bunun da ötesinde, tüm (post) dağıtım adımlarını atlayarak test fikstürlerini ve testin kendisini çalıştırır.

Screenshot_2023_11_30_at_01_28_18_e203799d0e.png

Döngü süresi artık sadece 7 saniyeye düştü. Geliştirme döngüsündeki bu değişiklik Origin Protocol'ün üretkenliğini ve özellik geliştirme hızını büyük ölçüde artırmasına yardımcı oldu.

 

Teknik Çözüm

Ne yazık ki, sıcak dağıtımlar bir anahtar olarak açılamıyor (en azından henüz değil) ve bazı yapılandırmalar gerektiriyor. Origin'de çözümü uygulama şeklimiz şu şekildedir:

  • Ana ağda bulunan tam kurucu parametreleri ile herhangi bir sıcak dağıtılabilir sözleşme oluşturabilen bir fonksiyonumuz var. Kurucu, depolama yuvaları yerine sözleşme bayt kodunda depolanan değişmez veya sabit değişkenleri tanımlayabildiğinden bu önlenemez.
  • Geliştirici, çevresel bayrakları kullanarak her test çalışmasında hangi sözleşme gruplarının (varsa) sıcak dağıtılacağını belirleyebilir. Bu bizim protokolümüze son derece özeldir ve muhtemelen diğer uygulamalardan farklı olacaktır.
  • Çatallanan düğümdeki sözleşmenin önceki sürümü bulunur ve uygulama bayt kodu yeni derlenmiş olanla değiştirilir.

Önemli bir gereklilik, bağımsız bir hardhat düğümünün fork test ortamından ayrı olarak çalışmasıdır. Hemen belli olmayabilir, ancak fork test çalıştırması başka bir düğüm çalışma zamanı oluşturacak ve diğer bağımsız çalışan düğümü bir sağlayıcı olarak kullanacaktır. Bağımsız düğüm tüm (post) dağıtımları çalıştıracak ve fork test düğümü değişiklikleri derleyecek, gerekli tüm sözleşme bayt kodlarını değiştirerek test fikstürlerini çalıştıracak ve son olarak testi çalıştıracaktır.

Dağıtım dosyalarındaki, sözleşme depolama yuvalarındaki ve bunların durum kurulumlarındaki değişiklikleri akılda tutmak iyidir. Test armatürlerini çalıştırmanın bağımsız düğümün yeniden başlatılmasını gerektirdiğini göz önünde bulundurmalısınız.

Sonuç

Bazen sırf daha hızlı geliştirebilmek için platformun 3. taraf protokollerle entegre olan kısımları için birim testleri kullanmak cazip gelebilir... bir çatal testinin sağlayabileceği ek güvenlik pahasına. Origin'deki geliştiriciler için sıcak dağıtımlar, bu döngü süresi boşluğunu kapatmak ve pastamızı hem yiyip hem de yemeye çalışmak için önemli bir adımdır. Umarım başkaları da bunu dener ve umarım siz de geliştirme döngü sürelerinizi kısaltmak için bu yaklaşımdan faydalanabilirsiniz.

Farid
Farid
Origin
Stay in touch
Be the first to hear about important product updates. Your email will be kept private.
Originally released by Origin Protocol
Privacy policyTerms of service