Önsöz
Merkezi olmayan finansın (DeFi) hızla gelişmesiyle birlikte Uniswap, lider bir merkezi olmayan borsa olarak yeniliğin ön saflarında yer aldı. Bu makale, Uniswap v3 protokolünün temel mekanizmasının derinlemesine bir analizini ve merkezi likidite, çoklu oranlar, token değişimi ve flash krediler gibi temel işlevler de dahil olmak üzere işlevsel tasarımının ayrıntılı bir açıklamasını sunacak ve aynı zamanda aşağıdakiler için ilgili denetim noktalarını sağlayacaktır: denetçiler. (Not: Bu makaledeki görseller https://www.figma.com/board/QyIpAUR93MxZ4XZZf2QjDk/uniswap-v3 adresinden yüksek çözünürlüklü olarak görüntülenebilir.)
Mimari analizi
Uniswap v3 protokolü temel olarak dört modülden oluşur:
- PositionManager: Kullanıcıların likidite işlemlerini gerçekleştirmesine yönelik ana arayüz Kullanıcılar, token havuzları oluşturabilir, likidite sağlayabilir/kaldırabilir ve ERC721'i likidite sağlayıcıları (LP) için kimlik bilgileri olarak kullanabilir.
- SwapRouter: Kullanıcıların token alışverişi yapma girişidir. Kullanıcılar bu modül aracılığıyla token değişim işlemlerini tamamlayabilirler.
- Havuz: Token işlemlerinin, likidite yönetiminin, işlem ücretlerinin toplanmasının ve Oracle veri yönetimi işlevlerinin uygulanmasından sorumludur. Bunlar arasında Tick mekanizması fiyat aralığını birden fazla ince ölçeğe böler.
- Fabrika: Havuz sözleşmelerini oluşturmak ve yönetmek için kullanılır.
Süreç sıralama
Belirteç çifti oluşturma
Kullanıcılar bunu createAndInitializePoolIfNecessary işlevi aracılığıyla yapabilir. Kullanıcının token çiftinin token0, token1, işlem ücreti (ücreti) ve başlangıç fiyatını () girmesi gerekir. Öncelikle sistem, getPool işlevi aracılığıyla token çiftinin mevcut olup olmadığını kontrol edecektir. Eğer oluşturulmamışsa, createPool çağrılacak ve ticaret çiftini dağıtmak için CREATE2 talimatı kullanılacaktır. Son olarak, başlatma işlevi fiyat, işlem ücreti, onay işareti, oracle ve diğer ilgili parametrelerin başlatılmasını tamamlamak için kullanılır.
Likidite sağlayın
Likidite sağlayın
Kullanıcılar, nane işlevi aracılığıyla yeni likidite pozisyonları oluşturabilir ve ilgili NFT'leri oluşturabilir veya Likidite artırma işlevi aracılığıyla mevcut NFT likidite pozisyonlarına likidite ekleyebilir. İlk olarak sistem, işlemin belirtilen zaman aralığında yürütülüp yürütülmediğini kontrol edecek ve ardından belirli işlemi tamamlamak için addLiquidity işlevini çağıracaktır. Bu fonksiyonda öncelikle havuzun adresi ve likiditesi hesaplanır ve ardından kullanıcının Pozisyonunu güncellemek, alt, üst tik ve toplam birikmiş işlem ücretini değiştirmek için _updatePosition çağrılır. Daha sonra sistem _modifyPosition aracılığıyla likidite ekler, onayın üst ve alt sınır koşullarını karşılamasını sağlar, hesaplanan token0 ve token1 (int256) sayısını döndürerek havuza gönderir. Son olarak sistem, kullanıcının tokenId'sine dayalı olarak ilgili Pozisyon bilgisini günceller.
Likiditeyi kaldır
Kullanıcılar Likiditeyi Azaltma işlevi aracılığıyla likiditeyi kaldırabilirler. Sistem öncelikle LP sertifikasının yetkisini ve işlemin zaman geçerliliğini kontrol edecektir. Havuzun yeterli likiditeye sahip olmasını sağlamak amacıyla likiditeyi gidermek için yakma işlevini çağırın. Daha sonra sistem, kaldırılan gerçek token sayısının kullanıcı tarafından belirlenen minimum gereksinimleri karşılayıp karşılamadığını doğrulayacak ve kullanıcının Pozisyon bilgisini buna göre güncelleyecektir.
takas
Kullanıcılar, kesinInput işlevi aracılığıyla ödenmesi gereken token sayısını ve elde edilmesi beklenen minimum token sayısını belirleyebilir veya ödenecek maksimum token sayısını belirleyebilir ve kesinOutput işlevi aracılığıyla elde edilmesi beklenen token sayısını ayarlayabilir. Sistem önce yolu (yolu) ayrıştırır ve ardından takas işleminin her adımını tamamlamak için kesinInputInternal veya kesinOutputInternal işlevini çağırır.
Takas işlevinde sistem, diğer işlemlerin durum değişkenlerinin güncellenmesine müdahale etmesini önlemek için ilk önce kilidin açık durumunu kilitler. Döngüye girdikten sonra sistem, onay işareti aracılığıyla bir sonraki işlem fiyatını bulur ve tokenIn veya tokenOut kullanıcının beklentisine ulaşana kadar her adımda değişimi hesaplamak için computeSwapStep işlevini çağırır. Sistem aynı zamanda ücretler, likidite, keneler ve fiyatlara ilişkin değerleri de güncelleyecektir. Onay işareti değişirse Oracle verilerinin de güncellenmesi gerekir. Bu işlemler tamamlandıktan sonra sistem kullanıcıya tokenOut öder ve kullanıcı da uniswapV3SwapCallback geri çağırma fonksiyonu aracılığıyla tokenIn'e ödeme yapar. Bu mekanizma bir flash swap olarak kabul edilebilir. Daha sonra sistem, sözleşme bakiyesinin eşleşip eşleşmediğini kontrol edecek ve onaylandıktan sonra kilitlenmemiş durumun kilidini açacaktır.
Yoldaki tüm takas işlemleri tamamlandığında ve işlem kullanıcının beklentilerini karşıladığında işlem başarılı bir şekilde sona erer.
flaş
Kullanıcılar flaş işlevleri aracılığıyla flaş ödünç verme işlemlerini gerçekleştirebilirler. Sistem öncelikle borçlanma ücretini hesaplayacak ve ardından kullanıcının ihtiyaç duyduğu tokenı belirlenen borç verme adresine gönderecektir. Daha sonra sistem kullanıcının uyguladığı uniswapV3FlashCallback fonksiyonunu geri çağırır ve kullanıcı bu fonksiyonda geri ödeme işlemini tamamlar. Sistem, geri aramanın ardından sözleşme bakiyesindeki değişikliği kontrol ederek, kullanıcının kredi tutarıyla tutarlı olduğundan emin olacak ve ilgili işlem ücretini güncelleyecektir. Kullanıcılar, flaş işlevine ek olarak, takas işlemleri yoluyla, yani işlem süreci sırasında tokenleri önce ödünç alıp sonra geri ödeyerek benzer flaş kredi işlevlerini de uygulayabilirler.
Denetim noktaları
Denetim noktaları
1. Takas işleminden sonra iadeETH'nin çağrılıp çağrılmadığını kontrol edin
ExactInput işlevinde kullanıcının ödenecek token sayısını ve elde edilmesi beklenen minimum token sayısını belirtmesi gerekir. uniswapV3SwapCallback çağrılmadan önce sistem, kullanıcıların tokenleri doğru şekilde gönderebilmesini sağlamak için miktar0 ve miktar1'i yeniden hesaplayacaktır. Ancak ETH ile takas yaparken kullanıcıların işlemle birlikte ETH'yi de göndermeleri gerekiyor. İşlem sırasında ETH'nin tamamı kullanılmasa bile işlev, fazlası otomatik olarak iade etmeyecektir. ExactInput işlevi yalnızca miktarOut değerini döndürür, dolayısıyla yatırımcılar bu borsa tarafından gerçekte ne kadar ETH tüketildiğini doğrudan bilemezler.
Ek olarak, kullanılmayan ETH'yi sözleşmeden çekmek için herkes iadeETH işlevini arayabilir. Bu nedenle, kullanıcıların kullanılmayan ETH'yi protokolde bırakmasını önlemek için swap işleminden sonra returnETH'nin çağrılıp çağrılmadığının kontrol edilmesi veya tek işlemde birden fazla işlev çağrısını tamamlamak için MultiCall fonksiyonunun kullanılması önerilir.
2. Oracle fiyatını elde etmek için TWAP'in uygulanıp uygulanmadığını kontrol edin
Uniswap'i fiyat kaynağı olarak kullanırken, harici protokol sqrtPriceX96'yı elde etmek için doğrudan Slot0'a eriştiğinde fiyat manipülasyonu riski oluşabilir. Saldırganlar, işlemleri gerçekleştirirken uygun fiyatlar elde etmek için takas ve diğer yöntemlerle likidite havuzunun durumunu manipüle edebilir.
Bu riski azaltmak için, geliştiricilerin fiyatları elde etmek için Zaman Ağırlıklı Ortalama Fiyat'ı (TWAP) daha fazla uygulamaları önerilir; çünkü TWAP, kısa vadede şiddetli fiyat dalgalanmalarının etkisini etkili bir şekilde azaltabilir ve fiyatların manipüle edilmesini daha zor hale getirebilir.
3. Kullanıcıların kayma parametrelerini kendilerinin ayarlamasına izin verilmesi tavsiye edilir.
Diğer protokoller takas işlemleri için Uniswap v3 kullandığında, geliştiricilerin iş senaryolarına göre kayma korumasını ayarlaması ve sandviç saldırılarını önlemek için kullanıcıların parametreleri kendilerinin ayarlamasına izin vermesi önerilir. Bu takas fonksiyonunda dördüncü parametre sqrtPriceLimitX96, kullanıcının takası gerçekleştirmek istediği minimum veya maksimum fiyatı belirtmek için kullanılır. Bu parametre, işlem süreci sırasında aşırı fiyat dalgalanmalarını etkili bir şekilde önleyebilir ve böylece kullanıcıların aşırı kaymadan kaynaklanan kayıplarını azaltabilir.
4. Likidite havuzu beyaz listesi mekanizmasının tanıtılması tavsiye edilir
Uniswap v3'te, aynı ERC20 token çifti, farklı ücretlere bağlı olarak aynı anda birden fazla likidite havuzunda (Havuz) mevcut olabilir. Tipik olarak, likiditenin çoğunluğunu birkaç likidite havuzu tutarken, diğer havuzlarda çok az Kilitli Toplam Hacim (TVL) bulunabilir veya henüz oluşturulmamış bile olabilir. Bu düşük TVL havuzlarının fiyat manipülasyonunun hedefi olma olasılığı daha yüksektir.
Bu nedenle proje tarafları likidite havuzu verilerini kullanmayı seçtiklerinde veri kaynağı olarak sadece LP'yi kullanmaktan kaçınmalıdırlar. Verilerin güvenilirliğini sağlamak amacıyla, yeterli likiditeye sahip ve manipülasyonu zor olan havuzları taramak amacıyla bir beyaz liste mekanizmasının devreye sokulması tavsiye edilir. Bu mekanizma, riski önemli ölçüde azaltabilir, fiyat referans verilerinin güvenliğini ve doğruluğunu sağlarken, çok düşük TVL'ye sahip havuzların manipülasyonundan kaynaklanan potansiyel kayıpları da önleyebilir.
5. TickMath.sol, FullMath.sol ve Position.sol'da işaretlenmemiş seçeneğin kullanılıp kullanılmadığını kontrol edin
Uniswap v3'te TickMath, FullMath ve Position gibi modüller, Solidity'deki taşma işleme mekanizmasına dayanan karmaşık matematiksel hesaplamaları gerçekleştirmek için kullanılır. Solidity'nin önceki sürümlerinde (<0.8.0), tamsayı taşması ve yetersiz akış davranışı varsayılan olarak istisnalar atmıyordu, dolayısıyla kod bu varsayıma dayalı olarak normal şekilde çalışabiliyordu. Ancak Solidity 0.8.0 sürümünden itibaren taşma ve yetersiz akış, otomatik olarak istisnalar oluşturacak ve bu da mevcut kodun yürütülmesini etkileyecektir. Bu modüllerin Solidity 0.8.0 ve üzeri sürümlerde düzgün çalıştığından emin olmak için geliştiricilerin belirli işlevlerde denetlenmeyen kod bloklarını kullanarak taşma denetimini manuel olarak devre dışı bırakması gerekir. Bu, önceki sürümlerdeki davranışı geri yükler ve taşmaya duyarlı işlemlerin verimli bir şekilde yürütülmesini sağlar.
Solidity 0.8.0 ve üzeri için resmi destek ve ayarlamalar yapılmıştır. Ayrıntılar için lütfen bu güncellemeye bakın (https://github.com/Uniswap/v3-core/commit/6562c52e8f75f0c10f9deaf44861847585fc8129). Bu değişiklik TickMath, FullMath ve diğer ilgili modüllerin derleyicinin yeni sürümleri altında doğru şekilde çalışmaya devam etmesini sağlar.
6. Yol kodlama ve kod çözme yöntemlerinin aynı olup olmadığını kontrol edin
Uniswap v3'ün kesinInput ve kesinOutput işlevlerinde, adım adım token değişim işlemleri için kullanıcıların tokenA-fee-tokenB gibi sabit bir formata göre kodlanması ve kodunun çözülmesi gereken path parametresini girmeleri gerekir. Bu yol yapısı, işlemin her atlamasında yer alan iki tokenı ve aralarındaki ücret seviyesini açıkça belirtir. Harici bir protokolün Uniswap v3'ün belirteç değişim işlevini kullanırken farklı bir yol kod çözme yöntemi seçmesi, Uniswap'in beklenen yol biçimiyle tutarsız bir yol biçimiyle sonuçlanabilir. Bu durumda protokol, yolu doğru şekilde çözemeyebilir ve bu nedenle amaçlanan token değişim işlemini başarıyla gerçekleştiremeyebilir.
Bu nedenle geliştiricilerin, Uniswap v3'ün belirteç değişim işlevini entegre ederken harici protokollerin Uniswap'in yol kodlama kurallarına sıkı sıkıya uymasını sağlamaları önerilir. Yol kod çözme hatalarını önlemek için, harici protokoller, işlem hatalarını veya beklenmeyen sonuçları önlemek amacıyla, kesinInput ve kesinÇıktı çağrılırken yol parametresinin biçimini dikkatle kontrol etmelidir.
Bu nedenle geliştiricilerin, Uniswap v3'ün belirteç değişim işlevini entegre ederken harici protokollerin Uniswap'in yol kodlama kurallarına sıkı sıkıya uymasını sağlamaları önerilir. Yol kod çözme hatalarını önlemek için, harici protokoller, işlem hatalarını veya beklenmeyen sonuçları önlemek amacıyla, kesinInput ve kesinÇıkış çağrılırken yol parametresinin biçimini dikkatle kontrol etmelidir.
7. Belirteç sırasının proje mantığını etkileyip etkilemediğini kontrol edin
Uniswap'te token0 daha düşük dereceli tokendır ve temel token olarak kullanılırken token1 daha yüksek sıralı tokendır ve teklif tokeni olarak kullanılır. Uniswap, jeton çiftlerinin sırasının havuzda her zaman tutarlı olmasını sağlamak için iki jetonun adreslerini sözlüksel olarak sıralar.
Ancak aynı tokenin farklı blockchain ağlarındaki sözleşme adresleri farklı olabileceğinden, özellikle zincirler arasında dağıtılan sözleşmeler için tokenların sıralama düzeni değişebilir. Bu değişiklik token0 ve token1'in rollerinin tersine dönmesine neden olacak ve dolayısıyla fiyat performansını etkileyecektir. Örneğin, bazı zincirlerde belirli bir token token0 olabilir, ancak diğer zincirlerde token1 olarak sipariş edilebilir, bu da temel token ile alıntılanan token arasında farklı bir ilişkiye neden olur ve sonuçta görüntülenen fiyatı etkiler. Bu nedenle geliştiricilerin, token sırasının proje mantığını etkileyip etkilemeyeceğini kontrol etmeleri önerilir. Özellikle çapraz zincir ortamında, fiyat performansı üzerinde olumsuz etkilerden kaçınmak için token sırasının neden olabileceği fiyat sorunlarını mutlaka göz önünde bulundurun. işlem mantığı.
Özetle
Yukarıdaki temel kontrol öğeleri, Uniswap v3'ün mevcut sürümünü temel alır ve denetçiler tarafından Uniswap v3 ile etkileşime giren projeleri kontrol etmek için kullanılır. Farklı projelerin uygulanmasının kendine has özellikleri vardır, bu nedenle denetçilerin anlaşmayı derinlemesine anlamaları ve fiili duruma göre sıkı denetimler yapmaları gerekir. SlowMist güvenlik ekibi, geliştirilmekte olan projeler için geliştiricilerin, protokolün güvenliğini ve güvenilirliğini sağlamak amacıyla geliştirme süreci sırasında bu kontrolleri dikkatle değerlendirmelerini önerir.
Yazar |
Editör |
Tüm Yorumlar