Uniswap V3 kod analizi: 7 pratik sözleşme geliştirme ipucu

Uniswap kodundan öğrenilen sözleşme geliştirme ipuçları

Son zamanlarda merkeziyetsiz borsa geliştirme kılavuzu yazarken, Uniswap V3'ün kodunu referans aldım ve birçok değerli bilgi edindim. Daha önce sadece basit NFT sözleşmeleri geliştiren bir geliştirici olarak, bu sefer DeFi sözleşmeleri geliştirme denemem bana birçok yeni kazanım sağladı. Bu küçük ipuçlarının, sözleşme geliştirmeyi öğrenmek isteyen yeni başlayanlar için çok faydalı olacağına inanıyorum.

Şimdi bu pratik geliştirme ipuçlarına bir göz atalım, bazıları hatta harika numaralar olarak adlandırılabilir.

Web3 Yeni Başlayanlar Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları

Tahmin Edilebilir Sözleşme Dağıtım Adresi

Genellikle dağıtılan bir sözleşme, nonce ile ilgili olduğu için tahmin edilmesi zor olan rastgele bir adres gibi görünür. Ancak bazı durumlarda, işlem çiftleri ve ilgili bilgiler aracılığıyla sözleşme adresini tahmin etmemiz gerekir; örneğin işlem izinlerini belirlemek veya havuz adresini almak gibi.

Uniswap, CREATE2 yöntemi ile sözleşme oluştururken salt parametresini ekleyerek oluşturulan sözleşme adresinin tahmin edilebilir olmasını sağlar. Adres oluşturma mantığı şudur: yeni adres = hash("0xFF", oluşturucu adresi, salt, initcode).

Web3 Yeni Başlangıç Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları

Geri çağırma fonksiyonlarını iyi kullanmak

Solidity'de sözleşmeler birbirlerini çağırabilir. Bazı senaryolarda, A'nın B'nin yöntemini çağırması ve B'nin çağrılan yöntemde A'yı geri araması çok faydalıdır.

Uniswap'ta, UniswapV3Pool sözleşmesinin swap yöntemini çağırdığınızda, swapCallback geri çağrılır ve bu geri çağrıda hesaplanan bu işlemin gerçekten gerekli olan Token'ı iletilir. Çağrıyı yapan taraf, geri çağrıda işlem için gereken Token'ı UniswapV3Pool'a aktarmalıdır, swap yöntemini iki parçaya ayırıp çağrıyı yapan tarafın çağırmasına izin verilmemelidir. Bu, swap yönteminin güvenliğini garanti eder ve tüm mantığın eksiksiz bir şekilde yürütülmesini sağlar, güvenliği sağlamak için karmaşık değişken kayıtlarına ihtiyaç duyulmaz.

Hata ile bilgi iletimi, işlem tahmini için try catch kullanın

Uniswap'ın bazı sözleşmelerinde, UniswapV3Pool'un swap yöntemini try catch ile sarmalayarak çalıştırıyor. Bu, swap yöntemini simüle ederek işlem için gerekli Token'ı tahmin etmek amacıyla yapılıyor. Tahmin sırasında gerçek bir Token değişimi gerçekleşmediği için hata veriyor. Uniswap, işlem geri çağırma fonksiyonunda özel bir hata fırlatarak bu hatayı yakalıyor ve hata mesajından gerekli bilgileri çözümlüyor.

Bu yöntem biraz hileli gibi görünse de oldukça pratiktir. Swap yöntemini işlem talebini tahmin etmek için yeniden yapılandırmaya gerek yoktur, mantık da daha basittir.

Web3 Yeni Başlayanlar Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları

Büyük sayılarla hassasiyet sorununu çözmek

Uniswap kodunda, mevcut fiyat ve likiditeye göre takas edilen Token'ları hesaplamak için çok sayıda hesaplama mantığı bulunmaktadır. Bölme işleminin hassasiyet kaybına neden olmaması için hesaplama sırasında sık sık << FixedPoint96.RESOLUTION işlemi kullanılır, yani 96 bit sola kaydırılır, bu da 2^96 ile çarpmaya eşdeğerdir. Sola kaydırdıktan sonra bölme işlemi yapılır, normal ticaretin taşma olmadan hassasiyeti garanti edilir.

Teorik olarak hala bir hassasiyet kaybı olsa da, genellikle bu sadece en küçük birimlerin kaybı olup, kabul edilebilir.

Share yöntemiyle kazancı hesaplama

Uniswap'ta LP'lerin (likidite sağlayıcılarının) ücret gelirlerini kaydetmek gerekir. Her işlemde her LP için kendi ücretini kaydetmek açıkça mümkün değildir, bu büyük miktarda Gas tüketir.

Uniswap'ın çözümü, Position yapısında feeGrowthInside0LastX128 ve feeGrowthInside1LastX128 tanımlamaktır; bu, her pozisyonun son kez ücret çektiği zaman her bir likiditenin alması gereken ücreti kaydeder.

Kısacası, yalnızca toplam işlem ücretini ve her likiditenin alması gereken işlem ücretini kaydetmek yeterlidir. LP işlem ücreti çekerken, sahip olduğu likiditeye göre çekilebilecek işlem ücretini hesaplar. Bu, şirket hisselerine sahip olmaya benzer; hisse getirilerini çekerken yalnızca şirketin tarihsel hisse başına kazancı ve son çekim zamanındaki getiriyi bilmek yeterlidir.

Web3 Yeni Başlayanlar Serisi: Uniswap Kodundan Öğrendiğim Kontrat Geliştirme İpuçları

Tüm bilgilerin zincir üzerinden alınması gerekmez

Blockchain üzerindeki depolama nispeten pahalıdır ve tüm bilgilerin blockchain'e alınması veya blockchain'den alınması gerekmez. Örneğin, Uniswap'in ön yüz web sitesi tarafından çağrılan birçok arayüz geleneksel Web2 arayüzleridir.

Ticaret havuzu listeleri, ticaret havuzu bilgileri vb. normal veritabanlarında saklanabilir, bazıları zincir üzerinde periyodik olarak senkronize edilmesi gerekebilir, ancak ilgili verilere erişmek için zincir veya düğüm hizmetleri tarafından sağlanan RPC arayüzünü gerçek zamanlı olarak çağırmaya gerek yoktur.

Elbette, ana işlemler zincir üzerinde gerçekleştirilmelidir.

Sözleşme bölmeyi öğrenin, mevcut standart sözleşmeleri kullanın

Bir proje birden fazla gerçek dağıtılmış sözleşme içerebilir. Gerçek dağıtımda yalnızca bir sözleşme olsa bile, sözleşmeyi miras alma yöntemiyle birden fazla sözleşmeye bölerek bakımını yapabiliriz.

Örneğin, Uniswap'taki bazı sözleşmeler birden fazla sözleşmeden miras alır. Uygulama aşamasında, @openzeppelin/contracts/token/ERC721/ERC721.sol sözleşmesi doğrudan kullanılmıştır, bu sayede NFT yöntemiyle pozisyonları yönetmek kolaylaşmış ve mevcut standart sözleşmelerden faydalanarak geliştirme verimliliği artırılmıştır.

Özet

Kendi başınıza geliştirme yapmak, makale okumaktan daha derin bir anlayış kazanmanızı sağlar. Basit bir merkeziyetsiz borsa uygulaması oluşturma süreci, Uniswap'ın kod uygulamasını daha derinlemesine anlamanızı sağlayacak ve gerçek projelerdeki daha fazla bilgi edinmenizi sağlayacaktır.

Web3 Yeni Başlangıç Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları

View Original
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.
  • Reward
  • 4
  • Share
Comment
0/400
NoStopLossNutvip
· Just Now
Ne zaman bir v4 versiyonu gelecek?
View OriginalReply0
BearMarketGardenervip
· 13h ago
Küçük acemi, önce ilaç yapımına başla
View OriginalReply0
MissedAirdropAgainvip
· 13h ago
Yine açılış mı var? NFT'yi yeni bitirdik, bu yeterli değil mi?
View OriginalReply0
Web3Educatorvip
· 13h ago
tamam öğrenciler, bunu hızlıca açıklamama izin verin...
View OriginalReply0
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate app
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)