Son zamanlarda merkeziyetsiz borsa geliştirme sürecini araştırırken, bazı tanınmış projelerin kod uygulamalarını inceledim ve birçok ilginç bilgi edindim. Defi sözleşmesi geliştirmeye ilk kez girişen bir geliştirici olarak, bu küçük ipuçları sözleşme geliştirmeyi öğrenmek isteyen acemiler için oldukça faydalı.
Bu ince hilelere bir göz atalım, bazıları gerçekten de şaşırtıcı beceriler olarak adlandırılabilir.
öngörülebilir sözleşme dağıtım adresi
Genellikle dağıtılan sözleşmenin elde edilen adresi nonce ile ilgili olduğu için rastgele görünür. Ancak bazı durumlarda, işlem eşdeğer bilgilerini kullanarak sözleşme adresini çıkarmamız gerekir, örneğin işlem yetkisini belirlemek veya havuz adresini almak gibi.
Bir yöntem, CREATE2 kullanarak sözleşme oluşturmak ve salt parametresini eklemektir: pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); Bu şekilde oluşturulan sözleşme adresi tahmin edilebilir, oluşturma mantığı yeni adres = hash("0xFF", oluşturucu adres, salt, initcode).
Geri çağırma fonksiyonunu ustaca kullanma
Solidity'de sözleşmeler birbirlerini çağırabilir. Bir model A'nın B'nin yöntemini çağırmasıdır, B çağrılan yöntemde A'yı geri çağırır, bu bazı senaryolarda çok kullanışlıdır.
Örneğin, UniswapV3Pool sözleşmesinin swap metodunu kullanarak işlem yaparken, swapCallback'i geri çağırır ve hesaplanan bu işlem için gerçekten gerekli Token'i iletir. Çağrıcı, geri çağırma sırasında gerekli Token'i UniswapV3Pool'a aktarmalıdır, swap metodunu iki parçaya ayırmamalıdır. Bu, swap metodunun güvenliğini ve tam olarak uygulanmasını garanti eder, karmaşık değişken kayıtlarına gerek kalmadan.
Anormallik ile bilgi iletimi, işlem tahmini gerçekleştirmek için try catch kullanın.
Bazı sözleşmelerde, ticaret geri çağırma işlevinde özel hatalar fırlatarak, ardından bu hatayı yakalayıp hata mesajından gerekli bilgileri çözerek ticaret tahmini gerçekleştirilir. Bu yöntem görünüşte hileli olsa da oldukça pratiktir, tahmin ticaret ihtiyaçları için swap yöntemini yeniden yapılandırmaya gerek yoktur, mantık daha basittir.
Büyük sayılar hassasiyet sorununu çözer
Büyük hesaplamalar içeren senaryolarda, mevcut fiyat ve likiditeye göre değişim token'lerini hesaplamak için, bölme işlemlerinin neden olduğu hassasiyet kaybından kaçınılmalıdır. Bir yöntem, << FixedPoint96.RESOLUTION gibi sola kaydırma işlemi kullanmaktır, bu da 2^96 ile çarpmaya eşdeğerdir. Sola kaydırmadan sonra yapılan bölme işlemi, normal işlemlerde taşma olmadığında hassasiyeti garanti eder.
Paylaşım yöntemi ile kazanç hesaplama
Her işlemde her LP için işlem ücretlerini kaydetmek mümkün olmayan, LP( likidite sağlayıcı ) ücret kazançlarını kaydetmesi gereken senaryolar için, bu büyük miktarda Gas tüketir.
Bir çözüm, toplam işlem ücretini ve her bir likiditeye dağıtılması gereken işlem ücretini kaydetmektir. LP, işlem ücretlerini çekerken, sahip olduğu likiditeye göre çekilebilecek işlem ücretini hesaplar. Bu, hisse senedi sahiplerinin temettü çekme mekanizmasına benzer.
Zincir üstü ve zincir altı bilgi edinme dengesi
Tüm bilgilerin zincir üzerinden alınması gerekmez. Zincir üzerindeki depolama görece pahalıdır, birçok bilgi geleneksel veritabanlarında saklanabilir, örneğin işlem havuzu listesi, işlem havuzu bilgileri vb. Bu veriler, zincir üzerinden düzenli olarak senkronize edilebilir, gerçek zamanlı olarak zincir veya düğüm hizmetlerinin RPC arayüzüne çağrı yapılmasına gerek yoktur.
Bazı blok zinciri RPC sağlayıcıları, belirli verilere daha hızlı ve daha ekonomik bir şekilde erişim sağlamak için gelişmiş arayüzler sunar. Bu arayüzler genellikle performansı ve verimliliği artırmak için önbellek kullanır.
Sözleşme Bölme ve Standart Sözleşme Kullanımı
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, kod, miras alma yoluyla birden fazla sözleşmeye bölünebilir ve bakım yapılabilir.
Ayrıca, mevcut standart sözleşmelerden, örneğin ERC721'den yararlanarak sözleşme geliştirme verimliliğini artırabilirsiniz. Bu sadece yönetimi kolaylaştırmakla kalmaz, aynı zamanda olgun standartlardan yararlanarak geliştirme hızını ve güvenliğini artırır.
özet
Gerçek uygulama geliştirme, akıllı sözleşme geliştirmeyi öğrenmenin en etkili yoludur. Basit bir merkeziyetsiz borsa uygulaması yapmayı denemek, tanınmış projelerin kod uygulamalarını daha derinlemesine anlamanıza yardımcı olacak ve gerçek projelerdeki daha fazla bilgi noktası öğrenmenizi sağlayacaktır. Uygulama yapın, buna kesinlikle yardımcı olacağına inanıyorum.
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.
18 Likes
Reward
18
6
Repost
Share
Comment
0/400
ServantOfSatoshi
· 08-12 16:04
Bu, tam olarak "sarsıcı işlemler" demek değil mi?
View OriginalReply0
mev_me_maybe
· 08-11 22:32
Yeni başlayanlar kafe ne büyük sırlar keşfetti, hepsi eski laflar.
View OriginalReply0
CommunityLurker
· 08-11 16:39
Çaylak mı? Önce bir hello world yazmanızı öneririm.
View OriginalReply0
Blockwatcher9000
· 08-10 12:50
Güzel bir şekilde söylemek, tekniklerdir. Gerçekte ise her türlü kurnaz hareketlerdir.
View OriginalReply0
OnChainDetective
· 08-10 12:46
create2 dağıtımını uzun zamandır araştırıyorum. Bu yöntem muhtemelen yerleştirilmiş mayınlar için kullanılıyor.. anlayanlar anlar.
View OriginalReply0
ContractExplorer
· 08-10 12:42
Yeni bir açığın keşfi en keyifli olanıdır. Açıklarla yarışmak.
7 pratik ipucu, akıllı sözleşmeler geliştirmeyi öğrenmenize yardımcı olur
Sözleşme geliştirmede ince teknikler
Son zamanlarda merkeziyetsiz borsa geliştirme sürecini araştırırken, bazı tanınmış projelerin kod uygulamalarını inceledim ve birçok ilginç bilgi edindim. Defi sözleşmesi geliştirmeye ilk kez girişen bir geliştirici olarak, bu küçük ipuçları sözleşme geliştirmeyi öğrenmek isteyen acemiler için oldukça faydalı.
Bu ince hilelere bir göz atalım, bazıları gerçekten de şaşırtıcı beceriler olarak adlandırılabilir.
öngörülebilir sözleşme dağıtım adresi
Genellikle dağıtılan sözleşmenin elde edilen adresi nonce ile ilgili olduğu için rastgele görünür. Ancak bazı durumlarda, işlem eşdeğer bilgilerini kullanarak sözleşme adresini çıkarmamız gerekir, örneğin işlem yetkisini belirlemek veya havuz adresini almak gibi.
Bir yöntem, CREATE2 kullanarak sözleşme oluşturmak ve salt parametresini eklemektir: pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); Bu şekilde oluşturulan sözleşme adresi tahmin edilebilir, oluşturma mantığı yeni adres = hash("0xFF", oluşturucu adres, salt, initcode).
Geri çağırma fonksiyonunu ustaca kullanma
Solidity'de sözleşmeler birbirlerini çağırabilir. Bir model A'nın B'nin yöntemini çağırmasıdır, B çağrılan yöntemde A'yı geri çağırır, bu bazı senaryolarda çok kullanışlıdır.
Örneğin, UniswapV3Pool sözleşmesinin swap metodunu kullanarak işlem yaparken, swapCallback'i geri çağırır ve hesaplanan bu işlem için gerçekten gerekli Token'i iletir. Çağrıcı, geri çağırma sırasında gerekli Token'i UniswapV3Pool'a aktarmalıdır, swap metodunu iki parçaya ayırmamalıdır. Bu, swap metodunun güvenliğini ve tam olarak uygulanmasını garanti eder, karmaşık değişken kayıtlarına gerek kalmadan.
Anormallik ile bilgi iletimi, işlem tahmini gerçekleştirmek için try catch kullanın.
Bazı sözleşmelerde, ticaret geri çağırma işlevinde özel hatalar fırlatarak, ardından bu hatayı yakalayıp hata mesajından gerekli bilgileri çözerek ticaret tahmini gerçekleştirilir. Bu yöntem görünüşte hileli olsa da oldukça pratiktir, tahmin ticaret ihtiyaçları için swap yöntemini yeniden yapılandırmaya gerek yoktur, mantık daha basittir.
Büyük sayılar hassasiyet sorununu çözer
Büyük hesaplamalar içeren senaryolarda, mevcut fiyat ve likiditeye göre değişim token'lerini hesaplamak için, bölme işlemlerinin neden olduğu hassasiyet kaybından kaçınılmalıdır. Bir yöntem, << FixedPoint96.RESOLUTION gibi sola kaydırma işlemi kullanmaktır, bu da 2^96 ile çarpmaya eşdeğerdir. Sola kaydırmadan sonra yapılan bölme işlemi, normal işlemlerde taşma olmadığında hassasiyeti garanti eder.
Paylaşım yöntemi ile kazanç hesaplama
Her işlemde her LP için işlem ücretlerini kaydetmek mümkün olmayan, LP( likidite sağlayıcı ) ücret kazançlarını kaydetmesi gereken senaryolar için, bu büyük miktarda Gas tüketir.
Bir çözüm, toplam işlem ücretini ve her bir likiditeye dağıtılması gereken işlem ücretini kaydetmektir. LP, işlem ücretlerini çekerken, sahip olduğu likiditeye göre çekilebilecek işlem ücretini hesaplar. Bu, hisse senedi sahiplerinin temettü çekme mekanizmasına benzer.
Zincir üstü ve zincir altı bilgi edinme dengesi
Tüm bilgilerin zincir üzerinden alınması gerekmez. Zincir üzerindeki depolama görece pahalıdır, birçok bilgi geleneksel veritabanlarında saklanabilir, örneğin işlem havuzu listesi, işlem havuzu bilgileri vb. Bu veriler, zincir üzerinden düzenli olarak senkronize edilebilir, gerçek zamanlı olarak zincir veya düğüm hizmetlerinin RPC arayüzüne çağrı yapılmasına gerek yoktur.
Bazı blok zinciri RPC sağlayıcıları, belirli verilere daha hızlı ve daha ekonomik bir şekilde erişim sağlamak için gelişmiş arayüzler sunar. Bu arayüzler genellikle performansı ve verimliliği artırmak için önbellek kullanır.
Sözleşme Bölme ve Standart Sözleşme Kullanımı
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, kod, miras alma yoluyla birden fazla sözleşmeye bölünebilir ve bakım yapılabilir.
Ayrıca, mevcut standart sözleşmelerden, örneğin ERC721'den yararlanarak sözleşme geliştirme verimliliğini artırabilirsiniz. Bu sadece yönetimi kolaylaştırmakla kalmaz, aynı zamanda olgun standartlardan yararlanarak geliştirme hızını ve güvenliğini artırır.
özet
Gerçek uygulama geliştirme, akıllı sözleşme geliştirmeyi öğrenmenin en etkili yoludur. Basit bir merkeziyetsiz borsa uygulaması yapmayı denemek, tanınmış projelerin kod uygulamalarını daha derinlemesine anlamanıza yardımcı olacak ve gerçek projelerdeki daha fazla bilgi noktası öğrenmenizi sağlayacaktır. Uygulama yapın, buna kesinlikle yardımcı olacağına inanıyorum.