Son zamanlarda merkeziyetsiz bir borsa geliştirirken, tanınmış bir DEX'in kod uygulamasını referans aldım ve birçok pratik sözleşme geliştirme tekniği öğrendim. Defi sözleşme geliştirmeye yeni başlayan biri olarak, bu teknikler bana büyük bir ilham verdi. Diğer sözleşme geliştirmeyi öğrenmek isteyen arkadaşlar için de faydalı olacağına inanıyorum.
Tahmin Edilebilir Sözleşme Adresi
Genellikle dağıtılan sözleşmelerin elde edilen adresleri rastgele görünür ve tahmin edilmesi zordur. Ancak bazı durumlarda, işlem eşleşme bilgilerinden sözleşme adresini çıkarmamız gerekir; örneğin, işlem yetkisini belirlemek veya havuz adresini almak için.
Bu, CREATE2 yöntemi kullanılarak sözleşme oluşturularak gerçekleştirilebilir. Spesifik olarak, sözleşme oluşturulurken salt parametresi eklenir:
katılık
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Bu şekilde oluşturulan sözleşme adresi tahmin edilebilir, oluşturma mantığı şudur:
Yeni adres = hash("0xFF", yaratıcının adresi, tuz, initcode)
Geri Çağırma Fonksiyonlarını Kullanma
Bazı senaryolarda, sözleşmelerin birbirini çağırması yararlıdır. Örneğin, A'nın B'nin metodunu çağırması, B'nin çağrılan metodunda A'yı geri aramasıdır.
Bir işlem örneği olarak, havuz sözleşmesinin swap yöntemini çağırdığınızda, swapCallback'i geri çağırır ve hesaplanan gerçek gerekli Token miktarını iletir. Çağrılan taraf, geri çağırma sırasında Token'ı havuz sözleşmesine aktarmalıdır, bu da swap yönteminin tam olarak uygulanmasını ve güvenliğini sağlar, karmaşık değişken kayıtlarına gerek kalmaz.
Hata ile Bilgi İletimi
Tahmini işlem yaparken, swap yöntemini simüle etmemiz gerekiyor ama Token'ları gerçek anlamda değiştirmiyoruz. İşlem geri çağırma fonksiyonunda özel bir hata fırlatabiliriz, ardından bu hatayı yakalayıp gerekli bilgileri çıkartabiliriz.
Bu yöntem hileli gibi görünüyor, ama oldukça pratik. Tahmini işlemler için özel olarak swap yöntemini değiştirmeye gerek yok, mantık daha basit.
Büyük sayıların hassasiyet sorununu çözme
Fiyat ve likidite hesaplamalarında, bölme işleminin hassasiyetini kaybetmemesi için, ('in 2^96) ile çarpılmasına eşdeğer olan sola kaydırma işlemi kullanılabilir.
Bu, normal ticaretin taşmasını önlerken hassasiyetin korunmasını sağlar. Teorik olarak hala çok küçük bir hassasiyet kaybı olsa da, kabul edilebilir bir seviyededir.
Paylaşım Yöntemi ile Kazanç Hesaplama
Her işlemde tüm LP'lere işlem ücretlerini kaydetmekten kaçınmak için, Paylaşım yöntemi kullanılabilir.
Sadece toplam işlem ücretini ve her bir likiditeye tahsis edilmesi gereken işlem ücretini kaydetmeniz yeterlidir. LP çekildiğinde, sahip olunan likiditeye göre çekilebilecek işlem ücreti hesaplanır, hisse senedi temettüsüne benzer.
Zincir Dışı Verilerin Makul Kullanımı
Tüm bilgilerin zincire eklenmesi veya zincirden alınması gerekmez. İşlem havuzu listesi, temel bilgiler gibi veriler normal bir veritabanında saklanabilir, düzenli olarak senkronize edilebilir.
Bazı gelişmiş RPC arayüzleri ayrıca performansı ve verimliliği artırabilecek önbellek optimizasyonu ile veri alma yöntemleri sunmaktadır.
Sözleşme Bölme ve Yeniden Kullanma
Büyük projeler, birden fazla gerçek dağıtım sözleşmesine bölünebilir veya miras alarak birden fazla sözleşme halinde bakım yapılabilir.
Aynı zamanda, ERC721 gibi mevcut standart sözleşmelerin yeniden kullanılabilirliği, geliştirme verimliliğini artırır. Örneğin:
Başarılı projelerin kod uygulamalarını öğrenmek ve kendi başınıza geliştirmeyi denemek, merkeziyetsiz borsalar hakkında daha derin bir anlayış kazanmanıza yardımcı olabilir. Umarım bu küçük ipuçları, akıllı sözleşme geliştirmenize yardımcı 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.
DEX projeleri için 7 pratik sözleşme geliştirme ipucu
Sözleşme Geliştirme Küçük İpuçları Toplaması
Son zamanlarda merkeziyetsiz bir borsa geliştirirken, tanınmış bir DEX'in kod uygulamasını referans aldım ve birçok pratik sözleşme geliştirme tekniği öğrendim. Defi sözleşme geliştirmeye yeni başlayan biri olarak, bu teknikler bana büyük bir ilham verdi. Diğer sözleşme geliştirmeyi öğrenmek isteyen arkadaşlar için de faydalı olacağına inanıyorum.
Tahmin Edilebilir Sözleşme Adresi
Genellikle dağıtılan sözleşmelerin elde edilen adresleri rastgele görünür ve tahmin edilmesi zordur. Ancak bazı durumlarda, işlem eşleşme bilgilerinden sözleşme adresini çıkarmamız gerekir; örneğin, işlem yetkisini belirlemek veya havuz adresini almak için.
Bu, CREATE2 yöntemi kullanılarak sözleşme oluşturularak gerçekleştirilebilir. Spesifik olarak, sözleşme oluşturulurken salt parametresi eklenir:
katılık pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Bu şekilde oluşturulan sözleşme adresi tahmin edilebilir, oluşturma mantığı şudur:
Yeni adres = hash("0xFF", yaratıcının adresi, tuz, initcode)
Geri Çağırma Fonksiyonlarını Kullanma
Bazı senaryolarda, sözleşmelerin birbirini çağırması yararlıdır. Örneğin, A'nın B'nin metodunu çağırması, B'nin çağrılan metodunda A'yı geri aramasıdır.
Bir işlem örneği olarak, havuz sözleşmesinin swap yöntemini çağırdığınızda, swapCallback'i geri çağırır ve hesaplanan gerçek gerekli Token miktarını iletir. Çağrılan taraf, geri çağırma sırasında Token'ı havuz sözleşmesine aktarmalıdır, bu da swap yönteminin tam olarak uygulanmasını ve güvenliğini sağlar, karmaşık değişken kayıtlarına gerek kalmaz.
Hata ile Bilgi İletimi
Tahmini işlem yaparken, swap yöntemini simüle etmemiz gerekiyor ama Token'ları gerçek anlamda değiştirmiyoruz. İşlem geri çağırma fonksiyonunda özel bir hata fırlatabiliriz, ardından bu hatayı yakalayıp gerekli bilgileri çıkartabiliriz.
Bu yöntem hileli gibi görünüyor, ama oldukça pratik. Tahmini işlemler için özel olarak swap yöntemini değiştirmeye gerek yok, mantık daha basit.
Büyük sayıların hassasiyet sorununu çözme
Fiyat ve likidite hesaplamalarında, bölme işleminin hassasiyetini kaybetmemesi için, ('in 2^96) ile çarpılmasına eşdeğer olan sola kaydırma işlemi kullanılabilir.
Örneğin:
katılık numerator1 = FullMath.mulDiv(likidite << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
Bu, normal ticaretin taşmasını önlerken hassasiyetin korunmasını sağlar. Teorik olarak hala çok küçük bir hassasiyet kaybı olsa da, kabul edilebilir bir seviyededir.
Paylaşım Yöntemi ile Kazanç Hesaplama
Her işlemde tüm LP'lere işlem ücretlerini kaydetmekten kaçınmak için, Paylaşım yöntemi kullanılabilir.
Sadece toplam işlem ücretini ve her bir likiditeye tahsis edilmesi gereken işlem ücretini kaydetmeniz yeterlidir. LP çekildiğinde, sahip olunan likiditeye göre çekilebilecek işlem ücreti hesaplanır, hisse senedi temettüsüne benzer.
Zincir Dışı Verilerin Makul Kullanımı
Tüm bilgilerin zincire eklenmesi veya zincirden alınması gerekmez. İşlem havuzu listesi, temel bilgiler gibi veriler normal bir veritabanında saklanabilir, düzenli olarak senkronize edilebilir.
Bazı gelişmiş RPC arayüzleri ayrıca performansı ve verimliliği artırabilecek önbellek optimizasyonu ile veri alma yöntemleri sunmaktadır.
Sözleşme Bölme ve Yeniden Kullanma
Büyük projeler, birden fazla gerçek dağıtım sözleşmesine bölünebilir veya miras alarak birden fazla sözleşme halinde bakım yapılabilir.
Aynı zamanda, ERC721 gibi mevcut standart sözleşmelerin yeniden kullanılabilirliği, geliştirme verimliliğini artırır. Örneğin:
katılık sözleşme NonfungiblePositionManager'dır INonfungiblePositionManager, PeripheryImmutableState, PoolInitializer, Likidite Yönetimi, PeripheryValidation, Multicall, ERC721Permit, PeripheryPayments, NFTAçıklayıcı { // ... }
Başarılı projelerin kod uygulamalarını öğrenmek ve kendi başınıza geliştirmeyi denemek, merkeziyetsiz borsalar hakkında daha derin bir anlayış kazanmanıza yardımcı olabilir. Umarım bu küçük ipuçları, akıllı sözleşme geliştirmenize yardımcı olur!