1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 034 : Function Selector

🧵 #100GündeSolidity 034 : Function Selector
Function Selector
0

Function Selector: Akıllı Sözleşmelerin Çalışma Mekanizmasının Anahtarı

Solidity programlama dilinde, akıllı sözleşmelerin doğru bir şekilde çalışması için function selector mekanizması büyük bir öneme sahiptir. Bu mekanizma, sözleşmeye gelen isteklerin doğru bir şekilde yorumlanmasını ve işlenmesini sağlar. Bu e-bültenimizde, Solidity’deki function selector yapısını ve nasıl kullanıldığını detaylı bir şekilde ele alacağız.

Function Selector Nedir?

Function Selector, Solidity programlama dilinde, bir sözleşmede tanımlanan fonksiyonların çağrılması için kullanılan bir öncelik kodudur. Bu kod, çağrılan fonksiyonun belirleyicisidir ve doğru fonksiyonun çağrılmasını sağlar. Function Selector, 4 bayt uzunluğundadır ve fonksiyon adının hashlenerek oluşturulur. Solidity programlama dilinde bu hash fonksiyonu keccak256 olarak adlandırılır. Bu sayede, farklı fonksiyonların benzersiz bir hash koduna sahip olması sağlanır.

Function Selector Nasıl Oluşturulur?

Function Selector oluşturmak için, fonksiyonun adı ve parametrelerinin türleri keccak256 hash fonksiyonuna verilir ve böylece 4 baytlık bir öncelik kodu oluşur.

Örneğin, aşağıdaki Solidity fonksiyonu:

function transfer(address to, uint256 amount) public returns (bool) {}

Function Selector’ı, fonksiyon adı “transfer” ve parametrelerin türleri “address” ve “uint256” olduğu için şu şekilde oluşturulur:

keccak256("transfer(address,uint256)")

Yukarıdaki işlem, Solidity’deki keccak256 hash fonksiyonu kullanılarak gerçekleştirilir ve sonuç 4 baytlık bir hexadezimal sayıdır. Bu sayı, fonksiyonun function selector’ıdır ve çağrılmak istenen fonksiyonu belirler.

Calldata Nedir?

Calldata, Solidity programlama dilinde, bir fonksiyona gönderilen argümanların bellek yerine geçici olarak depolandığı bir bölgedir. Fonksiyon, bu geçici bellek alanından argümanları okuyarak işlemini gerçekleştirir.

Solidity’de, fonksiyonlara gönderilen argümanlar, 256-bit uzunluğundaki kelime boyutunda dilimlere bölünür. Bu dilimler, calldata olarak adlandırılan bellek alanında sıralı bir şekilde saklanır. Fonksiyon, calldata alanındaki belirli bir dilime erişerek, o dilimdeki argümanı okuyabilir veya yazabilir. Calldata alanı, read-only (saltoku) bir bellek bölgesidir, yani fonksiyonlar sadece okuma işlemleri yapabilir, yazma işlemi gerçekleştiremezler.

Bu nedenle, Solidity’deki fonksiyonlar, argümanları işlemek için calldata alanını kullanır ve bu alanın yapısı ve işleyişi önemlidir.

Call Fonksiyonu Nedir?

Call fonksiyonu, Solidity programlama dilinde, bir sözleşmedeki fonksiyonları çağırmak için kullanılan bir yöntemdir. Call fonksiyonu, harici fonksiyon çağrısı yapmak için kullanılır ve çağrılan fonksiyonun geri dönüş değerlerini alabilir.

Call fonksiyonu, aşağıdaki parametreleri alır:

  • address: çağrılacak sözleşmenin adresi
  • data: çağrılacak fonksiyonun function selector’ı ve parametrelerinin kodu
  • value: sözleşmeye gönderilecek Ether miktarı (isteğe bağlı)
  • gas: fonksiyonun işlemesi için ayrılan gaz miktarı

Call fonksiyonu, çağrılan fonksiyonun geri dönüş değerlerini bytes32 türünde bir değer olarak döndürür. Bu değer, Solidity’deki abi.decode() fonksiyonu kullanılarak çözümlenerek orijinal veriye dönüştürülebilir.

Call fonksiyonu, Solidity’deki akıllı sözleşmelerde, diğer sözleşmelere veya dış dünyadaki harici kaynaklara (örneğin, diğer blok zincirleri veya web servisleri) erişmek için yaygın bir şekilde kullanılır.

Contract Adresi Nedir?

Ethereum blok zincirinde bir sözleşme oluşturulduğunda, bir kontrat adresi oluşturulur. Bu adres, sözleşmenin yerel olarak kaydedildiği blok zincirindeki tekil kimliğidir.

Sözleşme oluşturulurken, sözleşmenin bytecode’ı (derlenmiş işlem kodu) blok zincirine gönderilir ve bu bytecode, blok zincirindeki bir adrese karşılık gelen kod olarak işlenir. Bu adres, sözleşmenin kontrat adresidir.

Kontrat adresleri, 20 byte uzunluğunda hexadecimal (16’lık) sayılardır ve 0x ile başlarlar. Bu adresler, blok zincirindeki diğer hesaplar gibi işlem yapabilirler, Ether alıp gönderebilirler ve diğer akıllı sözleşmelere erişebilirler.

Bir kontrat adresi, Ethereum blok zincirindeki bir akıllı sözleşmenin benzersiz kimliğini temsil eder ve blok zinciri üzerindeki işlemler ve işlemlerin durumu hakkında bilgi almak için kullanılabilir.

Transfer Fonksiyonu Nedir?

Transfer fonksiyonu, Ethereum blok zincirindeki bir hesaptan diğerine Ether göndermek için kullanılan bir fonksiyondur. Bu fonksiyon, Solidity programlama dilinde, önceden belirlenmiş bir miktar Ether’ı belirtilen adrese gönderir.

Transfer fonksiyonu, bir hesaptan diğerine Ether göndermek için kullanılabilir, ancak yalnızca Ethereum’in temel birimi olan Ether gönderilebilir. Diğer varlıklar veya jetonlar, özel transfer fonksiyonları aracılığıyla gönderilir.

Transfer fonksiyonu, Solidity’deki bir fonksiyon olarak kullanılabilir ve aşağıdaki parametreleri alır:

  • Adres: Ether’in gönderileceği adres
  • Miktar: gönderilecek Ether miktarı

Transfer fonksiyonu, gönderme işlemi başarılıysa true, aksi takdirde false değeri döndürür. Ayrıca, transfer işleminin durumu ve işlem kimliği hakkında bilgi almak için, blok zincirindeki işlem kimliği kullanılabilir.

Transfer fonksiyonu, Ethereum’daki akıllı sözleşmelerde sıklıkla kullanılır ve akıllı sözleşmelerin otomatik ödeme işlemleri ve diğer benzer işlemleri gerçekleştirmesi için gereklidir.

Contract üzerinde transfer nasıl gerçekleştirilir?

Ethereum blok zinciri üzerindeki bir akıllı sözleşme içinde, bir transfer işlemi gerçekleştirmek için, sözleşmenin bakiyesi yeterli olmalı ve sözleşmenin transfer fonksiyonu çağrılmalıdır.

Örneğin, aşağıdaki Solidity kod örneği, bir sözleşme içindeki transfer fonksiyonunu kullanarak, sözleşme adresinden başka bir adrese Ether transferi gerçekleştirir:

pragma solidity ^0.8.0;

contract MyContract {
    function transferEther(address payable _recipient) public payable {
        _recipient.transfer(msg.value);
    }
}

Bu kod örneğinde, transferEther fonksiyonu, payable parametresiyle belirtilen _recipient adresine, msg.value parametresiyle belirtilen Ether miktarını transfer eder. Fonksiyon, sözleşme bakiyesinin yeterli olduğunu kontrol eder ve transfer işlemini gerçekleştirir.

Transfer fonksiyonu, payable anahtar kelimesi ile birlikte kullanılmalıdır, böylece sözleşmeye Ether gönderilebilir. Ayrıca, transfer işlemi, sözleşmenin bakiyesinin yeterli olması ve sözleşmenin sahibinin izniyle gerçekleştirilebilir.

Transfer işlemi gerçekleştirilirken, gas maliyetleri ve diğer ücretler de hesaba katılmalıdır. Bu nedenle, transfer işleminin doğru bir şekilde yapıldığından ve sözleşmenin bakiyesinin doğru bir şekilde yönetildiğinden emin olmak önemlidir.

Function Selector’ın önemi nedir?

Function Selector’ın önemi, Solidity programlama dilinde ve Ethereum blok zincirinde verimli bir şekilde işlevsellik sağlamasıdır.

Ethereum blok zincirinde, akıllı sözleşmeler arasında işlem yapmak için kullanılan düşük seviyeli bir protokol olan Ethereum Virtual Machine (EVM) kullanılır. EVM, işlem verilerini işlerken, işlemin hangi fonksiyonu çağırdığını belirlemek için Function Selector’ı kullanır. Bu sayede, EVM işlem verilerini daha hızlı ve güvenilir bir şekilde işleyebilir.

Function Selector, her Solidity fonksiyonunun benzersiz bir kodunu temsil eder. Bu sayede, bir fonksiyonun çağrılması sırasında, doğru fonksiyonun çağrıldığından emin olunur. Ayrıca, Function Selector’ın kullanımı, gas tasarrufu sağlar ve aynı zamanda Solidity programcılarına daha okunaklı kod yazma imkanı verir.

Function Selector ayrıca, Ethereum blok zinciri üzerindeki akıllı sözleşmelerin etkileşimlerinde de önemlidir. Akıllı sözleşmeler arasında fonksiyon çağrısı yaparken, Function Selector sayesinde, doğru fonksiyonun çağrıldığından emin olunur. Bu, akıllı sözleşmeler arasında doğru veri alışverişini sağlayarak, sistemde hatalı işlem yapılmasını önler.

Sonuç olarak, Function Selector’ın önemi, Solidity programlama dilinde ve Ethereum blok zincirinde doğru ve verimli bir işlevsellik sağlamasıdır.

Function Selector Kullanım Örnekleri

Function Selector’ın kullanımı hakkında öğretici birkaç örnek şöyle:

  1. Örnek:
pragma solidity ^0.8.0;

contract MyContract {
    function foo(uint256 x) public pure returns (uint256) {
        return x * 2;
    }
}

Bu Solidity sözleşmesinde, foo isimli bir fonksiyonumuz var. Bu fonksiyon, uint256 tipinde bir parametre alır ve geriye uint256 tipinde bir değer döndürür.

Function Selector, her fonksiyon için benzersiz bir kimlik numarasıdır ve bu numara, ilk 4 baytta yer alır. Bu örnekte, foo fonksiyonunun Function Selector’ı 0xcdcd77c0 şeklindedir.

  1. Örnek:
function bar() external view returns (uint256) {
    return address(this).balance;
}

Bu fonksiyon, bu sözleşmenin bakiyesini döndürür. Fonksiyonun Function Selector’ı 0x4d370d03 şeklindedir.

  1. Örnek:
pragma solidity ^0.8.0;

contract MyContract {
    function baz() external pure {
        revert("This function always reverts");
    }
}

Bu fonksiyon, her zaman revert işlemi gerçekleştirir. Fonksiyonun Function Selector’ı 0xe8ce51dc şeklindedir.

Bu örneklerde olduğu gibi, Function Selector’ın her fonksiyon için benzersiz bir kodu olduğu unutulmamalıdır. Bu sayede, her fonksiyonun doğru bir şekilde çağrılması ve işlemin hatasız bir şekilde gerçekleştirilmesi sağlanır.

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

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

contract FunctionSelector {
    /*
    "transfer(address,uint256)"
    0xa9059cbb
    "transferFrom(address,address,uint256)"
    0x23b872dd
    */
    function getSelector(string calldata _func) external pure returns (bytes4) {
        return bytes4(keccak256(bytes(_func)));
    }
}

Bu akıllı sözleşme, bir string parametre alan bir fonksiyon kullanarak, belirli bir işlev için Function Selector’ı hesaplayan bir Solidity sözleşmesidir.

Sözleşme içerisinde, Ethereum topluluğunda yaygın olarak kullanılan iki fonksiyon için Function Selector’lar önceden tanımlanmıştır: transfer(address,uint256) ve transferFrom(address,address,uint256). Bu iki fonksiyon, bir ERC-20 token standartına uygun akıllı sözleşmelerde yaygın olarak kullanılan fonksiyonlardır.

getSelector fonksiyonu, _func adlı bir string parametresi alır ve keccak256 hash fonksiyonu ile bu string parametresini özetleyerek, bir bytes4 değeri olarak geri döndürür. Bu bytes4 değeri, _func parametresi olarak belirtilen işlevin Function Selector’ını temsil eder.

Örneğin, transfer(address,uint256) fonksiyonunun Function Selector’ı 0xa9059cbb ve transferFrom(address,address,uint256) fonksiyonunun Function Selector’ı 0x23b872dd olarak önceden tanımlanmıştır. Bu sözleşme, _func parametresine "transfer(address,uint256)" veya "transferFrom(address,address,uint256)" stringini vererek, ilgili işlevin Function Selector’ını hesaplamak için kullanılabilir.

SONUÇ BAĞLAMI

Function Selector, Solidity programlama dilinde bir fonksiyonun benzersiz kimliğini tanımlamak için kullanılan bir yöntemdir. Fonksiyon çağrıları, calldata adı verilen bir veri alanı içinde bulunan Function Selector’ı kullanarak belirli bir fonksiyonu hedefler.

Function Selector’ın önemi, Ethereum topluluğunda kullanılan standart fonksiyonlar için bir kimlik oluşturarak, bu fonksiyonların çağrılarının doğru hedeflenmesini ve işlevlerin yanlış kullanımını önlemektedir.

Ayrıca Function Selector, Solidity programlama dilinde dinamik olarak fonksiyon çağrısı yapmak için kullanılır. Örneğin, abi.encodeWithSelector fonksiyonu, bir Solidity fonksiyonunun Function Selector’ını ve argümanlarını içeren bir bytes verisi oluşturur.

Function Selector’ın kullanımı, Solidity programlama dilinde çalışan geliştiriciler için temel bir kavramdır ve bu konuda sağlam bir anlayış, doğru ve güvenli sözleşmeler oluşturmalarına yardımcı olabilir.

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