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.
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).
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.
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.
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.
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.
9 Likes
Reward
9
8
Share
Comment
0/400
SchrodingerWallet
· 07-09 09:07
Çok temel, kaçtım kaçtım~
View OriginalReply0
LiquidityWizard
· 07-08 13:06
Kopyala ve işini bitir.
View OriginalReply0
PoolJumper
· 07-07 22:21
Sözleşme pro yardım et!
View OriginalReply0
IntrovertMetaverse
· 07-06 09:37
Yine sözleşme yapmaya geldik.
View OriginalReply0
SerumSurfer
· 07-06 09:37
Bu v3 kaynak kodu oldukça güzel kullanılıyor.
View OriginalReply0
FlyingLeek
· 07-06 09:36
Güzel görünüyor, insanları enayi yerine koymak için sabırsızlanıyorum.
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
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.
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).
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.
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.
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.