1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 041 : ABI Decode

🧵 #100GündeSolidity 041 : ABI Decode
ABI Decode
0

ABI Decode

ABI (Application Binary Interface), Solidity dışındaki programlama dilleri ile Solidity akıllı sözleşmeleri arasında iletişim kurmanın bir yoludur. ABI, işlev imzalarını, argümanlarını ve değerleri gibi verileri belirli bir formatta kodlamak ve kodları çözmek için kullanılır. Bu sayede, Solidity akıllı sözleşmeleri, diğer dillerden gelen verileri anlayabilir ve işleyebilir.

abi.encode ve abi.decode, Solidity akıllı sözleşmeleri içindeki ABI kodlamasını işlemek için kullanılan iki fonksiyondur. abi.encode, Solidity’deki verileri byte dizisine dönüştürür. abi.decode ise byte dizilerini Solidity verilerine dönüştürür.

abi.encode ve abi.decode kullanırken dikkat edilmesi gereken bazı noktalar vardır. Örneğin, abi.encode kullanılırken, kullanılan verilerin doğru sırayla verilmesi gerekir. Ayrıca, abi.decode kullanılırken, byte dizisinin doğru uzunluğu belirtilmelidir. Bunların yanı sıra, kodlama ve kod çözme işlemi sırasında veri türlerinin doğru şekilde belirtilmesi de önemlidir.

ABI kodlama ve kod çözme işlemleri, Solidity akıllı sözleşmelerinin dış dünya ile iletişim kurması için önemlidir. Bu nedenle, Solidity geliştiricileri için abi.encode ve abi.decode fonksiyonlarını kullanmayı öğrenmek önemlidir.

Haydi detaylı olarak dalalım!

Solidity, Ethereum blokzincirinde akıllı sözleşmeleri yazmak için kullanılan bir programlama dilidir. Akıllı sözleşmeler, programlanabilir, güvenli ve merkezi olmayan uygulamaların geliştirilmesine olanak sağlar. Solidity akıllı sözleşmeleri, dış dünya ile iletişim kurmak için ABI (Application Binary Interface) adı verilen bir arayüz kullanır.

ABI, Solidity dışındaki programlama dilleri ile Solidity akıllı sözleşmeleri arasında veri kodlamak ve kodları çözmek için kullanılır. abi.encode ve abi.decode fonksiyonları, Solidity akıllı sözleşmeleri içindeki ABI kodlamasını işlemek için kullanılan iki fonksiyondur. abi.encode, Solidity’deki verileri byte dizisine dönüştürürken, abi.decode ise byte dizilerini Solidity verilerine dönüştürür.

Bu makalede, Solidity’de abi.encode ve abi.decode fonksiyonlarının nasıl kullanılabileceği hakkında bilgi verilecektir.

ABI Nedir?

ABI (Application Binary Interface), Solidity dışındaki programlama dilleri ile Solidity akıllı sözleşmeleri arasında veri kodlamak ve kodları çözmek için kullanılan bir arayüzdür. ABI, Solidity akıllı sözleşmeleri tarafından kullanılan bir standarttır ve Ethereum blokzincirindeki akıllı sözleşmelerin işlevselliğinin bir parçasıdır.

ABI’nin önemi, Solidity akıllı sözleşmeleri ile dış dünya arasındaki etkileşimlerin gerçekleştirilmesidir. Akıllı sözleşmelerin işlevselliğinin birçoğu, dış dünyadan gelen verilere bağlıdır. Örneğin, bir akıllı sözleşme, bir kullanıcının bir ödeme yapmasını gerektirebilir veya bir kullanıcının hesap bilgilerini sorgulayabilir. Bu nedenle, Solidity akıllı sözleşmelerinin dış dünya ile iletişim kurabilmeleri için, dış dünya ile kullanacakları standart bir veri biçimi olan ABI’ya ihtiyaçları vardır.

ABI, Solidity akıllı sözleşmelerinin işlevselliğinin bir parçasıdır ve Ethereum blokzincirindeki akıllı sözleşmelerin işlevselliğini etkiler. Akıllı sözleşmelerin dış dünya ile etkileşimlerinde ABI’nin kullanılması, Ethereum blokzincirindeki uygulamaların güvenli ve doğru bir şekilde çalışmasını sağlar.

ABI’nin önemi ve kullanım alanları.

ABI’nin en önemli kullanım alanı, Solidity akıllı sözleşmeleri ve dış dünya arasındaki etkileşimlerin gerçekleştirilmesidir. Solidity programlama dili ile yazılmış akıllı sözleşmelerin, dış dünya ile etkileşimlerinde kullanacakları standart bir veri biçimi olan ABI, Ethereum blokzincirindeki uygulamaların doğru ve güvenli bir şekilde çalışmasını sağlar.

ABI’nin diğer önemli kullanım alanları şunlardır:

  • Akıllı sözleşmeler arasındaki iletişim: Farklı akıllı sözleşmeler arasındaki iletişimde de ABI kullanılır. Bu sayede, farklı akıllı sözleşmeler arasında veri alışverişi yapmak ve işlem yapmak mümkün hale gelir.
  • Akıllı sözleşme veri yönetimi: ABI, akıllı sözleşmelerin veri yönetiminde de kullanılır. Akıllı sözleşmeler, çeşitli veri yapıları, fonksiyonlar, değişkenler ve diziler içerir. Bu verilerin yönetimi ve işlenmesi için ABI’nin sağladığı veri yapısı ve yapısal format kullanılır.
  • Akıllı sözleşme güvenliği: ABI’nin kullanımı, akıllı sözleşme kodlarının güvenliği açısından da önemlidir. Akıllı sözleşmelerin, Ethereum blokzincirindeki herkes tarafından erişilebilir olması, güvenlik açıklarına neden olabilir. ABI’nin kullanımı, akıllı sözleşme kodlarının doğru ve güvenli bir şekilde işlem yapmasını sağlar.
  • Akıllı sözleşme entegrasyonu: ABI, akıllı sözleşmelerin diğer uygulamalarla entegre edilmesinde de kullanılır. Örneğin, bir web uygulaması, bir Solidity akıllı sözleşmesi ile etkileşim kurmak istediğinde, ABI’yi kullanarak veri alışverişi yapabilir.

abi.encode Fonksiyonu

abi.encode fonksiyonu, Solidity programlama dilindeki verileri byte dizisine dönüştürmek için kullanılan bir fonksiyondur. Bu fonksiyon, verileri Ethereum blokzincirindeki diğer akıllı sözleşmelere veya dış dünyaya göndermek veya bir akıllı sözleşmeden veri almak için kullanılır.

abi.encode fonksiyonunun kullanımı şu şekildedir:

abi.encode(typeName param1, typeName param2, ...)

Burada typeName, parametre olarak verilen değişkenin veri türünü belirtir. Fonksiyona verilen değişkenlerin doğru sırayla ve veri türlerinin doğru şekilde belirtilmesi önemlidir.

Örnek olarak, bir uint256 ve bir string verisini byte dizisine dönüştürmek istediğimizi varsayalım. Bu durumda abi.encode fonksiyonunu şu şekilde kullanabiliriz:

uint256 number = 12345;
string memory message = "Hello World";
bytes memory encoded = abi.encode(number, message);

Bu örnekte, önce uint256 türünde bir değişken olan “number” ve sonra string türünde bir değişken olan “message” fonksiyona parametre olarak verilir. Fonksiyon, bu verileri doğru şekilde sıralayarak byte dizisine dönüştürür ve “encoded” değişkenine atar.

Dikkat etmemiz gereken önemli bir nokta, verilerin doğru sırayla verilmesidir. Örneğin, yukarıdaki örnekte, “number” değişkeninin “message” değişkeninden önce yazılması gerekiyordu. Ayrıca, veri türleri de doğru şekilde belirtilmelidir. Örneğin, “number” değişkeni uint256 türünde olduğu için, “abi.encode” fonksiyonunda da “uint256” türü belirtilmelidir.

abi.decode Fonksiyonu

abi.decode fonksiyonu, Solidity programlama dilinde byte dizilerini Solidity verilerine dönüştürmek için kullanılan bir fonksiyondur. Bu fonksiyon, diğer akıllı sözleşmeler veya dış dünyadan alınan byte dizilerini Solidity verilerine dönüştürmek için kullanılır.

abi.decode fonksiyonunun kullanımı şu şekildedir:

abi.decode(bytes memory encoded, (typeName1, typeName2, ...) )

Burada, “encoded” değişkeni dönüştürülecek byte dizisini, parantez içindeki “typeName” değişkenleri ise byte dizisinin dönüştürüleceği Solidity veri türlerini belirtir. Fonksiyona verilen değişkenlerin doğru sırayla ve veri türlerinin doğru şekilde belirtilmesi önemlidir.

Örnek olarak, bir byte dizisinde depolanan uint256 ve string verilerini Solidity verilerine dönüştürmek istediğimizi varsayalım. Bu durumda abi.decode fonksiyonunu şu şekilde kullanabiliriz:

bytes memory encoded = hex"0000000000000000000000000000000000000000000000000000000000003039"
                    hex"000000000000000000000000000000000000000000000000000000000000000c"
                    hex"48656c6c6f20576f726c64";
(uint256 number, string memory message) = abi.decode(encoded, (uint256, string));

Bu örnekte, önce byte dizisindeki veriler hex formatında “encoded” değişkenine atanır. Sonra abi.decode fonksiyonu kullanılarak, önce uint256 türünde bir değişken olan “number” ve sonra string türünde bir değişken olan “message” Solidity verilerine dönüştürülür.

Dikkat etmemiz gereken önemli bir nokta, byte dizisinin doğru uzunluğu belirtilmesidir. Örneğin, yukarıdaki örnekte, uint256 türünde olan “number” değişkeni için byte dizisi 32 byte uzunluğunda olmalıdır. Ayrıca, veri türleri de doğru şekilde belirtilmelidir. Örneğin, “number” değişkeni uint256 türünde olduğu için, “abi.decode” fonksiyonunda da “uint256” türü belirtilmelidir.

ABI Encode ve Decode Örnekleri

Basit bir örnek:

Aşağıdaki örnekte, bir uint256 değişkenini byte dizisine dönüştürmek ve sonra byte dizisini tekrar uint256 verisine dönüştürmek için abi.encode ve abi.decode fonksiyonlarını kullanacağız:

uint256 num = 12345;
bytes memory encoded = abi.encode(num);
uint256 decoded = abi.decode(encoded, (uint256));

Bu örnekte, önce uint256 türünde bir değişken olan “num” tanımlanır ve 12345 değeri atanır. Sonra abi.encode fonksiyonu kullanılarak, “num” değişkeni byte dizisine dönüştürülür ve “encoded” değişkenine atanır. Daha sonra, abi.decode fonksiyonu kullanılarak “encoded” değişkeni uint256 veri tipine dönüştürülür ve “decoded” değişkenine atanır.

Daha karmaşık bir örnek:

Aşağıdaki örnekte, bir struct verisini byte dizisine dönüştürmek ve sonra byte dizisini tekrar struct verisine dönüştürmek için abi.encode ve abi.decode fonksiyonlarını kullanacağız:

struct Person {
    string name;
    uint256 age;
    bool isEmployed;
}

Person memory person = Person("Alice", 30, true);
bytes memory encoded = abi.encode(person);
(Person memory decodedPerson) = abi.decode(encoded, (Person));

Bu örnekte, önce “Person” isimli bir struct verisi tanımlanır ve “person” değişkenine atanır. Daha sonra abi.encode fonksiyonu kullanılarak, “person” değişkeni byte dizisine dönüştürülür ve “encoded” değişkenine atanır. Son olarak, abi.decode fonksiyonu kullanılarak “encoded” değişkeni “Person” türüne dönüştürülür ve “decodedPerson” değişkenine atanır.

Dikkat edilmesi gereken noktalar:

  • Struct içindeki veri tiplerinin doğru şekilde belirtilmesi gerekiyor.
  • Struct içindeki string veri tipi kullanılıyorsa, Solidity sürümü 0.8.0 veya sonrası olmalıdır. Öncesinde, string veri tipi için byte dizisi kullanılıyordu.

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

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

contract AbiDecode {
    struct MyStruct {
        string name;
        uint[2] nums;
    }

    function encode(
        uint x,
        address addr,
        uint[] calldata arr,
        MyStruct calldata myStruct
    ) external pure returns (bytes memory) {
        return abi.encode(x, addr, arr, myStruct);
    }

    function decode(
        bytes calldata data
    )
        external
        pure
        returns (uint x, address addr, uint[] memory arr, MyStruct memory myStruct)
    {
        // (uint x, address addr, uint[] memory arr, MyStruct myStruct) = ...
        (x, addr, arr, myStruct) = abi.decode(data, (uint, address, uint[], MyStruct));
    }
}

Bu akıllı sözleşme AbiDecode olarak adlandırılmış ve birkaç fonksiyon içermektedir. MyStruct adında bir struct tanımlanmıştır, bu struct içinde name adında bir string ve nums adında iki elemanı olan bir uint dizisi bulunmaktadır.

encode fonksiyonu, x adında bir uint, addr adında bir address, arr adında bir uint dizisi ve myStruct adında bir MyStruct yapısını parametre olarak alır. Fonksiyon, parametreleri abi.encode fonksiyonunu kullanarak byte dizisine dönüştürür ve bu byte dizisini döndürür.

decode fonksiyonu ise bir byte dizisi alır ve bu byte dizisini abi.decode fonksiyonunu kullanarak geri dönüştürür. Geri dönüştürülen veriler x adında bir uint, addr adında bir address, arr adında bir uint dizisi ve myStruct adında bir MyStruct yapısıdır.

Not: calldata anahtar kelimesi, işlevin bellek yerine çağıranın belleğinde depolanan verilere erişebileceğini belirtmek için kullanılır. memory anahtar kelimesi, işlevin bellekteki verilere erişeceğini belirtmek için kullanılır.

Sonuç Bağlamı

Sonuç olarak, ABI encode ve decode işlemleri, Solidity akıllı sözleşmelerinin dış dünya ile iletişim kurabilmesi için oldukça önemlidir. abi.encode fonksiyonu Solidity’deki verileri byte dizisine dönüştürürken, abi.decode fonksiyonu byte dizilerini Solidity verilerine dönüştürmek için kullanılır. Bu fonksiyonların doğru kullanımı için verilerin doğru sırayla ve doğru veri türleriyle belirtilmesi gereklidir. Solidity geliştiricileri için abi.encode ve abi.decode fonksiyonlarını kullanmayı öğrenmek oldukça önemlidir.

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

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