1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 032 : Call Fonksiyonu

🧵 #100GündeSolidity 032 : Call Fonksiyonu
Call Fonksiyonu
0

Call Fonksiyonu: Diğer Kontratlarla Etkileşim İçin Kullanımı ve Dikkat Edilmesi Gerekenler

Solidity, akıllı sözleşmelerin geliştirilmesi için kullanılan popüler bir programlama dilidir. Akıllı sözleşmeler, blockchain üzerinde kodlanmış özerk uygulamalar olarak tanımlanabilir. Solidity, diğer sözleşmelerle etkileşim kurabilmek için “call” adlı bir fonksiyon sunar. Call fonksiyonu, düşük seviyeli bir fonksiyondur ve diğer sözleşmelerle iletişim kurmak için kullanılır. Bu e-bültenimizde, Solidity’de call fonksiyonu hakkında daha fazla bilgi edineceğiz. Call fonksiyonunun kullanımı, avantajları, dezavantajları ve dikkat edilmesi gereken güvenlik riskleri hakkında bilgi sahibi olacaksınız.

Call fonksiyonu nedir ve ne işe yarar?

Call fonksiyonu, Solidity’deki düşük seviyeli bir fonksiyondur ve diğer akıllı sözleşmelerle etkileşim kurmak için kullanılır. Diğer bir deyişle, bir sözleşme, başka bir sözleşmeyi çağırmak veya başka bir sözleşmedeki işlevlerine erişmek istediğinde, call fonksiyonu kullanılabilir.

Call fonksiyonu, aynı zamanda Ethereum ağında düşük seviyeli işlemler gerçekleştirmek için de kullanılabilir. Call fonksiyonu ile diğer sözleşmelerle etkileşim kurmak, ödeme yapmak veya veri çekmek gibi çeşitli işlemler gerçekleştirilebilir.

Call fonksiyonunun en yaygın kullanımı, diğer sözleşmelerle Ether göndermek için kullanmaktır. Bununla birlikte, call fonksiyonu diğer sözleşmelerdeki işlevleri çağırmak için de kullanılabilir.

Call fonksiyonu, “low-level” olarak adlandırılır, çünkü doğrudan bytecode seviyesinde etkileşim kurar ve Solidity dilinde yazılan işlevleri doğrudan çağırmaz. Bu nedenle, call fonksiyonu ile etkileşim kurarken dikkatli olmak ve güvenlik risklerini önlemek için bazı önlemler almak gerekebilir.

Call fonksiyonu ile diğer kontratlarla nasıl etkileşime geçilir?

Call fonksiyonu ile diğer kontratlarla etkileşim kurmak için, hedef kontratın adresi ve çağrılacak fonksiyonun veri yapısı gibi belirli bilgilere ihtiyacınız vardır. Call fonksiyonu, aşağıdaki şekilde kullanılabilir:

(bool success, bytes memory returnData) = address(targetContract).call(abi.encodeWithSignature("functionName(arg1Type,arg2Type)", arg1, arg2));

Yukarıdaki kodda, “targetContract” değişkeni hedef kontratın adresini tutar. “functionName” ise çağrılacak fonksiyonun adını belirtir. “arg1” ve “arg2” değişkenleri ise çağrılacak fonksiyonun argümanlarını temsil eder. Fonksiyonun argüman tipleri, “arg1Type” ve “arg2Type” olarak belirtilir.

Call fonksiyonu, fonksiyon adı ve argüman tiplerini de içeren ABI (Application Binary Interface) formatına uygun olarak verileri kodlar. Bu nedenle, hedef kontratın ABI’si, call fonksiyonu ile etkileşim kurmak için önemlidir.

Call fonksiyonu, çağrılan fonksiyonun işlemin başarı durumunu döndürür. “success” değişkeni, işlemin başarılı olup olmadığını tutar. “returnData” değişkeni ise, çağrılan fonksiyonun dönüş değerlerini içeren veri yapısını tutar.

Call fonksiyonu ile diğer kontratlarla etkileşim kurarken, bazı güvenlik riskleri de mevcuttur. Bu nedenle, doğru parametreleri kullanarak ve gerekli güvenlik önlemlerini alarak call fonksiyonunu kullanmak önemlidir.

Call fonksiyonu kullanırken dikkat edilmesi gerekenler nelerdir?

Call fonksiyonunu kullanırken dikkat edilmesi gereken bazı önemli hususlar şunlardır:

  1. Doğru fonksiyon imzası ve parametreleri kullanılmalıdır: Call fonksiyonu, çağrılacak fonksiyonun imzası ve parametreleri ile uyumlu bir şekilde kullanılmalıdır. Bu nedenle, hedef kontratın ABI’sini dikkate alarak doğru fonksiyon imzasını ve parametrelerini belirlemek önemlidir.
  2. Return değeri kontrol edilmelidir: Call fonksiyonu, çağrılan fonksiyonun işlemin başarı durumunu döndürür. Bu nedenle, fonksiyonun başarılı olup olmadığını kontrol etmek önemlidir. Ayrıca, çağrılan fonksiyonun dönüş değerleri de kontrol edilmelidir.
  3. Güvenlik riskleri göz önünde bulundurulmalıdır: Call fonksiyonu, diğer kontratlarla etkileşim kurmak için doğrudan bytecode seviyesinde işlem yapar. Bu nedenle, kötü amaçlı kullanım risklerine karşı dikkatli olmak önemlidir. Örneğin, hedef kontratın öngörülemeyen davranışlar sergileme riski bulunabilir.
  4. Ether ödemeleri dikkatle yapılmalıdır: Call fonksiyonu, diğer kontratlara Ether göndermek için kullanılabilir. Ancak, Ether ödemeleri yaparken dikkatli olmak önemlidir. Yanlış bir adres veya yanlış miktarda Ether göndermek, geri dönüşü olmayan kayıplara neden olabilir.
  5. Call fonksiyonu, diğer Solidity fonksiyonları kadar verimli değildir: Call fonksiyonu, düşük seviyeli bir fonksiyon olduğu için, diğer Solidity fonksiyonlarına kıyasla daha az verimlidir. Bu nedenle, yüksek işlem hacmi gerektiren durumlarda call fonksiyonunun kullanımı, performans sorunlarına neden olabilir.

Reverts, type checks ve function existence checks nedir ve neden önemlidir?

Reverts, type checks ve function existence checks, Solidity dilinde kod güvenliği açısından önemli kavramlardır ve aşağıdaki gibi açıklanabilir:

  1. Reverts: Solidity’de bir işlemin başarısız olması durumunda, işlemin geri alınmasını sağlamak amacıyla revert mekanizması kullanılır. Revert mekanizması, işlemin geri alınmasına neden olan bir hata durumunda kodu normal işlem akışından çıkarır ve gas ücretini geri iade eder. Call fonksiyonu, hedef kontratın fonksiyonunun başarısız olması durumunda revert mekanizmasını kullanmaz. Bu nedenle, işlemin başarılı olup olmadığını kontrol etmek için, çağrılan fonksiyonun dönüş değerleri kontrol edilmelidir.
  2. Type checks: Solidity, tip güvenliği açısından zengin bir programlama dili olup, her değişkenin türü belirtilmelidir. Type checks, tür uyumsuzluklarına neden olan hataları en aza indirerek, kodun daha güvenli olmasını sağlar. Call fonksiyonu, hedef kontratın fonksiyonuna doğrudan bytecode düzeyinde eriştiğinden, tür uyumsuzluklarına neden olabilecek kodlar yazmak mümkündür. Bu nedenle, hedef kontratın ABI’si dikkate alınarak, çağrılan fonksiyonun tür uyumluluğu kontrol edilmelidir.
  3. Function existence checks: Solidity dilinde, bir fonksiyonun var olup olmadığını kontrol etmek amacıyla function existence checks mekanizması kullanılır. Call fonksiyonu, doğrudan hedef kontratın bytecode seviyesinde işlem yaptığından, fonksiyon varlığı kontrolünü yapmaz. Bu nedenle, var olmayan bir fonksiyonu çağırmak, işlemin başarısız olmasına neden olabilir. Bu nedenle, çağrılacak fonksiyonun varlığı, hedef kontratın ABI’si kullanılarak kontrol edilmelidir.

Bu üç kavram, kodun güvenliğini ve doğruluğunu sağlamak için önemlidir. Doğru tür kontrolü yapmak, doğru fonksiyon varlığı kontrolü yapmak ve işlemlerin geri alınması için revert mekanizmasını kullanmak, Solidity kodları için iyi bir kodlama pratiği olarak kabul edilir.

Call fonksiyonu kullanımı örnekleri ve avantajları/dezavantajları nelerdir?

Call fonksiyonu, Solidity dilinde diğer akıllı sözleşmeler veya harici adreslerle etkileşim kurmak için kullanılan bir fonksiyondur. Call fonksiyonunun kullanımı örnekleri aşağıdaki gibidir:

  1. Diğer akıllı sözleşmelerin fonksiyonlarına erişim: Call fonksiyonu, hedef akıllı sözleşmenin bytecode’una doğrudan erişim sağlayarak, sözleşmenin fonksiyonlarını çağırmak için kullanılabilir. Bu, özellikle bir akıllı sözleşmenin bir başka sözleşmeyle etkileşim kurması gerektiğinde faydalıdır.
  2. Harici adreslere ETH gönderimi: Call fonksiyonu, harici bir adrese ETH göndermek için kullanılabilir. Bu, özellikle ETH transferlerinde kullanılır.

Call fonksiyonunun avantajları:

  1. Call fonksiyonu, diğer akıllı sözleşmeler ve harici adreslerle etkileşim kurmanın en yaygın yoludur.
  2. ETH gönderimi işlemlerinde kullanılması, Solidity dilinde en yaygın şekilde kullanılan fonksiyonlardan biridir.

Call fonksiyonunun dezavantajları:

  1. Call fonksiyonu, revert mekanizmasını kullanmaz ve fonksiyon çağrısının başarısız olması durumunda hatanın farkedilmesi zordur.
  2. Call fonksiyonu, fonksiyonların tür uyumluluğu ve fonksiyon varlığı kontrolü yapmadığından, kullanıcı tarafından dikkatli bir şekilde kullanılması gerekir.
  3. Call fonksiyonunun ETH transferleri için kullanılması, güvenlik açısından bazı riskler taşıyabilir. Özellikle, hedef adresin ETH transferlerini kabul etme yetkisi olmadığı durumlarda, ETH transferi kaybolabilir veya geri alınamayabilir.

Sonuç olarak, Call fonksiyonu, Solidity dilinde en yaygın kullanılan fonksiyonlardan biridir ve diğer akıllı sözleşmeler ve harici adreslerle etkileşim kurmak için kullanılır. Ancak, kullanımı sırasında dikkatli olunması ve güvenlik açısından bazı risklerin göz önünde bulundurulması gerekmektedir.

Call fonksiyonunun yerine kullanılabilecek diğer fonksiyonlar nelerdir?

Call fonksiyonu, Solidity dilinde diğer akıllı sözleşmeler veya harici adreslerle etkileşim kurmak için kullanılan bir fonksiyondur. Call fonksiyonunun yerine kullanılabilecek diğer fonksiyonlar aşağıdaki gibidir:

  1. Send fonksiyonu: Send fonksiyonu, harici bir adrese ETH göndermek için kullanılır. Send fonksiyonu, ETH transferlerinde daha az güvenli olmasına rağmen revert mekanizması kullanarak hataları daha iyi yönetir.
  2. Transfer fonksiyonu: Transfer fonksiyonu, send fonksiyonunun bir güncellemesi olarak görülebilir ve ETH transferlerinde daha güvenlidir. Transfer fonksiyonu da, harici bir adrese ETH göndermek için kullanılır.
  3. Delegatecall fonksiyonu: Delegatecall fonksiyonu, Solidity dilinde başka bir akıllı sözleşmenin bytecode’una erişim sağlamak için kullanılır. Delegatecall fonksiyonu, kullanıcının sahip olduğu tüm veri ve yönetim haklarını hedef akıllı sözleşmeye devreder, bu nedenle hedef akıllı sözleşme için fonksiyon varlığı kontrolü gibi bazı kontroller yapmak daha güvenlidir.
  4. Staticcall fonksiyonu: Staticcall fonksiyonu, başka bir akıllı sözleşmenin bytecode’una erişim sağlamak için kullanılır, ancak kullanıcı veri veya yönetim hakları devretmez. Bu nedenle, staticcall fonksiyonu, hedef akıllı sözleşmenin varlığı ve tür uyumluluğu gibi bazı kontroller yapmak için daha güvenli bir seçenek olabilir.

Sonuç olarak, Solidity dilinde Call fonksiyonunun yerine kullanılabilecek birkaç fonksiyon vardır. Bunlar, Send fonksiyonu, Transfer fonksiyonu, Delegatecall fonksiyonu ve Staticcall fonksiyonudur. Hangi fonksiyonun kullanılacağına karar vermek, kullanıcının ihtiyacına ve güvenlik riskine bağlıdır.

DApp geliştiricileri için call fonksiyonunun güvenlik riskleri ve önlemleri nelerdir?

Call fonksiyonu, akıllı sözleşmeler arasında veri ve fonksiyon çağrıları yapmak için kullanılan bir düşük seviye fonksiyondur. Bu nedenle, doğru kullanılmadığında güvenlik riskleri oluşabilir. DApp geliştiricileri, Call fonksiyonunu kullanırken aşağıdaki güvenlik risklerini ve önlemlerini dikkate almalıdır:

  • Reentrant attack: Reentrant attack, bir saldırganın, hedef akıllı sözleşmede bir fonksiyon çağrısı yaparken aynı zamanda kendi akıllı sözleşmesinde bir fonksiyon çağrısı yapmasını ve önceki çağrının hala yürütüldüğü sırada bir kez daha çağrı yapmasını içerir. Bu, saldırganın hedef akıllı sözleşmeden fon toplamasına ve hatta sözleşmenin tamamen etkisiz hale gelmesine neden olabilir. Önlem olarak, akıllı sözleşmelerde gas limitlerini belirlemek ve call fonksiyonlarının kullanımını minimize etmek önemlidir.
  • Malicious contract: Saldırganlar, hedef akıllı sözleşmede bir fonksiyon çağrısı yapmak için özel olarak tasarlanmış zararlı akıllı sözleşmeler kullanabilirler. Bu, saldırganların, hedef akıllı sözleşmenin kullanıcılarına zarar vermesine ve hatta sözleşmenin tamamen etkisiz hale gelmesine neden olabilir. Önlem olarak, DApp geliştiricileri, kullanılan tüm akıllı sözleşmeleri güvenilir kaynaklardan doğrulamalı ve kullanıcıların sözleşmeleri kullanmadan önce doğru şekilde doğrulamalarını sağlamalıdır.
  • Fonksiyon ve tür uyumluluğu: Call fonksiyonu, fonksiyon ve tür uyumluluğu kontrollerini atlayarak bir akıllı sözleşmede herhangi bir fonksiyonu çağırmaya izin verebilir. Bu, saldırganların, hedef akıllı sözleşmelerin beklenmedik davranışlar sergilemesine neden olabilir. Önlem olarak, DApp geliştiricileri, call fonksiyonu yerine, güvenilir ve belgelenmiş bir fonksiyon çağırma mekanizması kullanmalıdır.
  • DDoS attacks: Call fonksiyonu, belirli bir hedef akıllı sözleşmenin sık sık çağrılmasına izin verir. Bu, bir saldırganın hedef akıllı sözleşmeyi DDoS saldırısı ile aşırı yüklemesine ve hatta işlevsiz hale getirmesine n
  • eden olabilir. Bu durumda, bir önlem olarak akıllı sözleşmenin işlevselliğini etkilemeden çağrılar için bir sınır belirlenmelidir. Ayrıca, hedef sözleşmenin sahibi, gelen çağrıları izlemeli ve gereksiz olanları reddetmeli veya engellemelidir.
  • Reentrancy attacks: Reentrancy saldırıları, bir saldırganın hedef akıllı sözleşmeye birden fazla çağrı yaparak bir döngü oluşturması ve sözleşmenin beklenenden farklı davranmasına neden olmasıdır. Bu tür bir saldırı, call fonksiyonunun yanlış kullanımından kaynaklanabilir. Bu riski önlemek için, akıllı sözleşmelerin doğru şekilde tasarlanması ve call fonksiyonunun kullanımının sınırlandırılması gerekir.
  • Gas limit issues: Call fonksiyonu, ayrıca gaz limitleriyle ilgili riskler de taşır. Çağrılan akıllı sözleşmenin işlevi çok miktarda gaz tüketirse, çağıran akıllı sözleşme çağrısını tamamlayamayabilir. Bu nedenle, çağrıyı gönderen akıllı sözleşmenin gaz limiti doğru bir şekilde ayarlanmalıdır.

Bütün bu riskleri minimize etmek için, DApp geliştiricileri call fonksiyonunun kullanımı sırasında mutlaka tüm güvenlik önlemlerini almalıdır. Bunlar arasında, akıllı sözleşmelerin doğru şekilde tasarlanması, sınırlandırılmış çağrılar yapılması, gaz limitlerinin ayarlanması ve saldırı tespit mekanizmalarının uygulanması yer alabilir. Ayrıca, DApp geliştiricilerinin DDoS saldırılarına karşı korunmak için yedekleme önlemleri alması da önerilebilir.

Call fonksiyonu ve diğer Solidity fonksiyonları arasındaki farklar ve karşılaştırmalar nelerdir?

Call fonksiyonu, Solidity’deki diğer fonksiyonlardan farklıdır çünkü düşük seviyeli bir fonksiyondur ve harici akıllı sözleşmelerle etkileşime geçmek için kullanılır. Diğer Solidity fonksiyonları, sözleşmenin kendi içindeki işlemleri gerçekleştirmek için kullanılır.

Call fonksiyonu, harici akıllı sözleşmelere veri göndermek için kullanılırken, diğer fonksiyonlar sadece sözleşmenin kendi işlemlerini gerçekleştirmek için kullanılır. Call fonksiyonu, belirli bir fonksiyonu çağırmak yerine, bir sözleşmenin fallback fonksiyonunu çağırmak için de kullanılabilir. Diğer Solidity fonksiyonları ise sözleşmenin işlevlerini doğrudan çağırmak için kullanılır.

Call fonksiyonu kullanırken dikkat edilmesi gereken bazı riskler vardır. Bu riskler arasında DDoS saldırıları, reentrancy saldırıları ve gaz limitleri yer alır. Diğer Solidity fonksiyonları bu riskleri taşımayabilir, ancak doğru kullanılmadığında diğer güvenlik riskleri oluşabilir.

Sonuç olarak, call fonksiyonu Solidity’deki diğer fonksiyonlardan farklı bir amaçla kullanılır ve bu fonksiyonun kullanımı sırasında özel güvenlik önlemleri alınmalıdır. Diğer Solidity fonksiyonları ise sözleşmenin kendi işlemlerini gerçekleştirmek için kullanılır ve daha az risk taşıyabilir.

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

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

contract Receiver {
    event Received(address caller, uint amount, string message);

    fallback() external payable {
        emit Received(msg.sender, msg.value, "Fallback was called");
    }

    function foo(string memory _message, uint _x) public payable returns (uint) {
        emit Received(msg.sender, msg.value, _message);

        return _x + 1;
    }
}

contract Caller {
    event Response(bool success, bytes data);

    // Let's imagine that contract Caller does not have the source code for the
    // contract Receiver, but we do know the address of contract Receiver and the function to call.
    function testCallFoo(address payable _addr) public payable {
        // You can send ether and specify a custom gas amount
        (bool success, bytes memory data) = _addr.call{value: msg.value, gas: 5000}(
            abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)
        );

        emit Response(success, data);
    }

    // Calling a function that does not exist triggers the fallback function.
    function testCallDoesNotExist(address payable _addr) public payable {
        (bool success, bytes memory data) = _addr.call{value: msg.value}(
            abi.encodeWithSignature("doesNotExist()")
        );

        emit Response(success, data);
    }
}

Bu örnek, Receiver adlı bir akıllı sözleşme ve Caller adlı bir başka akıllı sözleşme içerir. Receiver sözleşmesi, fallback() adlı bir fonksiyona sahiptir, bu nedenle Ether gönderildiğinde veya sözleşme çağrıldığında çağrılacak varsayılan fonksiyondur. Ayrıca, foo() adlı bir fonksiyona sahiptir, bu fonksiyona parametreler ile Ether gönderilebilir. Caller sözleşmesi, Receiver sözleşmesine bir fonksiyon çağırmak için call() fonksiyonunu kullanır.

testCallFoo() fonksiyonu, Caller sözleşmesine parametre olarak geçirilen address değeri ile belirtilen Receiver sözleşmesindeki foo() fonksiyonunu çağırır. Fonksiyon, ödeme göndermek için Ether’ı ve gas değerini belirleyen bir call() çağrısı yapar. Fonksiyonun geri dönüş değeri bool ve bytes olarak tanımlanır ve Response adlı bir etkinlik tarafından tetiklenir.

testCallDoesNotExist() fonksiyonu, Caller sözleşmesine parametre olarak geçirilen address değeri ile belirtilen Receiver sözleşmesindeki mevcut olmayan bir fonksiyonu çağırmak için call() fonksiyonunu kullanır. Çağrı sonrası oluşan bool ve bytes geri dönüş değerleri Response adlı bir etkinlik tarafından tetiklenir. Bu durumda, fonksiyon olmadığı için, fallback() fonksiyonu çağrılır ve geri dönüş değeri, fallback fonksiyonunda belirtilen emit Received() etkinliğidir.

Sonuç Bağlamı

Call fonksiyonu, Solidity dilindeki akıllı sözleşmelerin diğer sözleşmelerle etkileşime geçmesini sağlayan bir düşük seviye fonksiyondur. Ether göndermek için fallback fonksiyonunu çağırmak için kullanılabilir, ancak var olan fonksiyonları çağırmak için önerilmez. Bu, reverts’in yukarıya doğru kabarcıklandırılmaması, tip kontrollerinin atlanması ve fonksiyon varlığı kontrollerinin atlanması gibi nedenlerden dolayıdır.

Call fonksiyonu, diğer Solidity fonksiyonlarına göre daha düşük seviyeli olduğu için, dikkatli kullanılması gerekmektedir. Özellikle, adres parametresinin doğruluğunu kontrol etmek, reverts’i ele almak ve DDoS saldırılarına karşı korunmak önemlidir.

Call fonksiyonunun yerine, daha güvenli ve önerilen fonksiyonlar da vardır, örneğin delegatecall ve staticcall. Bu fonksiyonlar, çağrıldığı sözleşmenin adresindeki fonksiyonlara erişirken daha fazla güvenlik sağlar.

Sonuç olarak, call fonksiyonu, Solidity dilindeki akıllı sözleşmeler arasındaki etkileşim için kullanılabilen bir düşük seviye fonksiyondur. Ancak, güvenlik açıkları potansiyeli taşıdığı için dikkatli kullanılmalıdır ve mümkünse alternatif fonksiyonlar tercih edilmelidir.

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