Son zamanlarda merkeziyetsiz bir borsa geliştirme sürecinde Uniswap V3'ün kod uygulamasını referans alarak birçok pratik akıllı sözleşme geliştirme tekniği öğrendim. Daha önce basit NFT sözleşmeleri geliştiren bir geliştirici olarak, bu Defi sözleşme geliştirme denemesi benim için oldukça verimli geçti. Bu teknikler, akıllı sözleşme geliştirmeyi öğrenmek isteyen yeni başlayanlar için oldukça faydalı olmalı.
Tahmin Edilebilir Kontrat Adresi
Genellikle, bir sözleşme dağıtıldığında, nonce ile ilgili olduğu için görünüşte rastgele bir adres elde edilir. Ancak bazı senaryolarda, işlem eşleşme bilgilerini kullanarak sözleşme adresini çıkarmamız gerekebilir, örneğin işlem yetkilerini belirlemek veya havuz adresini almak için.
Pratik bir yöntem, sözleşme oluşturmak için CREATE2 kullanmaktır. Salt parametresini ekleyerek, oluşturulan sözleşme adresinin tahmin edilebilir olmasını sağlarız. Yeni adresin oluşturulma mantığı şudur: hash("0xFF", oluşturucu adresi, salt, initcode). Bu yöntem, sözleşmeyi oluşturmadan önce adresini bilmemizi sağlar.
Geri Çağırma Fonksiyonlarını Etkili Kullanma
Solidity'de sözleşmeler birbirini çağırabilir. Bazı senaryolarda, A B'nin yöntemini çağırır ve B çağrılan yöntemde A'yı geri arar, bu model oldukça faydalıdır.
Örneğin, işlem sırasında, havuz sözleşmesi swapCallback'ı geri çağırır ve bu çağrıda bu işlem için gereken Token miktarını iletir. Çağrıyı yapan kişi, geri çağırma sırasında Token'ları havuz sözleşmesine aktarmalıdır. Bu yöntem, swap yönteminin güvenliğini ve bütünlüğünü sağlar, karmaşık değişken kayıtlarına gerek kalmaz.
Hata ile bilgi iletimi, işlem tahmini için try-catch kullanın
Tahmini işlem yaparken, gerçekten Token değiştirmeden swap yöntemini simüle etmemiz gerekiyor. Zeki bir yaklaşım, işlem geri çağrısında özel bir hata fırlatmak ve ardından bu hatayı yakalayıp gerekli bilgileri çıkarmaktır. Bu yöntem, tahmini işlem için swap yöntemini özel olarak değiştirmekten kaçınarak mantığı daha sade hale getirir.
Büyük Sayılar Kesir Problemlerini Çözer
Fiyat ve likidite hesaplamalarıyla ilgili olduğunda, bölme işleminin hassasiyet kaybını önlemek için, sola kaydırma işlemi kullanılabilir. (, 2^96) ile çarpmaya eşittir. Bu şekilde, normal işlemlerde taşma olmadan hassasiyet garanti altına alınabilir. Teorik olarak hala küçük bir hassasiyet kaybı olsa da, bu kabul edilebilir bir seviyededir.
Paylaşım Yöntemi ile Kazanç Hesaplama
LP'nin işlem ücreti kazançlarının hesaplanması için, her işlemde her LP için kayıt tutmak mümkün değildir, bu büyük miktarda Gas tüketir. İyi bir yöntem, toplam işlem ücretini ve her birim likiditeye düşen işlem ücretini kaydetmektir. LP'ler çekim yaptıklarında, sahip oldukları likiditeye dayanarak çekilebilecek işlem ücretini hesaplarlar, bu da hisse senedi temettüleri prensibine benzer.
Zincir üstü ve zincir altı verilerin birleştirilmesi
Tüm bilgilerin zincire eklenmesi veya zincirden alınması gerekmez. İşlem havuzları listesi, havuz bilgileri gibi veriler, düzenli olarak zincirden senkronize edilerek normal bir veritabanında saklanabilir. Bu, performansı ve verimliliği artırabilir, maliyetleri düşürebilir. Elbette, kritik işlemler hala zincir üzerinde gerçekleştirilmelidir.
Sözleşme Bölünmesi ve Standart Sözleşme Yeniden Kullanımı
Bir proje, birden fazla gerçek dağıtılmış sözleşme içerebilir. Tek bir sözleşme dağıtılsa bile, kod miras alarak birden fazla sözleşmeye bölünebilir ve bakım yapılabilir.
Aynı zamanda, mevcut standart sözleşmeler ( gibi ERC721 ) kullanmak geliştirme verimliliğini artırabilir. Örneğin, pozisyonları yönetmek için ERC721 kullanmak, hem kolay hem de olgun kodun yeniden kullanımını sağlar.
Özet
Gerçek uygulama geliştirmek, öğrenmenin en iyi yoludur. Basit bir merkeziyetsiz borsa uygulaması geliştirmeyi denemek, Uniswap'ın kodunun uygulanışını daha derinlemesine anlamanıza ve gerçek projelerdeki daha fazla bilgi edinmenize yardımcı olabilir. Umarım bu deneyim paylaşımları size faydalı olur.
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.
Sözleşme Geliştirme İleri Düzey: Defi Projelerine Yardımcı Olacak 7 Pratik İpucu
Sözleşme Geliştirme İpuçları ve Deneyim Paylaşımı
Son zamanlarda merkeziyetsiz bir borsa geliştirme sürecinde Uniswap V3'ün kod uygulamasını referans alarak birçok pratik akıllı sözleşme geliştirme tekniği öğrendim. Daha önce basit NFT sözleşmeleri geliştiren bir geliştirici olarak, bu Defi sözleşme geliştirme denemesi benim için oldukça verimli geçti. Bu teknikler, akıllı sözleşme geliştirmeyi öğrenmek isteyen yeni başlayanlar için oldukça faydalı olmalı.
Tahmin Edilebilir Kontrat Adresi
Genellikle, bir sözleşme dağıtıldığında, nonce ile ilgili olduğu için görünüşte rastgele bir adres elde edilir. Ancak bazı senaryolarda, işlem eşleşme bilgilerini kullanarak sözleşme adresini çıkarmamız gerekebilir, örneğin işlem yetkilerini belirlemek veya havuz adresini almak için.
Pratik bir yöntem, sözleşme oluşturmak için CREATE2 kullanmaktır. Salt parametresini ekleyerek, oluşturulan sözleşme adresinin tahmin edilebilir olmasını sağlarız. Yeni adresin oluşturulma mantığı şudur: hash("0xFF", oluşturucu adresi, salt, initcode). Bu yöntem, sözleşmeyi oluşturmadan önce adresini bilmemizi sağlar.
Geri Çağırma Fonksiyonlarını Etkili Kullanma
Solidity'de sözleşmeler birbirini çağırabilir. Bazı senaryolarda, A B'nin yöntemini çağırır ve B çağrılan yöntemde A'yı geri arar, bu model oldukça faydalıdır.
Örneğin, işlem sırasında, havuz sözleşmesi swapCallback'ı geri çağırır ve bu çağrıda bu işlem için gereken Token miktarını iletir. Çağrıyı yapan kişi, geri çağırma sırasında Token'ları havuz sözleşmesine aktarmalıdır. Bu yöntem, swap yönteminin güvenliğini ve bütünlüğünü sağlar, karmaşık değişken kayıtlarına gerek kalmaz.
Hata ile bilgi iletimi, işlem tahmini için try-catch kullanın
Tahmini işlem yaparken, gerçekten Token değiştirmeden swap yöntemini simüle etmemiz gerekiyor. Zeki bir yaklaşım, işlem geri çağrısında özel bir hata fırlatmak ve ardından bu hatayı yakalayıp gerekli bilgileri çıkarmaktır. Bu yöntem, tahmini işlem için swap yöntemini özel olarak değiştirmekten kaçınarak mantığı daha sade hale getirir.
Büyük Sayılar Kesir Problemlerini Çözer
Fiyat ve likidite hesaplamalarıyla ilgili olduğunda, bölme işleminin hassasiyet kaybını önlemek için, sola kaydırma işlemi kullanılabilir. (, 2^96) ile çarpmaya eşittir. Bu şekilde, normal işlemlerde taşma olmadan hassasiyet garanti altına alınabilir. Teorik olarak hala küçük bir hassasiyet kaybı olsa da, bu kabul edilebilir bir seviyededir.
Paylaşım Yöntemi ile Kazanç Hesaplama
LP'nin işlem ücreti kazançlarının hesaplanması için, her işlemde her LP için kayıt tutmak mümkün değildir, bu büyük miktarda Gas tüketir. İyi bir yöntem, toplam işlem ücretini ve her birim likiditeye düşen işlem ücretini kaydetmektir. LP'ler çekim yaptıklarında, sahip oldukları likiditeye dayanarak çekilebilecek işlem ücretini hesaplarlar, bu da hisse senedi temettüleri prensibine benzer.
Zincir üstü ve zincir altı verilerin birleştirilmesi
Tüm bilgilerin zincire eklenmesi veya zincirden alınması gerekmez. İşlem havuzları listesi, havuz bilgileri gibi veriler, düzenli olarak zincirden senkronize edilerek normal bir veritabanında saklanabilir. Bu, performansı ve verimliliği artırabilir, maliyetleri düşürebilir. Elbette, kritik işlemler hala zincir üzerinde gerçekleştirilmelidir.
Sözleşme Bölünmesi ve Standart Sözleşme Yeniden Kullanımı
Bir proje, birden fazla gerçek dağıtılmış sözleşme içerebilir. Tek bir sözleşme dağıtılsa bile, kod miras alarak birden fazla sözleşmeye bölünebilir ve bakım yapılabilir.
Aynı zamanda, mevcut standart sözleşmeler ( gibi ERC721 ) kullanmak geliştirme verimliliğini artırabilir. Örneğin, pozisyonları yönetmek için ERC721 kullanmak, hem kolay hem de olgun kodun yeniden kullanımını sağlar.
Özet
Gerçek uygulama geliştirmek, öğrenmenin en iyi yoludur. Basit bir merkeziyetsiz borsa uygulaması geliştirmeyi denemek, Uniswap'ın kodunun uygulanışını daha derinlemesine anlamanıza ve gerçek projelerdeki daha fazla bilgi edinmenize yardımcı olabilir. Umarım bu deneyim paylaşımları size faydalı olur.