Uniswap kaynak kodu açığa çıkarıldı: 7 büyük sözleşme geliştirme ipucu Defi Çaylaklarına Aya doğru yardımcı oluyor

robot
Abstract generation in progress

Sözleşme Geliştirme Teknikleri Paylaşımı: Uniswap Kaynak Kodundan Öğrenmek

Son zamanlarda bir merkeziyetsiz borsa geliştirme kılavuzu yazarken, Uniswap V3'ün kod uygulamalarını inceledim ve birçok değerli bilgi edindim. Defi akıllı sözleşmeleri geliştirmeyi ilk kez deneyen bir geliştirici olarak, bu teknikler akıllı sözleşme geliştirmek isteyen yeni başlayanlar için oldukça faydalı olacaktır.

Aşağıda öğrenilen bazı küçük ipuçlarını paylaşıyorum, bazıları gerçekten de ustaca teknikler 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ım sözleşmesi, nonce ile ilgili olduğu için öngörülemeyen rastgele bir adres alır. Ancak belirli senaryolarda, işlem çiftleri ve ilgili bilgiler aracılığıyla sözleşme adresini çıkarabilmemiz gerekmektedir. Bu, işlem yetkisini belirlemede veya havuz adresini elde etmede oldukça faydalıdır.

Uniswap, CREATE2 yöntemini kullanarak sözleşme oluşturmak için 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ı

Callback Fonksiyonlarını Etkili Kullanma

Bazı senaryolarda, kontrat A, kontrat B'nin yöntemini çağırır ve B, çağrılan yöntemde A'yı geri arar; bu yöntem oldukça kullanışlıdır.

Örneğin, Uniswap'ta, UniswapV3Pool sözleşmesinin swap metodunu kullanarak işlem yaptığınızda, swapCallback'i çağırır ve bu işlem için hesaplanan ihtiyaç duyulan Token'i geçirir. Çağıran taraf, geri çağırma sırasında gerekli Token'i UniswapV3Pool'e transfer etmelidir, swap metodunu iki parçaya ayırıp çağıran tarafın çağırmasına izin vermemelidir. Bu, swap metodunun güvenliğini sağlar ve tüm mantığın eksiksiz bir şekilde yürütülmesini garanti eder, güvenliği sağlamak için karmaşık değişken kayıtları gerektirmez.

Hata iletimi kullanarak, try catch ile işlem tahmini gerçekleştirme

Uniswap'ın Quoter sözleşmesinde, UniswapV3Pool'un swap yöntemini try catch ile sararak yürütüyoruz. Bu, swap yöntemini simüle ederek işlem için gereken Token'ı tahmin etmek içindir. Tahmin sırasında gerçek bir Token değişimi gerçekleşmediği için hata verir. Uniswap, işlem geri çağırma fonksiyonunda özel bir hata fırlatarak bu hatayı yakalar ve hata mesajından gerekli bilgileri çözümler.

Bu yöntem pratik görünüyor, ama oldukça işlevsel. Swap yöntemini ticaret talebini tahmin etmek için değiştirmeye gerek yok, mantık daha basit.

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

Büyük sayılar kullanarak hassasiyet sorununu çözme

Uniswap kodunda, mevcut fiyat ve likiditeye göre değiştirilen Token'ları hesaplamak gibi çok sayıda hesaplama mantığı bulunmaktadır. Bölme işlemi sırasında hassasiyet kaybını önlemek için, hesaplama sürecinde sıkça "\u003c\u003c FixedPoint96.RESOLUTION" işlemi kullanılır, yani 96 bit sola kaydırma, 2^96 ile çarpmaya eşdeğerdir. Sola kaydırdıktan sonra bölme işlemi gerçekleştirilir, normal işlemlerde taşma olmadığında hassasiyet garanti edilir.

Share Yöntemi ile Kazanç Hesaplama

Uniswap'ta, LP( likidite sağlayıcısı )'in işlem ücreti gelirlerini kaydetmek gerekiyor. Açıkça, her işlemde her LP için işlem ücretlerini kaydetmek mümkün değil, bu büyük miktarda Gas tüketir.

Uniswap'ın çözümü, Position yapısında feeGrowthInside0LastX128 ve feeGrowthInside1LastX128'i kaydetmektir; bu, her pozisyonun son ücret çekiminde her likiditenin alması gereken ücreti gösterir. Toplam ücreti ve her likiditenin alması gereken ücreti kaydetmek yeterlidir, LP çekim yaparken sahip olduğu likiditeye göre çekilebilecek ücreti hesaplar. Bu, bir şirketin hisse senetlerine sahip olmak gibidir; kazanç çekilirken sadece şirketin geçmiş hisse başına kazançlarını ve son çekim zamanındaki kazancı bilmek yeterlidir.

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

Gereksiz bilgiler zincir üzerinden alınmamalıdır.

Blockchain üzerinde depolama görece pahalıdır ve tüm bilgilerin zincire geçirilmesi veya zincirden alınması gerekmez. Örneğin, Uniswap ön yüz web sitesinin çağırdığı birçok arayüz geleneksel Web2 arayüzleridir.

Ticaret havuzları listesi, ticaret havuzu bilgileri vb. normal bir veritabanında saklanabilir, bazıları zincirden düzenli olarak senkronize edilmesi gerekebilir, ancak ilgili verileri almak için zincir veya düğüm hizmetlerinin RPC arayüzünü gerçek zamanlı olarak çağırmaya gerek yoktur.

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

Makul Sözleşme Bölme, Mevcut Standart Sözleşmeleri Kullanma

Bir proje, birden fazla gerçek dağıtılan sözleşme içerebilir. Gerçek dağıtımda yalnızca bir sözleşme bulunsa bile, kod bakımını yapmak için miras alma yoluyla birden fazla sözleşmeye ayrılabilir.

Örneğin, Uniswap'ın NonfungiblePositionManager sözleşmesi birden fazla sözleşmeden miras alır. ERC721Permit sözleşmesinin uygulamasına baktığımızda, doğrudan @openzeppelin/contracts/token/ERC721/ERC721.sol sözleşmesini kullandığını görüyoruz. Bu, hem NFT yöntemiyle pozisyonları yönetmeyi kolaylaştırır hem de mevcut standart sözleşmeleri kullanarak geliştirme verimliliğini artırır.

Özet

Uygulama en iyi öğrenme yöntemidir. Basit bir merkeziyetsiz borsa uygulamasını kendiniz gerçekleştirmeyi denemek, Uniswap'ın kod uygulamasını daha derinlemesine anlamanızı sağlar ve gerçek projelerdeki daha fazla bilgi edinmenizi sağlar.

Web3 Yeni Başlayanlar 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
  • 8
  • Share
Comment
0/400
SchrodingerWalletvip
· 07-09 09:07
Çok temel, kaçtım kaçtım~
View OriginalReply0
LiquidityWizardvip
· 07-08 13:06
Kopyala ve işini bitir.
View OriginalReply0
PoolJumpervip
· 07-07 22:21
Sözleşme pro yardım et!
View OriginalReply0
IntrovertMetaversevip
· 07-06 09:37
Yine sözleşme yapmaya geldik.
View OriginalReply0
SerumSurfervip
· 07-06 09:37
Bu v3 kaynak kodu oldukça güzel kullanılıyor.
View OriginalReply0
FlyingLeekvip
· 07-06 09:36
Güzel görünüyor, insanları enayi yerine koymak için sabırsızlanıyorum.
View OriginalReply0
LiquidityWhisperervip
· 07-06 09:31
Sonunda uniV3 kodunu anlayabiliyorum.
View OriginalReply0
GateUser-75ee51e7vip
· 07-06 09:10
Bu kod biraz ilginç.
View OriginalReply0
  • Pin
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)