1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 030 : Ether Gönderimi ve Alımı

🧵 #100GündeSolidity 030 : Ether Gönderimi ve Alımı
Ether Gönderimi ve Alımı
0

Ether Gönderimi ve Alımı: Hangi Yöntemleri Kullanmalı ve Re-entrancy Saldırılarından Nasıl Korunmalı?

Ethereum, akıllı sözleşmeler ve blok zinciri teknolojisi ile birçok yenilikçi uygulamaya ev sahipliği yapıyor. Bu uygulamaların çoğu, Ethereum platformunda yer alan Ether adlı kripto para birimi ile çalışıyor. Bu nedenle, Ether’in güvenli ve doğru bir şekilde transferi büyük önem taşıyor.

Bugün #100DaysOfSolidity e-bülten serisinde, Ether transferi konusunu ele alacağız. Ayrıca, bir sözleşmenin Ether alımı yapabilmesi için gerekli olan fonksiyonlardan bahsedeceğiz. Hangi yöntemin kullanılması gerektiği konusunda ipuçları verirken, re-entrancy saldırılarına karşı korunma yöntemlerini de ele alacağız.

Hazırsanız, Ethereum dünyasına Ether transferinin nasıl yapıldığını öğrenmek için devam edelim!

Ether gönderimi nasıl yapılır?

Ether göndermek için Solidity dilinde üç farklı yöntem kullanılabilir: transfer, send ve call.

  1. transfer: address.transfer(amount) şeklinde kullanılır. Bu yöntem, gönderilen miktarın 2300 gas’a kadar ödenmesini sağlar ve eğer gönderme işlemi başarısız olursa bir hata fırlatır. transfer yöntemi genellikle küçük miktarlar için kullanılır ve güvenli bir yöntemdir.
  2. send: address.send(amount) şeklinde kullanılır. Bu yöntem de 2300 gas öder ve gönderme işlemi başarısız olursa false değeri döndürür. send yöntemi, transfer yöntemine benzer şekilde kullanılır ve küçük miktarlar için uygundur.
  3. call: address.call.value(amount)(data) şeklinde kullanılır. Bu yöntemde, gas limiti ve gerekli fonksiyon bilgileri gibi daha fazla parametre seçeneği vardır. call yöntemi, herhangi bir işlemi gerçekleştirebilir ve gas limitini programcının belirlemesine izin verir. Ancak, kullanımı daha karmaşıktır ve hataya neden olabilecek riskleri barındırır.

Ether transferi için kullanılacak yöntem, miktarın boyutuna, işlemin yapılacağı yerin durumuna ve diğer faktörlere bağlı olacaktır. Küçük miktarlar için transfer veya send yöntemleri, daha karmaşık işlemler için call yöntemi kullanılması önerilir.

Ether alımı nasıl yapılır?

Ethereum platformunda, bir sözleşmenin Ether alabilmesi için en az bir adet receive veya fallback fonksiyonuna sahip olması gerekir. Bu fonksiyonlar, sözleşmeye Ether gönderildiğinde çağrılır.

  1. receive() external payable: Bu fonksiyon, yalnızca Ether gönderimi için kullanılır. payable anahtar kelimesi ile belirtilen bir fonksiyon, Ether alabilir ve sözleşmede state değişiklikleri yapabilir. Bu nedenle, receive fonksiyonunun payable anahtar kelimesiyle belirtilmesi gerekir.
  2. fallback() external payable: Bu fonksiyon, Ether gönderimi için belirli bir fonksiyon olmadığında otomatik olarak çağrılır. fallback fonksiyonu, receive fonksiyonundan farklı olarak, sözleşmedeki state değişiklikleri yapmak için kullanılamaz.
  3. receive() is called if msg.data is empty, otherwise fallback() is called.: Bu durumda, msg.data boş olduğunda receive fonksiyonu çağrılır. Aksi takdirde, fallback fonksiyonu çağrılır.

Bir sözleşmenin Ether alabilmesi için, en az bir adet receive veya fallback fonksiyonuna sahip olması gereklidir. Bu fonksiyonlar, sözleşmeye Ether gönderildiğinde çağrılır ve Ether’in sözleşmenin state değiştirebilmesi için kullanılmasını sağlar.

Hangi yöntem kullanılmalıdır?

Ether gönderimi için hangi yöntemin kullanılması gerektiği, gönderilecek miktar ve gönderilecek adresin durumuna bağlıdır.

Küçük miktarlar için transfer veya send yöntemleri genellikle yeterlidir. Bu yöntemler, düşük gas ücretleriyle birlikte, gönderme işleminin hızlı ve güvenli bir şekilde gerçekleştirilmesini sağlar.

Ancak, daha karmaşık işlemler veya büyük miktarlarda Ether gönderimi yapılacaksa, call yöntemi kullanılmalıdır. Bu yöntem, daha fazla parametre seçeneği sunar ve programcıların gas limitini ayarlamasına olanak tanır. Ancak, call yöntemi daha karmaşık olduğu için hatalara neden olabilecek riskleri de beraberinde getirir.

Ether alımı için, sözleşmenin en az bir adet receive veya fallback fonksiyonuna sahip olması gereklidir. receive fonksiyonu, yalnızca Ether gönderimi için kullanılırken, fallback fonksiyonu Ether gönderimi için belirli bir fonksiyon olmadığında otomatik olarak çağrılır.

Özet olarak, Ether gönderimi için küçük miktarlar için transfer veya send, daha büyük işlemler için call yöntemi tercih edilirken, Ether alımı için en az bir adet receive veya fallback fonksiyonuna sahip olunması gereklidir.

Re-entrancy’ye karşı korunma yöntemleri nelerdir?

Re-entrancy, bir saldırganın bir işlemi tekrar tekrar çağırarak bir sözleşmedeki Ether miktarını hatalı şekilde artırması veya başka bir şekilde etkilemesidir. Bu tür saldırılar, sözleşmelerin bazı işlevlerinin, özellikle de Ether alımı ve Ether transferi işlevlerinin kullanılması sırasında ortaya çıkar.

Re-entrancy’ye karşı korunma yöntemleri şunları içerir:

  1. State değişikliklerini işlem başına bir kez yapın: Re-entrancy saldırıları, sözleşmenin state’ini işlem başına birden fazla kez değiştirerek gerçekleştirilir. Bu nedenle, state değişikliklerini işlem başına bir kez yapmak, saldırganın tekrarlaması için bir fırsat bırakmaz.
  2. Re-entrancy guard kullanın: Re-entrancy guard, bir işlemin yürütülmesi sırasında, o işlemi tekrar çağıran herhangi bir işlemi engeller. Bu, sözleşmelerin Ether alımı veya transferi işlevlerinin kullanımı sırasında özellikle önemlidir. Re-entrancy guard, işlem başına state değişiklikleri yapmak için kullanılır ve saldırganın tekrarlama şansını ortadan kaldırır.
  3. Modifier kullanın: Re-entrancy guard’ı bir modifier olarak tanımlayabilirsiniz. Bu, sözleşmelerin daha okunaklı ve anlaşılır olmasını sağlar ve kod tekrarını önler. Ayrıca, bir modifier olarak tanımlamak, re-entrancy guard’ın tekrar kullanılabilirliğini artırır ve kodun daha az hata yapma olasılığını artırır.
  4. Ether transferi yapmadan önce state değişikliklerini tamamlayın: Re-entrancy saldırıları, Ether transferi işlemleri sırasında ortaya çıkabilir. Saldırganlar, Ether transferi işlemi sırasında state değişiklikleri yaparak sözleşmede bir açık yaratır ve daha sonra bu açığı kullanarak saldırı gerçekleştirirler. Bu tür saldırıları önlemek için, Ether transferi yapmadan önce tüm state değişikliklerinin tamamlanması önerilir.

Re-entrancy, Ethereum platformunda ciddi bir güvenlik tehdidi olabilir. Bu nedenle, Ether alımı ve transferi işlevlerinin kullanımı sırasında re-entrancy guard ve diğer koruma yöntemleri kullanılması önemlidir.

Akıllı Sözleşme Örneği İNCELEME

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ReceiveEther {
    /*
    Which function is called, fallback() or receive()?

           send Ether
               |
         msg.data is empty?
              / \
            yes  no
            /     \
receive() exists?  fallback()
         /   \
        yes   no
        /      \
    receive()   fallback()
    */

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Fallback function is called when msg.data is not empty
    fallback() external payable {}

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

contract SendEther {
    function sendViaTransfer(address payable _to) public payable {
        // This function is no longer recommended for sending Ether.
        _to.transfer(msg.value);
    }

    function sendViaSend(address payable _to) public payable {
        // Send returns a boolean value indicating success or failure.
        // This function is not recommended for sending Ether.
        bool sent = _to.send(msg.value);
        require(sent, "Failed to send Ether");
    }

    function sendViaCall(address payable _to) public payable {
        // Call returns a boolean value indicating success or failure.
        // This is the current recommended method to use.
        (bool sent, bytes memory data) = _to.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }
}

Bu örnek akıllı sözleşme, Ether gönderimi ve alma yöntemlerini göstermek amacıyla tasarlanmıştır. İlk sözleşme olan ReceiveEther, Ether alma fonksiyonlarını içerirken, ikinci sözleşme olan SendEther, Ether gönderme fonksiyonlarını içerir.

ReceiveEther sözleşmesi, Ether alma işlemini gerçekleştirmek için iki fonksiyona sahiptir: receive() ve fallback(). receive() fonksiyonu, msg.data boş olduğunda Ether almak için kullanılır. fallback() fonksiyonu ise, msg.data dolu olduğunda çağrılır.

SendEther sözleşmesi, üç farklı Ether gönderme yöntemini içerir: transfer(), send() ve call(). transfer() fonksiyonu, artık önerilmiyor ve güvenlik nedenleriyle kullanılmamalıdır. send() fonksiyonu, başarılı bir işlem sonucunda true veya false değeri döndürür ve kullanımı önerilmiyor. call() fonksiyonu ise, başarılı bir işlem sonucunda true veya false değeri döndürür ve şu anda önerilen yöntemdir.

Re-entrancy saldırılarına karşı korunmak için, sözleşme fonksiyonları içinde yapılan tüm durum değişiklikleri, diğer sözleşmeler çağrılmadan önce yapılmalıdır. Ayrıca, re-entrancy guard modifier’ı kullanılmalıdır. Bu sayede, bir fonksiyon birden fazla kez çağrılamaz ve böylece sözleşmede güvenlik açıkları önlenir.

Sonuç Bağlamı

Solidity programlama dilinde Ether gönderimi ve alımı oldukça önemli konulardır. Doğru bir şekilde yapılmaları, sözleşmenin güvenliğini sağlamak için çok önemlidir. Bu nedenle, Ether gönderimi ve alımı için kullanılan yöntemler hakkında iyi bir anlayışa sahip olmak gereklidir. Ayrıca, re-entrancy saldırılarına karşı korunmak için uygun önlemler alınmalıdır. Bu şekilde, Solidity programlama dilinde yazılan akıllı sözleşmelerin güvenliği artırılabilir ve güvenli bir şekilde kullanılabilir hale getirilebilir.

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çeriğ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şlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

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!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

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