1. Anasayfa
  2. Solidity

En Yaygın 10 Solidity Problemi

En Yaygın 10 Solidity Problemi
Solidity Problemi
0

En Yaygın 10 Solidity Problemi

Bu kılavuz, güvenlik açıklarını anlamanıza ve bunlardan kaçınmanıza yardımcı olmak için en önemli 10 Solidity sorununu incelemeyi amaçlamaktadır.

Solidity, programlama dünyasına oldukça yeni bir katkı olsa da, yaygın olarak benimsenmesi, bu programlama dilinin ne kadar popüler olduğu konusunda size net bir fikir verecektir. Bununla birlikte, akıllı sözleşmeler geliştirmek için bu dili aşırı kullanma çılgınlığı nedeniyle , çoğu kişi Solidity‘nin getirdiği temel sorunları genellikle gözden kaçırır. Şu anda bile, bu Solidity güvenlik açıklarını anlamayan ve olduğu gibi kullanmaya devam eden, dolayısıyla istismar edilecek büyük boşluklar yaratan birçok geliştirici var.

Burada, en önemli 10 Solidity sorununu inceleyeceğiz ve bu yeni programlama dilini kendi avantajınıza nasıl kullanacağınızı anlamanıza yardımcı olacağız. Bu makale, esas olarak geliştiricilere, geçmişi tekrar etmelerini önlemeleri için rehberlik etmeyi amaçlamaktadır.

Solidity Nedir?

Solidity konularına geçmeden önce Solidity‘nin tanımıyla başlayalım. Solidity aslında nesne yönelimli ve özellikle akıllı sözleşmeler geliştirmeye yönelik bir programlama dilidir. Dahası, akıllı sözleşmeler, Ethereum hesaplarının ve durumlarının davranışını yöneten bir blockchain ortamındaki bir tür otomatik sözleşmedir .

Her neyse, aynı zamanda süslü parantezli bir dildir ve eğer onu incelerseniz JavaScript, Python ve C++’dan büyük ölçüde etkilendiğini fark edeceksiniz. Ayrıca, Ethereum Sanal Makinesini kullanır. Dahası, statik olarak yazılır ve karmaşık kullanıcı tanımlı öğeleri, kitaplıkları ve kalıtım özelliğini destekleyebilir. Pratik olarak sağlam bir programlama dilidir ve çoğunlukla müzayedeler, oylama, cüzdanlar, kitle fonlaması, ödemeler vb. için sözleşmeler oluşturmakta kullanılır.

Gerçekte, ECMAScript sözdizimi kullanılarak tasarlanmıştır, böylece blok zinciri geliştiricileri onu kullanmayı tanıdık bulur. Ancak, ECMAScript’ten farklı olarak değişken dönüş türleri ve statik yazımla birlikte gelir. Ancak Solidity ile Mutan ve Serpent gibi diğer EVM hedefli diller arasında belirli farklılıklar vardır. Solidity’de keyfi olarak hiyerarşik yapıları ve Haritalamayı desteklediğini göreceksiniz. Dahası, sözleşmeler çoklu kalıtımı desteklemek için C3 doğrusallaştırmasını da kullanır.

Ayrıca, her sözleşme için tip-güvenli işlevleri kolaylaştıracak bir uygulama ikili arabirimi veya ABI içerir. Dahası, sözleşmelerin daha kullanıcı merkezli bir açıklamasının yer aldığı “Doğal Dil Belirtimi”ni de içerir. Gördüğünüz gibi, çok karmaşık bir programlama dili türüdür.

Ancak, mükemmel bir resim değil. Ethereum blok zincirindeki bu dilin işlevleri dahilinde belirli Solidity güvenlik açıkları vardır . Bunları bilmiyorsanız, bu yeni dili kullanmak daha zor olacaktır. Bu nedenle, sizi konu hakkında eğitmek için aşağıda Solidity konularını tartışacağız.

Temel 10 Solidity Problemi

Solidity harika bir programlama dilidir ve birçok uzman sunduğu yapı ve kullanım kolaylıkları karşısında büyülenmiştir. Ancak, onu bir akıllı sözleşme için kullanmaya başlamadan önce bazı Solidity güvenlik açıklarını ele almanız gerekir.

Kontrol Edilmemiş Harici Çağrı

Bu önemli bir solidity problemidir. Gerçekte, çeşitli yöntemler kullanarak Solidity‘de harici aramalar başlatabilirsiniz. En sık kullanılan işlev, herhangi bir harici hesaba Ether gönderebilen aktarım işlevidir . Ama bunu yapmanın başka yolları da var. Örneğin, bunu yapmak için call() ve send() işlevini de kullanabilirsiniz. Temel olarak geliştiriciler, daha çok yönlü harici çağrılar için call() işlevini kullanır.

Ne yazık ki, gönderme ve arama işlevi yalnızca, aramanın başarılı olup olmadığını size bildiren bir Boolean değeri döndürür. Ancak bu işlevler herhangi bir istisnayla karşılaşırsa, bu durumda görevi gerçekleştiremezler, geri dönmek yerine yalnızca yanlış bir değer döndürürler. Yani dönüş değerini kontrol etmezseniz, işlemin başarılı olup olmadığını bilemezsiniz. Bu nedenle, geliştirici çoğu zaman değeri kontrol etmek yerine bir geri dönüş almayı bekleyebilir.

Bu nedenle, başarısız transferlerin dönüş değerini kontrol etmek tamamen gereklidir.

Daha Fazlasını Okuyun: Solidity Eğitimi – Ayrıntılı Bir Giriş

Solidity Eğitimi

Yeniden Giriş

Bu, birçok blockchain geliştiricisinin fark etmediği bir başka önemli Solidity Problemidir. Gerçekte, Ethereum akıllı sözleşmeleri , diğer harici sözleşmelerden kodları çağırabilen ve hatta kullanabilen özel bir özellikle birlikte gelir. Tipik olarak, sözleşmeler Ether kullanır ve Ether’i diğer harici sözleşme adreslerine gönderir.

Ancak, tüm bu işlevleri yerine getirmek için sözleşmenin harici bir çağrı kullanması gerekir. Aslında, bu harici aramalar yeterli güvenlik özelliklerine sahip değildir; böylece hacker bu kodlara saldırabilir ve onu çağıran sözleşme ile daha fazla görev yürütmesini sağlayabilir. Bu nedenle, kod sözleşmeye yeniden girebilir, bilgileri kötüye kullanabilir ve hatta başka adreslere token gönderebilir.

Solidity Akıllı Sözleşmelerinde Güvenlik Açıklarını Bulma

Solidity Eğitimi

Gerçekte, DAO saldırısında olan tam olarak buydu . Temelde bu saldırı, Ether’i bilinmeyen bir sözleşmeye gönderdiğinizde gerçekleşebilir. Burada saldırgan, harici bir adreste kötü amaçlı bir program oluşturabilir ve bu, geri dönüş işlevini başlatır.

Bu nedenle, bir sözleşme bu adrese herhangi bir miktarda Ether gönderdiğinde, kötü amaçlı programı başlatacaktır. Böylece, artık savunmasız sözleşme, kullanıcının onaylamadığı işlevleri yerine getirmeye başlayacaktır. Dahası, bu program, kullanıcının hiçbir şeyi kalmayıncaya kadar benzer fon transferlerini tekrar tekrar yürütmek için belirli işlevleri geri çağırabilir.

Pahalı Döngüler ve Gaz Limiti

Diğer bir solidity problemi, maliyetli döngü sorunudur. Bildiğiniz gibi, Ethereum blok zincirindeki hesaplama gücü bedava değildir. İşleminizin gerçekleştirileceği hesaplama gücü miktarını elde etmek için Gaz satın almak üzere Ether ödemeniz gerekir. Dolayısıyla, bir şekilde hesaplama adımlarının sayısını azaltabilirseniz, bu durum size zaman ve hatta çok para kazandıracaktır.

Programa döngüler eklemek, maliyetleri artırmanın bir yoludur. Gerçekte, bir dizi zaten birçok döngüyle birlikte gelir. Bununla birlikte, öğeler artarsa, bu belirli döngüyü tamamlamak için daha fazla entegrasyon gerekir. Dolayısıyla, bir saldırgan sonsuz döngüler içerebilirse, mevcut tüm Ethereum Gas’ı tek başına tüketebilir .

Bu durumda, saldırgan dizi uzunluğunun öğelerini etkileyebilir, bu da bir DOS sorunu yaratacak ve sistemin döngüden çıkmasına izin vermeyecektir. Dahası, her sözleşmenin bir Gas limiti olduğu için sözleşmenin durmasını sağlayacaktır. Bu solidity problemi diğer sorunlar kadar ön plana çıkmasa da akıllı sözleşmelerin %8’den fazlasında bu sorun görülüyor.

Akıllı Sözleşme Hackleme Yol Haritası 2023

Solidity Eğitimi

Eşlemeleri Temizleme

Eşlemelerin temizlenmesi, bu programlama dilinin bazı sınırlamalarına sahip olması nedeniyle büyük bir Solidity sorunudur. Gerçekte, Solidity tipi eşleme, blok zinciri platformları için yalnızca depolama olan bir anahtar-değer veri yapısı sunar . Bu nedenle, sıfırdan farklı bir değere sahip tüm anahtarları izlemeyecektir.

Bunun için herhangi bir ekstra bilgi eklemeden bir eşlemeyi temizleyemezsiniz. Dahası, bir dinamik depolama dizisinde, temel tür olarak Eşleme’yi kullanmak istiyorsanız, diziyi silerseniz ve hatta açarsanız, bu Eşleme’yi etkilemez. Dahası, bir yapının üye alanında Mapping‘i bir dinamik depolama dizisinde bir tür olarak kullanırsanız, diziyi silseniz bile burada Mapping de yok sayılır.

Aritmetik Kesinlik

Solidity ile ilgili sorunlardan bir diğeri de kayan nokta sorunlarıdır. Solidity şu anda bile kayan veya sabit noktalı sayıları desteklemiyor. Bu nedenle, bu kayan noktaları temsil etmek için Solidity’de bir tamsayı türü kullanmanız gerekir. Gerçekte, birçok geliştirici, bunu doğru bir şekilde uygulayamazlarsa hata yapabilir veya boşluklar oluşturabilir. Bu nedenle, geliştiricilerin standart tamsayı veri türünü kullanarak kendi sabit nokta veri türlerini uygulamaları gerekir.

Süreç kolay ve oldukça karmaşık değildir ve doğru bir şekilde yürütülmezse birçok soruna yol açabilir. Dahası, 256 bit Ethereum Sanal Makinesi, 32 bayttan daha kısa türler 32 baytlık yuvada bir araya getirildiğinden, veri türleri için pek çok sorun yaratabilir. Bu nedenle, çarpmadan önce herhangi bir bölme yaptığınızda düzgün bir yuvarlama bekleyemeyeceğiniz için herhangi bir hesaplamanın kesinliğini etkiler. Dahası , platformunuz için çeşitli akıllı sözleşme kullanım durumlarından yararlanmanıza izin vermez .

Beklenmedik Eter

Solidity ile ilgili tonlarca sorun var ve bunların arasında bir başka sorun da beklenmedik Ether . Genellikle, Ether’i bir adrese gönderirken, geri dönüş işlevini veya sözleşme için gereken diğer işlevleri yürütmesi gerekir. Ancak, bu kuralların belirli istisnaları vardır. Bu durumda Ether herhangi bir kod çalıştırmadan sözleşmede kalabilir. Bu nedenle, her bir Ether işlemi için programlara dayanan sözleşmeler savunmasızdır çünkü Ether’i zorla başka bir sözleşmeye gönderebilir.

Tipik olarak, başka bir sözleşmeye zorla Ether göndermenin 2 yolu vardır ve bunun için herhangi bir ödenebilir işlev kullanmayacaktır. Bunlar – Pre-sent Ether ve Self-destruct yöntemleridir. Çoğu durumda, blok zinciri geliştiricileri , ödeme işlevi dışında başka yollarla Ether’i kabul edebileceğinizi ve hatta elde edebileceğinizi fark etmez. Tipik olarak, yanlış Ether bakiyesine sahip sözleşmelere yol açabilir ve güvenlik açığına yol açacaktır. Herhangi bir işlevi çağırmadan önce sözleşmede depolanan mevcut Ether’i kontrol etmek en iyisidir.

tx.origin’e Güvenmek

tx.origin, Solidity ile ilgili sorunlardan bir diğeridir. Bu global bir değişkendir ve arama yığınını tarar ve size işlemi gönderen hesabın adresini verir. Sorun şu ki, bu değişkeni kimlik doğrulama amacıyla kullanırsanız akıllı sözleşmelerinizi savunmasız hale getirebilir. Bu nedenle, sözleşmenizin bir kimlik avı saldırısıyla karşılaşma olasılığı yüksektir. Temel olarak, saldırgan, sözleşmede saldırganın kimliğini doğrulamak için tx.origin değişkenini kullanması için kullanıcıyı kandırabilir.

Saldırgan burada tx.origin değişkeni içinde cancelAll() işlevini gizleyebilir ve phishable sözleşmesi için kötü niyetli bir kod oluşturabilir. Saldırgan genellikle kodu dağıtır ve kullanıcıyı bu sözleşmeye bir miktar Ether göndermeye ikna eder. Kullanıcı bunun tipik bir kimlik doğrulama sözleşmesi olduğunu düşünecek ve Ether’i sözleşmeye gönderecektir (sözleşme içinde gizlenmiş saldırganın adresi). Böylece, kurban bunu yaptığında, withdrawAll() işlevini çağıran bir geri dönüş işlevini başlatır. Sonuç olarak, kurbandan gelen tüm fonlar saldırganın adresine gidecektir. Bu nedenle, kullanıcılar yalnızca kimlik doğrulama amacıyla tx.origin’e güvenmemelidir, çünkü bu en büyük blockchain risklerinden biridir .

Varsayılan Görünürlükler

Solidity‘de, herhangi birinin bu işlevi nasıl çağırabileceğini atamadığınız sürece, işlevlerin genel olarak görünürlüğü vardır. Bu nedenle, görünürlük, işlevi kimlerin çağırabileceğini belirleyebilir – harici kullanıcılar, türetilmiş sözleşmeler, dahili kullanıcılar vb. Tipik olarak, dört tür görünürlük belirleyicisi vardır. Böylece, genel görüntüleme için varsayılan olan herhangi bir işlev, kullanıcılar tarafından harici olarak çağrılabilir. Gerçekte, çoğu zaman geliştiriciler, akıllı sözleşmenin bütünlüğüne ciddi şekilde zarar verecek yanlış belirleyiciler kullanma eğilimindedir.

Varsayılan değer herkese açık olduğundan, değiştirmek istiyorsanız her zaman görünürlüğü belirttiğinizden emin olun. Örneğin, belirli bir görevi gerçekleştirebilen kullanıcılara bir ödül sunuyorsanız, işlevin görünürlüğünü gizli tuttuğunuzdan emin olun. Herkese açıksa, herhangi bir kullanıcı işlevi görebilir ve çağırabilir ve tek bir görev gerçekleştirmeden ödülü alabilir. Pek çok yeni gelen kavramı tam olarak anlamadığından, bu tür blockchain güvenlik endişelerini kötüye kullanmak gerçekten çok kolay. Bu nedenle, zamanında kontrol edilmediği takdirde tehlikeli solidity güvenlik sorunlarından biri haline gelebilir.

Taşma ve Alt Akış (Overflow and Underflow)

Taşma ve Alt Akış, şu anda öne çıkan solidity güvenlik sorunlarından biridir. Gerçekte, Ethereum Virtual Machine, tamsayı veri türleri için yalnızca sabit bir boyutu destekleyebilir. Bu, blockchain uzmanlarının bir tamsayı değişkenini temsil etmek için yalnızca belirli bir sayı aralığını kullanabileceği anlamına gelir. Örneğin, unit8‘de yalnızca [0,255]’ten itibaren değerleri saklayabilirsiniz. Yani burada 256’yı saklamak isterseniz sonuç olarak sadece 0 alırsınız. Bu nedenle, Saldırganlar bu sorunu istismar edebileceğinden, Solidity‘de değişken kullanmak önlem almak zorundadır. Genellikle, veri türü aralığının dışında bir değer depolamaya çalıştığınızda yetersiz akış veya taşma sorunları meydana gelir.

Gerçekte, başlangıç değeri 0 olan bir unit8 değişkeninden 1 çıkarmaya çalıştığınızda bir taşma sorunu oluşur. Bu durumda, yalnızca 255 sayısını döndürür. Öte yandan, veri türünün aralığından daha büyük bir değer eklemeye çalışırsanız, bir taşma sorunu yaratacaktır. Yani, bir unit8 0 değerine 257 eklerseniz, size 1 sonucunu verir. Temelde güvenlik açıkları oluşturabilir ve saldırganlar, kodu kötüye kullanmak ve hatta sonsuz bir döngü ile sonuçlanan beklenmedik bir mantık oluşturmak için kullanabilir.

Zaman Damgası Manipülasyonu

Önemli solidity güvenlik sorunlarından bir diğeri de zaman damgası sorunudur. Gerçekte, blok zinciri zaman damgaları, blok zinciri uygulamalarındaki en önemli unsurlardan biridir . Fonları kilitlemek, serbest bırakılacak fonlar için bir zamanlayıcı ayarlamak, sayılar için entropi, durum değiştirme koşulları vb. gibi çeşitli amaçlar için kullanabilirsiniz.

Bununla birlikte, bir madenci, akıllı sözleşmede yanlış kullanıyorsa riskli olan zaman damgasını değiştirme özgürlüğüne sahiptir. Herhangi bir ödül zamanında, sözleşmede yeterli Ether kullanımıyla madenci, zaman damgasını değiştirebilir ve havuzlanmış Ether ile birlikte ödülü kazanabilir. Açıkçası, bu adil bir ticaret değil.

Sonuç Bağlamı : En Yaygın 10 Solidity Problemi

Artık En Yaygın 10 Solidity Problemini bildiğinize göre, öğrenme sürecinize başlayabilirsiniz. Gerçekte, Solidity oldukça yeni bir programlama dili türüdür, bu nedenle bazı sorunları olması kaçınılmazdır. Ancak, sözleşmeniz ve platformunuz için güvenlik açıkları oluşturabileceklerinden, bu tür boşlukları çözmek veya bunlardan kaçınmak en iyisidir. Bunu yapmanın en iyi yolu, kendinizi Ethereum’un artıları ve eksileri ve her şeyin nasıl çalıştığı hakkında eğitmektir. Bu sorunlar ve olası çözümler hakkında daha fazla bilgi edinmek için Solidity Academy TR Eğitimlerine hemen KATIL!

Solidity Programlama Dili Nedir?

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeirğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacğaım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

Hasan YILDIZ, Girişimci. Doktora Öğrencisi. Yazmayan YAZILIMCI. Veri Şeysi. Eğitmen...

Yazarın Profili

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir