1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 035 : Akıllı Sözleşmeleri Çağırma

🧵 #100GündeSolidity 035 : Akıllı Sözleşmeleri Çağırma
Akıllı Sözleşmeleri Çağırma
0

Akıllı Sözleşmeleri Çağırma: Varsayılan Yöntem ve Düşük Seviye “Call”

Solidity, Ethereum blockchain üzerinde akıllı sözleşmeler oluşturmak için kullanılan popüler bir programlama dilidir. Solidity, akıllı sözleşmelerin etkileşimlerini kolaylaştıran ve diğer akıllı sözleşmelere çağrı yapabilme yeteneği sunan özellikler içerir. Bu özellikler sayesinde, Solidity’deki bir akıllı sözleşme, diğer akıllı sözleşmelerle etkileşim kurabilir ve blockchain’deki verilerin işlenmesini ve kullanımını kolaylaştırabilir. Bu yazıda, Solidity’de diğer akıllı sözleşmeleri çağırmak için kullanabileceğiniz iki yöntem olan varsayılan yöntem ve düşük seviye “call” yöntemi hakkında bilgi vereceğiz.

Solidity’de Diğer Akıllı Sözleşmeleri Çağırma

Solidity programlama dili, Ethereum blockchain üzerinde akıllı sözleşmeler oluşturmak için kullanılan popüler bir dildir. Solidity, diğer akıllı sözleşmelere çağrı yapabilme yeteneği sunar. Bu özellik sayesinde, Solidity’deki bir akıllı sözleşme, diğer akıllı sözleşmelerle etkileşim kurabilir ve blockchain’deki verilerin işlenmesini ve kullanımını kolaylaştırabilir.

Solidity’de diğer akıllı sözleşmeleri çağırmak için iki yöntem vardır: varsayılan yöntem ve düşük seviye “call” yöntemi. Varsayılan yöntem, diğer sözleşmelere çağrı yapmak için Solidity dilindeki fonksiyon çağrısı sözdizimini kullanır. Düşük seviye “call” yöntemi ise Solidity’deki en düşük seviyeli işlevlerden biridir ve diğer sözleşmelere çağrı yapmak için daha fazla kontrole sahip olmanızı sağlar. Bu yazıda, bu iki yöntem hakkında detaylı bilgi vereceğiz.

Varsayılan Yöntemle Sözleşmeleri Çağırma

Solidity’deki varsayılan yöntem, diğer akıllı sözleşmelere çağrı yapmanın en basit yoludur. Bu yöntem, diğer sözleşmelere çağrı yapmak için Solidity dilindeki fonksiyon çağrısı sözdizimini kullanır. Bu sözdiziminde, çağrılacak sözleşmenin adresi ve çağrılacak fonksiyonun adı ve parametreleri belirtilir. Örneğin, “A” adlı bir sözleşmenin “foo” adlı bir fonksiyonunu çağırmak için “A.foo(x, y, z)” şeklinde bir çağrı yapabilirsiniz.

Varsayılan yöntem, daha az kod yazmanızı sağlar ve diğer sözleşmelerle etkileşim kurmak için yeterli olabilir. Ancak, bu yöntem, çağrılan sözleşmenin fonksiyonlarının doğru şekilde tanımlandığından emin olmak için manuel olarak test edilmesi gereken birçok durumda yetersiz kalabilir. Bu nedenle, bazı durumlarda düşük seviye “call” yöntemi kullanmak daha güvenli olabilir.

Şimdi, varsayılan yöntemle bir örnek inceleyelim:

// "B" adlı bir sözleşmenin "getSum" adlı fonksiyonu çağıran "A" adlı sözleşme
pragma solidity ^0.8.0;

contract A {
  address public bAddress;

  constructor(address _bAddress) {
    bAddress = _bAddress;
  }

  function callBGetSum(uint256 x, uint256 y) public view returns (uint256) {
    return B(bAddress).getSum(x, y);
  }
}

// "B" adlı sözleşmenin "getSum" adlı fonksiyonu
contract B {
  function getSum(uint256 x, uint256 y) public pure returns (uint256) {
    return x + y;
  }
}

Bu örnekte, “A” adlı sözleşme, “B” adlı başka bir sözleşmede bulunan “getSum” adlı fonksiyonu çağırmak için varsayılan yöntemi kullanır. “B” sözleşmesinin adresi, “A” sözleşmesinin oluşturulduğu zaman kurucu fonksiyonu aracılığıyla belirtilir. “callBGetSum” fonksiyonu, “B” sözleşmesinin “getSum” fonksiyonunu çağırır ve sonucu döndürür.

Düşük Seviye “Call” Yöntemi

Düşük seviye “call” yöntemi, Solidity’de diğer akıllı sözleşmelere çağrı yapmanın bir diğer yoludur. Bu yöntem, “msg.sender.call” veya “address.call” sözdizimini kullanarak çağrı yapar. Bu yöntem, varsayılan yöntemden daha karmaşıktır, ancak bazı durumlarda daha güvenli olabilir. Özellikle, çağrılan sözleşmenin fonksiyonlarının doğru şekilde tanımlandığından emin olmak için manuel olarak test edilmesi gereken durumlarda daha uygun olabilir.

Düşük seviye “call” yönteminin avantajı, çağrılan sözleşmenin geri dönüş değerini ve hata kodunu kontrol etmenizi sağlamasıdır. Ayrıca, “call” yöntemi, çağrılan sözleşmenin fonksiyonlarını daha düşük maliyetle çağırmak için kullanılabilir.

Aşağıdaki örnek, düşük seviye “call” yöntemini kullanarak başka bir sözleşmenin fonksiyonunu çağırmak için nasıl kullanılacağını göstermektedir:

// "A" adlı sözleşmenin "B" adlı başka bir sözleşmenin "getSum" fonksiyonunu çağıran "callBGetSum" fonksiyonu
pragma solidity ^0.8.0;

contract A {
  address public bAddress;

  constructor(address _bAddress) {
    bAddress = _bAddress;
  }

  function callBGetSum(uint256 x, uint256 y) public view returns (uint256) {
    (bool success, bytes memory returnData) = bAddress.call(abi.encodeWithSignature("getSum(uint256,uint256)", x, y));
    require(success, "call to B failed");
    uint256 result = abi.decode(returnData, (uint256));
    return result;
  }
}

// "B" adlı sözleşmenin "getSum" adlı fonksiyonu
contract B {
  function getSum(uint256 x, uint256 y) public pure returns (uint256) {
    return x + y;
  }
}

Bu örnekte, “A” adlı sözleşme, düşük seviye “call” yöntemini kullanarak “B” adlı başka bir sözleşmenin “getSum” fonksiyonunu çağırır. Çağrı sonucu, “success” ve “returnData” değişkenlerinde saklanır. “require” ifadesi, çağrının başarısız olması durumunda bir hata fırlatır. Son olarak, “abi.decode” yöntemi kullanılarak dönüş değeri geri alınır ve dönüş olarak verilir.

Düşük Seviye “Call” Yöntemini Güvenli Kullanma

Düşük seviye “call” yöntemi, doğru şekilde kullanılmadığında güvenlik açıklarına neden olabilir. Bu nedenle, düşük seviye “call” yöntemini kullanırken aşağıdaki güvenlik önlemlerine dikkat etmek önemlidir:

  1. “call” yönteminin geri dönüş değeri kontrol edilmelidir. Geri dönüş değeri “success” değişkeninde saklanır ve “require” ifadesiyle kontrol edilir. Başarısız bir çağrı durumunda, “require” ifadesi bir hata fırlatır ve sözleşmenin işleminin durmasına neden olur.
  2. “call” yöntemi kullanılırken, çağrılan fonksiyonun adı ve parametreleri doğru şekilde kodlanmalıdır. Bu nedenle, “abi.encodeWithSignature” veya “abi.encodeWithSelector” gibi yöntemler kullanarak doğru kodlama yapmak önemlidir.
  3. “call” yöntemi, güvenilir olmayan adreslere çağrı yaparken dikkatli olunmalıdır. Özellikle, “call” yöntemi, bilinmeyen sözleşmelerin fonksiyonlarını çağırmak için kullanılmamalıdır.
  4. “call” yöntemi, fonksiyonun çalışması için yeterli gaz sağlanmalıdır. Çağrılan sözleşmenin fonksiyonu, daha fazla gaz tüketebilecek kod içerebilir. Bu nedenle, “gas” parametresi, “call” yöntemiyle çağrı yaparken belirtilmelidir.

Yukarıdaki güvenlik önlemleri, düşük seviye “call” yönteminin güvenli kullanımı için önemlidir. Bu yöntem, bazı durumlarda faydalı olabilir, ancak doğru şekilde kullanılmazsa güvenlik açıklarına neden olabilir.

Düşük Seviye “Call” İşlemlerinin Dönüş Değerleri

“Düşük Seviye Call” işlemleri, çağrılan fonksiyonun geri dönüş değerini içeren bir byte dizisi döndürür. Bu byte dizisi, geri dönüş değerinin türüne göre çözülmelidir.

Eğer geri dönüş değeri bir tek bir değer ise, örneğin uint, bool veya address gibi, byte dizisi ilgili türe dönüştürülebilir. Bunun için, “abi.decode” fonksiyonu kullanılabilir.

Eğer geri dönüş değeri bir yapı ise, byte dizisi ilgili yapının türüne dönüştürülebilir. Bunun için, yapının tüm alanlarını içeren bir struct oluşturulmalı ve “abi.decode” fonksiyonu kullanılarak byte dizisi ilgili struct’a dönüştürülmelidir.

Eğer geri dönüş değeri bir diziyse, byte dizisi “abi.decode” fonksiyonu kullanılarak ilgili diziye dönüştürülebilir. Bunun için, dizi türü ve boyutu belirtilmelidir.

Döndürülen byte dizisi, öncelikle “success” değişkeninin değeri kontrol edildikten sonra çözülmelidir. Eğer çağrı başarısız olursa, geri dönüş değeri 0’a eşit olacaktır. Bu nedenle, başarısızlık durumunda hata mesajlarını kullanıcıya iletmek için “revert” veya “require” ifadesi kullanılabilir.

Montaj “Call” Yöntemi

“Montaj Call” yöntemi, “low-level call” yöntemine benzer şekilde başka bir akıllı sözleşmeyi çağırmak için kullanılabilir. Ancak, “Montaj Call” yöntemi daha az kullanılır ve daha zor bir kullanıma sahiptir.

Bu yöntem, “assembly” blokları içinde yazılmalıdır. Bu bloklar, Solidity dilinde yerleşik bir özelliktir ve doğrudan EVM bytecode’una erişim sağlamak için kullanılır.

Montaj “Call” yöntemi kullanılırken, çağrılan fonksiyonun imzasının tam olarak belirtilmesi gerekir. Bu imza, fonksiyonun adı, girdi parametrelerinin türleri ve geri dönüş değerinin türü gibi bilgileri içermelidir.

Montaj “Call” yöntemi de “low-level call” yöntemi gibi geri dönüş değeri olarak bir byte dizisi döndürür. Bu byte dizisi, “low-level call” yönteminde olduğu gibi, ilgili türe veya yapıya dönüştürülmelidir.

Montaj “Call” yöntemi, “low-level call” yönteminden daha fazla kontrol sağlar. Ancak, bu yöntemi kullanırken, doğru imza ve bytecode’lar kullanıldığından emin olunmalıdır. Aksi takdirde, hatalı kodlar nedeniyle sözleşmelerin hasar görmesi söz konusu olabilir.

Sonuç: Diğer Sözleşmeleri Çağırmak İçin Doğru Yöntemi Seçme.

Solidity’de, diğer akıllı sözleşmeleri çağırmak için iki yöntem bulunmaktadır: varsayılan yöntem ve düşük seviye “call” yöntemi. Ayrıca, daha az kullanılan ve daha zor olan montaj “call” yöntemi de bulunmaktadır.

Varsayılan yöntem, Solidity dilinde yerleşik bir özelliktir ve diğer sözleşmeleri çağırmak için en kolay yöntemdir. Bu yöntem, sözleşmenin adresi ve çağrılacak fonksiyonun adı ve girdi parametreleri gibi bilgileri içeren bir çağrı yaparak çalışır.

Düşük seviye “call” yöntemi ise, daha fazla kontrol sağlar ve özelleştirilmiş geri dönüş değeri işlemlerine izin verir. Ancak, bu yöntem daha zordur ve dikkatli bir kullanım gerektirir.

Montaj “call” yöntemi de düşük seviye “call” yöntemi gibi daha fazla kontrol sağlar. Ancak, bu yöntemi kullanmak için doğru imza ve bytecode’lar kullanıldığından emin olmak önemlidir.

Diğer sözleşmeleri çağırmak için doğru yöntemi seçmek, proje ihtiyaçlarına ve deneyim seviyesine bağlıdır. Ancak, güvenliği en üst seviyede tutmak için, düşük seviye yöntemler kullanılırken dikkatli olunmalı ve gerektiğinde hata mesajları kullanıcıya iletilmelidir.

SONUÇ BAĞLAMI

Solidity dilinde diğer akıllı sözleşmeleri çağırmak için varsayılan yöntem ve düşük seviye “call” yöntemi kullanılabilir. Varsayılan yöntem daha kolaydır ve girdi parametreleri gibi bilgileri içeren bir çağrı yaparak çalışır. Düşük seviye “call” yöntemi ise daha fazla kontrol sağlar ve özelleştirilmiş geri dönüş değeri işlemlerine izin verir. Ancak, daha zor ve dikkatli bir kullanım gerektirir. Montaj “call” yöntemi de düşük seviye yöntemlerden biridir ve daha fazla kontrol sağlar ancak daha zor bir yöntemdir.

Doğru yöntemi seçmek, proje ihtiyaçlarına ve deneyim seviyesine bağlıdır. Ancak, güvenliği en üst seviyede tutmak için, düşük seviye yöntemler kullanılırken dikkatli olunmalı ve gerektiğinde hata mesajları kullanıcıya iletilmelidir.

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