Web3 Başlangıç Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları
Yakın zamanda merkezi olmayan borsa geliştirme hakkında bir eğitim yazısı yazdım https://github.com/WTFAcademy/WTF-Dapp , Uniswap V3'ün kod uygulamasına atıfta bulunarak ve birçok bilgi noktası öğrendim. Daha önce basit NFT sözleşmeleri geliştirdim ve bu, bir Defi sözleşmesi geliştirmeye çalıştığım ilk sefer. Bu ipuçlarının, sözleşme geliştirmeyi öğrenmek isteyen acemiler için çok yararlı olacağına inanıyorum.
Sözleşmeli geliştiriciler doğrudan şuraya gidebilir: https://github.com/WTFAcademy/WTF-Dapp Web3 için kod katkıda bulunmak ve fark yaratmak~
Şimdi, bazıları hileli numaralar olarak da adlandırılabilecek bu küçük numaralara bir göz atalım.
Sözleşme dağıtımının sözleşme adresi öngörülebilir hale getirilebilir
Bir sözleşmeyi dağıttığımızda, genellikle görünüşte rastgele bir adres alırız. Nonce ile ilişkili olduğu için, sözleşme adresini tahmin etmek zordur. Ancak, Uniswap'ta böyle bir gereksinimimiz var: sözleşme adresini işlem çifti ve ilgili bilgiler aracılığıyla çıkarsamamız gerekir. Bu, işlem yetkisini belirlemek veya havuzun adresini elde etmek gibi birçok durumda çok faydalıdır.
Uniswap'ta sözleşmeler, pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}());. gibi bir kod kullanılarak oluşturulur. Bir sözleşme oluşturmak için tuz ekleyerek OLUŞTUR 2 ( https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md ), avantajı oluşturulan sözleşme adresinin tahmin edilebilir olmasıdır. Adres oluşturma mantığı new address = hash(0x FF, yaratıcı adresi, salt, initcode).
Bu konu hakkında daha fazla bilgiyi WTF-DApp kursunda öğrenebilirsiniz https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md adresinde .
Geri çağırma fonksiyonlarını iyi kullanın
Solidity'de sözleşmeler birbirini çağırabilir. A'nın belirli bir yöntemde B'yi çağırdığı ve B'nin çağrılan yöntemde A'yı geri çağırdığı bir senaryo vardır, bu da bazı senaryolarda çok faydalıdır.
Uniswap'ta, Uniswap V3 Havuz sözleşmesinin takas yöntemini çağırdığınızda, bu, swapCallback'i geri çağırır ve geri arama, hesaplanan Jeton aslında bu işlem için gereklidir. Çağrıcının, takas yöntemini çağıran tarafından çağrılması için iki parçaya bölmek yerine, işlem için gereken Token'ı geri aramada Uniswap V3 Havuzuna aktarması gerekir. Bu, takas yönteminin güvenliğini sağlar ve güvenliği sağlamak için hantal değişken kayıtlarına ihtiyaç duyulmadan tüm mantığın tamamen yürütülmesini sağlar.
Kod parçacığı şu şekildedir:
Daha fazla bilgi edinmek için şuraya tıklayabilirsiniz: ticaret dersin bir parçası https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md adresinde .
Bilgiyi iletmek için istisnaları kullanın ve işlem tahminlerini uygulamak için yakalamayı deneyin
Uniswap koduna atıfta bulunduğumuzda, bunun https://github.com/Uniswap/v3-periphery/blob/main/contracts/lens/Quoter.sol sözleşme, Uniswap V3 Havuzunun takas yöntemi try catch ile sarıldı ve yürütüldü:
Bunun nedeni nedir? Çünkü işlem için gereken tokenları tahmin etmek için takas yöntemini simüle etmemiz gerekir, ancak token değişimi tahmin sırasında gerçekten gerçekleşmeyeceğinden bir hata bildirilecektir. Uniswap'ta, işlemin geri çağırma işlevinde özel bir hata atar, ardından hatayı yakalar ve hata mesajından gerekli bilgileri ayrıştırır.
Bir hack gibi görünüyor, ancak aynı zamanda çok pratik. Bu şekilde, takas yöntemini tahmini işlemlerin ihtiyaçlarına göre değiştirmeye gerek kalmıyor ve mantık daha basit. Kursumuzda, sözleşmeyi uygulamak için bu mantığa da başvuruyoruz https://github.com/WTFAcademy/WTF-Dapp/blob/main/demo-contract/contracts/wtfswap/SwapRouter.sol .
Hassasiyet problemlerini çözmek için büyük sayıların kullanılması
Uniswap kodunda, mevcut fiyat ve likiditeye göre takas edilen token'ları hesaplamak gibi birçok hesaplama mantığı vardır. Bu süreçte, bölme işlemleri sırasında hassasiyeti kaybetmekten kaçınmalıyız. Uniswap'ta, hesaplama süreci genellikle
Kod şu şekildedir (fiyat ve likidite üzerinden işlem için gereken token sayısı hesaplanır):
Gördüğünüz gibi öncelikle Uniswap'taki fiyat, 2 ^ 96'nın karekökü ile çarpılır (yukarıdaki kodda sqrtRatioAX 96 ve sqrtRatioBX 96'ya karşılık gelir) ve ardından likidite likiditesi sola kaydırılarak pay 1 hesaplanır. Sonraki hesaplamada, nihai sonuca ulaşmak için hesaplama sürecinde 2 ^ 96 elenir.
Elbette ne olursa olsun teoride yine bir kesinlik kaybı yaşanacaktır ama bu durumda en küçük birim kaybolmuş olur ki bu da kabul edilebilir bir durumdur.
Daha fazla bilgi için bu kurstan daha fazlasını öğrenebilirsiniz https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md adresinde .
Pay kullanarak geliri hesaplayın
Uniswap'ta, LP'nin (likidite sağlayıcıları) ücret gelirini kaydetmemiz gerekir. Açıkçası, her işlemdeki her LP için ücreti kaydedemeyiz, bu da çok fazla Gas tüketecektir. Peki bununla nasıl başa çıkılır?
Uniswap'ta aşağıdaki yapının olduğunu görebiliriz kesinliklePozisyonda:
Her bir pozisyonun (Pozisyon) son kez ücretini çektiğinde her bir likiditenin alması gereken ücreti kaydeden feeGrowthInside0LastX128 ve feeGrowthInside1LastX128'i içerir.
Basitçe söylemek gerekirse, sadece toplam ücreti ve her likiditeye ne kadar ücret tahsis edilmesi gerektiğini kaydetmem gerekiyor, böylece LP ücreti çektiğinde, elindeki likiditeye göre ne kadar ücret çekebileceğini hesaplayabilir. Bir şirketin hissesini tutuyorsanız, hisse gelirini çekmek istediğinizde, sadece şirketin hisse başına geçmiş kazançlarını ve en son çektiğiniz zamanki geliri bilmeniz gerekir.
Daha önce stETH kar hesaplama yöntemini yazımızda tanıtmıştık Ustaca sözleşme tasarımı, stETH'in karları günlük olarak nasıl otomatik olarak dağıttığını görün? ETH'nizin istikrarlı faiz elde etmek için staking'e katılmasına izin verin ve prensip de benzerdir.
Tüm bilgilerin zincirden alınması gerekmez
Zincir üstü depolama nispeten pahalıdır, bu nedenle tüm bilgileri zincir üstünde depolamamız veya zincirden almamız gerekmez. Örneğin, Uniswap ön uç web sitesi tarafından çağrılan arayüzlerin çoğu geleneksel Web2 arayüzleridir.
İşlem havuzlarının listesi, işlem havuzları hakkında bilgiler vb. hepsi sıradan veritabanlarında saklanabilir. Bazılarının zincirden düzenli olarak senkronize edilmesi gerekebilir, ancak ilgili verileri elde etmek için zincir veya düğüm hizmeti tarafından sağlanan RPC arayüzünü gerçek zamanlı olarak çağırmamıza gerek yoktur.
Elbette, birçok blockchain PRC tedarikçisi artık bazı gelişmiş arayüzler sağlıyor, benzer şekilde daha hızlı ve daha ucuz bir şekilde bazı verileri alabilirsiniz. Örneğin, ZAN belirli bir kullanıcı altındaki tüm NFT'leri almaya benzer bir arayüz sağlar. Bu bilgiler açıkça performansı ve verimliliği artırmak için önbelleğe alınabilir. Ziyaret edebilirsiniz https://zan.top/service/advance-api Daha fazlasını elde etmek için.
Elbette, önemli işlemlerin zincir üzerinde gerçekleştirilmesi gerekiyor.
Sözleşmeleri nasıl böleceğinizi ve ERC 721 gibi mevcut standart sözleşmeleri nasıl kullanacağınızı öğrenin
Bir proje birden fazla gerçekten dağıtılmış sözleşme içerebilir. Sadece bir sözleşme gerçekten dağıtılmış olsa bile, kodumuz sözleşmeyi miras yoluyla bakım için birden fazla sözleşmeye bölebilir.
Örneğin Uniswap'ta, https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol contract birçok sözleşmeyi devralır ve kodu aşağıdaki gibidir:
Ve ERC 721 Permit sözleşmesinin uygulanmasına baktığınızda, doğrudan @openzeppelin/contracts/token/ERC 721/ERC 721.sol sözleşmesini kullandığını göreceksiniz. Bu, pozisyonları NFT aracılığıyla yönetmeyi kolaylaştırır ve diğer yandan, sözleşme geliştirmenin verimliliğini artırmak için mevcut standart sözleşmeleri de kullanabilir.
Kursumuzda şunları öğrenebilirsiniz: https://github.com/WTFAcademy/WTF-Dapp/blob/main/P 108 _PositionManager /readme.md ve pozisyonları yönetmek için basit bir ERC 721 sözleşmesi geliştirmeye çalışın.
Özetle
Ne kadar çok makale okursanız okuyun, kendiniz geliştirmek kadar pratik değildir. Merkezi olmayan bir borsanın basitleştirilmiş bir versiyonunu kendiniz uygulamaya çalışırken, Uniswap kod uygulaması hakkında daha derin bir anlayışa sahip olabilir ve gerçek projelerde deneyimleyeceğiniz daha fazla bilgi noktası öğrenebilirsiniz.
WTF-DApp kursu, ZAN geliştirici topluluğu ve WTF Academy geliştirici topluluğu tarafından ortaklaşa tamamlanan açık kaynaklı bir kurstur. Web3 ve Defi proje geliştirmeyle de ilgileniyorsanız, pratik kursumuza başvurabilirsiniz https://github.com/WTFAcademy/WTF-Dapp ve değişimin basit bir versiyonunu adım adım tamamlayın. Kesinlikle size yardımcı olacağına inanıyorum~
Bu makale Fisher (X hesabı) tarafından yazılmıştır @yudao 1024 ) ZAN Ekibi (X hesabı) @zan_takımı ).
Bu makale internetten alınmıştır: Web3 Başlangıç Serisi: Uniswap Kodundan Öğrendiğim Sözleşme Geliştirme İpuçları
İlgili: Bir Sonraki 100x Mücevheri Bulmak: ChatGPT ile Pump.fun'da Nasıl Para Kazanılır
Orijinal yazar: CMed Editör notu: Pump piyasasında her an yeni token'lar piyasaya sürülüyor. Piyasadaki diğerleri hala aşırı getiri sağlayabilecek bir memecoin bulmak için samanlıkta iğne ararken, @AlphaBatcher otomatik hassas ticaret elde etmek için Chatgpt'yi kullandı. Bu metodoloji büyük miktarda sermaye veya güçlü programlama becerileri gerektirmez. Memecoin yatırımlarımızı güçlendirmek için yapay zekayı kullanabiliriz. Aşağıda orijinal metin bulunmaktadır (daha kolay okuma ve anlama için orijinal içerik silindi ve yeniden düzenlendi): ChatGPT ve PumpFun kullanarak 1 dakikada $2300 yaptım. Diğerleri hala memecoin'lerde fırsatlar ararken, ben zaten doğru ticareti otomatikleştiriyordum. Başlamak için sadece 0,2 SOL'ye ihtiyacınız var ve hiçbir programlama becerisine…