1. Anasayfa
  2. Solidity

Solidity Eğitimi Adresler Hakkında Her Şey

Solidity Eğitimi Adresler Hakkında Her Şey
Solidity Eğitimi Adresler
0

Solidity Eğitimi Adresler hakkında her şey

  • (Teknik olarak) Ethereum Adresi nedir?
  • Solidity’de Adreslerin Temeli ve adres değişmezleri
  • Adres ve ödenecek adres
  • Adreslerle kullanılabilen yöntemler ( call(), delegecall() ve staticcall() dahil)
  • Adresler ve ödenecek adresler arasındaki tür dönüşümleri
  • Bir adres türü döndüren yöntemler
  • Sıfır Adres
  • İleri Düzey Konular

Ethereum blok zincirinde yaklaşık 49 milyon benzersiz adres var.

Solidity Eğitimi

Ethereum’daki (ve genel olarak Blockchain’deki) adresleri anlamak için çok basit bir örnekle başlayalım . Bunun için bir senaryo hayal etmemiz gerekiyor.

Paris‘te tatildesiniz. Şehri ilk kez ziyaret ediyorsun ve onu seviyorsun! Öyle ki, arkadaşınız Jale A. ‘ya bir gün mutlaka ziyaret etmesi gerektiğini söylemeye karar veriyorsunuz .

Ona bir fikir vermenin iyi bir yolu, Eyfel Kulesi’nin kartpostalını göndermek olabilir.

Yani postaneye gidiyorsunuz ve postacı size “Nereye göndereyim?” diye soruyor, siz de “ arkadaşım Jale A.’ya” cevabını veriyorsunuz .

Masadaki çalışan;

  1. Arkadaşınız Jale A. ‘nın KİM olduğunu bilmiyor ve
  2. NEREDE yaşadığını bilmiyor.

Jale A. ‘nın adresini bildiğinize göre, onu kartpostala yazıp masadaki postane çalışanına vereceksiniz.

Gönderi şirketi daha sonra kartpostalınızı dünya çapındaki taşıyıcı ve ofis şubeleri ağını kullanarak gönderebilecek. Kart, postaneler ve kurye taşıyıcıları arasında aktarılacaktır.

İstanbul’a vardığında, bir postacı onu alacak ve Jale A. ‘nın posta kutusuna bırakacak…

Basit Bir Analoji

Bu kartpostal hikayesi, kulağa aşırı basitleştirilmiş bir örnek gibi gelebilir. Herkes nasıl mektup göndereceğini bilir ya da aldığı kuryeyi aramak için posta kutusunu açar.

Ancak, Ethereum adresi , posta adreslerine benzer özellikleri paylaşır . Ortak anahtar şifreleme kullanımı sayesinde. (Bunun herhangi bir Blockchain platformu için geçerli olduğunu unutmayın).

Benzersiz

Gerçek dünyada, bir posta adresi bir mektup kutusuyla ilgilidir. Coğrafi konumu ile bağlantılıdır.

Dünyada birkaç Jale A. olsa bile şu anda “sizin belirttiğiniz adreste” yaşayan tek bir Jale A. var .

Posta adresi, posta kutusunun üzerindeki kişinin adına ve posta kutusunun bulunduğu yere karşılık gelen etiket gibidir.

Ethereum’da bir adres, bir ortak anahtarla ilgilidir. Karma tanımlayıcısına bağlıdır.

Bir Ethereum adresi, belirli bir ortak anahtarın Hash’inin son 20 baytıdır. Kullanılan karma algoritma Keccak-256‘dır .

Hashing fonksiyonları deterministik olduğundan girdilerine özeldirler. Yani benzersiz bir özel anahtar için => benzersiz karma

Özel ve Gizli

Posta kutunuzun anahtarı sadece benzersiz değil, aynı zamanda özel ve gizlidir . Daha önce de benzersiz gördük, o yüzden şimdi “özel” ve “gizli”ye bakalım.

Özel = posta kutunuzu açma anahtarına yalnızca siz sahipsiniz. Anahtarı, diğer tüm anahtar setlerinizle birlikte bir anahtarlığa bağlayarak gizli tutarsınız.

Gizli = Siz ve sadece siz bu fiziksel anahtarın ne için kullanılabileceğini biliyorsunuz. Size anahtar setimi verirsem, posta kutumu açmak için hangi özel anahtarın kullanılabileceğini bilemezsiniz.

Benzer şekilde Ethereum’da özel anahtarınız cüzdanınızda saklanır. Bunu sadece sen bilmelisin ve asla paylaşmamalısın!

Gizli bir anahtar tarafından kontrol edilir

Gerçek dünyada, mektup kutunuzu benzersiz bir fiziksel anahtarla açabilirsiniz.

Posta kutunuzda, açmak için benzersiz bir anahtara bağlı yerleşik bir kilit bulunur. Yapabilirsiniz…

Ethereum’da hesabınızı benzersiz bir gizli anahtarla kullanabilirsiniz.

Kriptografi dünyasında “özel” ve “gizli” anahtarlar birbirinin yerine kullanılabilen terimlerdir. Genel anahtar, özel anahtardan türetilmiştir, dolayısıyla bunlar birbirine bağlanır.

Ethereum’daki özel anahtarlar, işlemleri imzalayarak Ether göndermenizi sağlar. Tek istisna, daha sonra göreceğimiz gibi akıllı sözleşmelerdir.

Farklı Adres Türleri

Ethereum adresleri posta adresiyle aynıdır: bir mesajın hedeflenen alıcısını temsil ederler.

Bir Ethereum işleminin ödeme kısmındaki adres, bir banka havalesindeki alıcı hesabıyla aynıdır.

Harici Olarak Sahip Olunan Hesaplar (EOA): Özel anahtarları tarafından kontrol edilir.

Özel anahtar, hesaptaki herhangi bir ethere erişim üzerinde ve akıllı sözleşmeleri kullanırken hesabın ihtiyaç duyduğu herhangi bir kimlik doğrulama üzerinde özel kontrol sağlar. Hesaptaki herhangi bir parayı harcamak için işlemleri imzalamak için gerekli olan dijital imzalar oluşturmak için gereken benzersiz bilgi parçalarıdır .

Sözleşme Hesapları (Akıllı Sözleşmeler): kodları tarafından kontrol edilir.

EOA’ların aksine, akıllı sözleşmelerle ilişkili genel veya özel anahtar yoktur . Akıllı sözleşmeler özel bir anahtarla değil, kendi içlerinde bulunan kodlarla desteklenir. “Kendilerine sahipler” diyebiliriz .

Her bir sözleşmenin adresi, kaynak hesabın ve nonce’nin bir fonksiyonu olarak sözleşme oluşturma işleminden türetilir (Daha sonra bundan bahsedeceğim). Bir sözleşmenin Ethereum adresi, bir işlemde alıcı olarak, sözleşmeye para göndererek veya sözleşmenin işlevlerinden birini çağırarak kullanılabilir.

1. Ethereum Adresi nedir?

Hash fonksiyonları, adresleri oluşturmak için anahtar unsurdur. Ethereum, bunları oluşturmak için keccak-256 karma işlevini kullanır.

Ethereum ve Solidity‘de, 20 bayt değer boyutunda (160 bit veya 40 onaltılık karakter) bir adres. Açık anahtarın Keccak-256 karmasının son 20 baytına karşılık gelir . Onaltılık biçimde (taban 16 gösterim) (açıkça tanımlanmıştır) temsil edildiğinden, bir adres her zaman ön sabitlidir. 0x

Bu tanım oldukça teknik ve kulağa karmaşık geliyor. Bir address türün temel öğelerini kalın harflerle yazdım. Ancak bu 3 unsuru tek tek açıklamanın pek doğru bir yaklaşım olmadığını düşünüyorum. Bunun yerine, size daha büyük bir resim verecek alternatif bir rotaya giderdim.

Bir ethereum adresinin özünü anlamanın en iyi yolu şunu anlamaktır:

Ethereum adresi nasıl oluşturulur?

Bir Ethereum adresinin oluşturma sürecini anlayın, ilk defa kişisel olarak çok ödüllendirici geliyor. Size Ethereum platformunun nasıl oluşturulduğuna dair farklı bir görüş ve anlayış sunar. Özellikle yazılım istemcisinin hesap bakiyelerini nasıl aradığını ve takip ettiğini doğru anlayın.

Ethereum blok zincirinin resmi teknik spesifikasyonuna atıfta bulunacağız: sarı kağıt. Her ne kadar karmaşık ve okunması zor görünse de, açıklamayı sindirimi kolay küçük adımlara bölerek anlamanıza yardımcı olacağım.

Harici Olarak Sahip Olunan Hesap adresleri nasıl oluşturulur?

Sarı kağıt özelliklerini uygulayalım ve sıfırdan bir ethereum adresi oluşturalım. Vincent Kobel‘in bu makalesini, Ethereum adresinin nasıl oluşturulacağı konusunda adım adım bir kılavuz olarak kullanacağız.

Genel anahtarla başlayın (128 karakter / 64 bayt)

pubKey = 6e145ccef1033de*23987*******6e3348b84985c92f1034446*ae07b83b5c38e5e...

Not: genel anahtar, ECDSA (Eliptik Eğri Dijital İmza Algoritması) kullanılarak özel anahtardan türetilmiştir. Ethereum, bitcoin ile aynı tür eğriyi kullanır.

Genel anahtara Keccak-256 karmasını uygulayın

64 karakter / 32 bayt uzunluğunda bir dize almalısınız.

Keccak256(pubKey) = 2a5b*342ed616b5ba5****69001d3f1ef827552a***1402*d3ecf1f086b***9

Elde edilen karmanın son 40 karakterini / 20 baytını (en az önemli bayt) alın

(Ya da başka bir deyişle, ilk 24 karakteri / 12 baytı bırakın). Bu 40 karakter / 20 bayt adrestir (aşağıda kalın harflerle yazılmıştır).

2*5b*342**616b5**5732269001d3f1*f827552**1114027bd3***1f086ba0f9
Address = 0x001d3f1*f827552**1114027bd3***1f086ba0f9

0x ile önek eklendiğinde, adres aslında 42 karakter uzunluğunda olur. . Ayrıca, büyük/küçük harfe duyarlı olmadıklarına dikkat etmek önemlidir. Tüm cüzdanların, yorum farkı olmaksızın büyük veya küçük harflerle ifade edilen Ethereum adreslerini kabul etmesi gerekir. (EIP-55’ten beri, bir sağlama toplamını doğrulamak için UpperCase adresleri kullanılır)

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9 
ya da
0X001D3F1EF827552AE1114027BD3ECF1F086BA0F9

Ethereum’da sözleşme adresleri nasıl oluşturulur?

Sözleşme adresleri farklı oluşturulur. İki şeyden deterministik olarak hesaplanırlar:

  • Yaratıcısının adresi: sender (gönderen)
  • İçerik oluşturucunun kaç işlem gönderdiği: nonce

Sözleşmenin adresinin nasıl oluşturulduğuna ilişkin adımlar

  • sender ve nonce değerlerini alın.
  • RLP onları kodlar
  • Onları Keccak-256 ile hash edin.

Özetle Adresler

Özetle, Solidity‘de bir adres türünün arkasındaki ana özellikler şunlardır:

  • 20 bayt uzunluğunda (160 bit): söylendiği gibi, bir ethereum adresi, ilişkili ortak anahtarının Keccak-256 karmasının son 20 baytına karşılık gelir.
  • Onaltılık biçim (temel 16 gösterim): bir Ethereum adresi, onaltılık aralıktan (0 1 2 3 4 5 6 7 8 9 veya a b c d e f) tam olarak 40 karakter içerir (2 karakter = 1 bayt).
  • Her zaman 0x ile önceden sabitlenmiştir : onaltılık biçim olduğundan, 0x ile ön ekinin eklenmesi gerekir. Bu nedenle, 0x’i sayarsak toplam uzunluğu aslında 42 karakterdir 😉

Şimdi teoriden geri adım atalım ve Remix’te biraz Solidity kodu yazalım.

2. Solidity’deki Adreslerin Temeli

Adres türünde bir değişken nasıl tanımlanır?

Adres tipinde bir değişken tanımlamak için, değişken adının önüne anahtar kelime adresini belirtin.

address user = msg.sender

Akıllı sözleşme ile etkileşime giren cari hesabın adresini almak için Solidity yerleşik işlevi msg.sender‘ı kullandık.

Ancak, adres değişmezlerini kullanarak Solidity kodunuzdaki belirli adresleri de sabit kodlayabilirsiniz. Bunlar bir sonraki bölümde açıklanmaktadır.

Adres değişmezleri

Adres değişmezleri, bir solidity dosyasında sabit kodlanmış bir Ethereum adresinin onaltılık gösterimidir.

Burada, Solidity‘de bir adres değişmezlerinin nasıl bildirileceğine dair bir örnek verilmiştir.

address owner = 0xc0ffaa365820296b54b3885639AC7E10F9d54868

Daha önce görüldüğü gibi, bir adres değişmezi şunları yapmalıdır:

  • 40 karakter (20 bayt uzunluğunda) içerir ve
  • 0x ile ön eki olmalıdır.
  • geçerli bir toplam sağlamına (checksum) sahip olmak

Adres değişmezleri geçerli bir toplam sağlamına sahip olmalıdır. Checksum testini geçemezlerse, Remix veya Solidity derleyicisi bir uyarı getirecek ve bunu düzenli rasyonel sayı aralıkları olarak değerlendirecektir.

Karışık durum adresi sağlama toplamı biçimi EIP-55‘te tanımlanmıştır

ethsum.netlify.com web sitesi, bir ethereum adresini (tümü küçük harflerle) sağlama toplamlı bir adrese dönüştürmenizi sağlayan gerçekten kullanışlı bir araçtır.

Son olarak, adres değişmezleri varsayılan olarak address payable olarak ayarlanır.

3. address ile address payable arasındaki fark nedir?

address ve payable address arasındaki ayrım Solidity 0.5.0 sürümünde tanıtıldı. Fikir, para alabilen ve alamayan (başka amaçlar için kullanılan) adresler arasında ayrım yapmaktı. Basitçe söylemek gerekirse, bir adresss payable Ether alabilirken, düz bir address alamaz.

Yani Solidity’de, gönderen açısından:

address payable olarak tanımlanan bir değişkene Ether gönderebilirsiniz. address olarak tanımlanan bir değişkene Ether gönderemezsiniz

Bir address türünün değişken adından önce, onun ether almasını sağlamak için payable anahtar sözcüğünü kullanabilirsiniz.

Not: msg.sender tarafından döndürülen tür, ödenebilir adres (address payable) türündedir.

Sonuç olarak, Solidity‘de ödenebilir olarak tanımlanan bir adres için şu yöntemler kullanılabilir hale gelir: .transfer() , .send() , .call() , .delegatecall() ve .staticcall()

4. Adresler ile kullanılabilen yöntemler

Bu bölüm, adres ve ödenecek adresler için kullanılabilen farklı yöntemleri ayrıntılı olarak ele almaktadır.

Not: Aşağıdaki yöntemlerde parametre olarak belirtilen Ether _amount, Wei (18 sıfır) olarak ifade edilir:

1 Eter = 1¹⁸ Wei = 1.000.000.000.000.000.000 wei

//Solidity'de adresler için kullanılabilen üye işlevleri

```solidity
_address.balance(uint256)
```
```solidity
_payable_address.transfer(uint256 _amount)
```
```solidity
_payable_address.send(uint256 _amount) returns (bool)
```
```solidity
_payable_address.call(bytes memory) returns (bool, bytes memory)
```
```solidity
_payable_address.delegatecall(bytes memory) returns (bool, bytes memory)
```
```solidity
_payable_address.staticcall(bytes memory) returns (bool, bytes memory)
```

Adreslerle ilişkili solidity yöntemlerini 2 kategoriye veya işlem türüne ayıracağız:

  • etherlerle ilgili yöntemler: .balance(), .transfer() ve .send()
  • sözleşme etkileşimleriyle ilgili yöntemler: .call() , .delegatecall() ve .staticcall()

Eterlerle ilgili yöntemler

address.balance

Wei’deki hesap bakiyesini döndürür.

address olarak tanımlanan herhangi bir değişken, kullanılabilir .balance() yöntemine sahiptir. Bu, Harici Olarak Sahip olunan bir Hesap (EOA / Kullanıcı) veya bir Sözleşme Hesabı tarafından tutulan Ether miktarını almayı sağlar. Döndürülen sayı, Wei’deki bir Ether miktarını temsil eder.

Aşağıdaki kod, eter bakiyesini adresinizden nasıl alacağınızı gösterir. Örnekte msg.sender kullanıyoruz.

// Paramı Goster!
address my_account = msg.sender;
uint my_ether_balance = my_account.balance;
// ya da izin ver!
uint my_ether_balance = msg.sender.balance;

Aslında bir Ethereum adresine bakmanın iki yöntemi vardır.

// _account'tan bakiye arama (Yöntem 1)
uint public sender_balance = _account.balance;
   
// açık dönüştürme kullanarak bakiye ara (Yöntem 2)
uint public sender_balance = address(_account).balance;

Mevcut sözleşmenin bakiyesini almak istiyorsanız, address(this) (açık dönüştürme) kullanabiliriz.

// mevcut sözleşmeden bakiye ara (Yöntem 2)
uint public Contract_balance = address(this).balance;

<address>.balance gibi bir ifade, blok zinciri verilerine eriştiği için durumdan okuma olarak kabul edilir. Bu nedenle, Solidity‘de <address>.balance döndüren herhangi bir işlev view olarak tanımlanabilir.

_address.transfer()
  • Eter miktarını (wei cinsinden) belirtilen hesaba aktarın.
  • Başarısızlıkta geri döner ve herhangi bir hatada bir istisna atar.
  • İleriye dönük 2.300 gaz değeri, ayarlanabilir değil.

Başlık altında, .transfer() işlevi, etheri göndermeden önce özellik dengesini uygulayarak bir adresin bakiyesini sorgular.

address.send()
  • address.transfer() ile benzer
  • Başarısızlık durumunda false döndürür (Uyarı: her zaman send öğesinin dönüş değerini kontrol edin!)
  • İleriye dönük 2.300 gaz değeri, ayarlanabilir değil.

Sözleşme etkileşim yöntemleri

Solidity, diğer sözleşmelerdeki işlevleri çağırmak için üst düzey sözdiziminin rahatlığını sunar (örneğin: targetContract.doSomething(…) ). Ancak, bu üst düzey sözdizimi, yalnızca derleme zamanında hedef sözleşmenin arabirimi biliniyorsa kullanılabilir.

EVM, diğer akıllı sözleşmelerle etkileşime girmek için 4 özel işlem kodu sağlar; bunlardan 3’ü addresss türünde yöntemler olarak kullanılabilir: call, delegatecode ve staticcall.

Not: callcode artık kullanımdan kaldırılmıştır, ancak hala düşük seviyeli seçenek olarak mevcuttur.

Aşağıda tanımlanan tüm düşük seviyeli işlevler bir argümanı kabul eder: ham mesaj (web3’te encodeABI() ile oluşturulabilir).

Bu bölümde, bu düşük seviyeli mesaj aktarma yöntemlerini anlatacağız. Daha iyi anlamak için bağlamı üç bölüme ayırmamız gerekiyor:

  • A sözleşmesinin B sözleşmesiyle etkileşime girdiği bir senaryoyu ele alıyoruz.
  • arayan kim? Hangi sözleşmenin deposu güncellenir?
  • Teknik detaylar (döndürülen değerler, aktarılan gazlar vb…)

address.call(bytes memory) döndürür (bool, bytes memory)

Ben sözleşme A’yım ve sözleşmenin B deposu için sözleşmenin B işlevini yürütmek istiyorum. B.function() işlevinin çağrılması yalnızca B’nin deposunu güncelleyebilir.

Solidity Eğitimi

UYARI: GÜVENLİ DEĞİL!

Alıcı (yanlışlıkla veya kötü niyetle) tüm gazınızı tüketebilir ve sözleşmenizin bir OOG istisnası dışında durmasına neden olabilir; her zaman çağrının dönüş değerini kontrol edin.

Özellikler

  • Argüman olarak iletilen belleğe (veri yükü) göre rastgele bir mesaj çağrısı oluşturur (düşük seviyeli CALL , bkz. Opcode OxF1).
  • Mevcut tüm gazı ilet, ayarlanabilir.
  • Bir demet döndürür:
    • Çağrı sonucu için bir boole (başarıda doğru, başarısızlıkta veya hatada yanlış).
    • Bytes formatındaki veriler.
address.callcode(__payload__)

.callcode() artık .delegatecall() lehine kullanımdan kaldırılmıştır. Ancak, satır içi yapıda kullanmak hala mümkündür.

Sözleşme A esasen B’nin işlevini kopyalıyor.

Ben A sözleşmesiyim ve depolama alanım için sözleşmenin B işlevini yürütmek istiyorum. B.function() işlevinin çağrılması, A’nın deposunu güncelleyecektir.

Özellikler

Düşük seviye CALLCODE işlevi, address(this).call(…) gibi, ancak bu sözleşmenin kodu adresinkiyle değiştirildi.
Hata durumunda false döndürür.

_address.delegatecall(bytes memory) döndürür (bool, bytes memory)

Ben A sözleşmesiyim ve sözleşmenin B işlevini yerine getirmek istiyorum, ancak B sözleşmesi benmişim gibi davranabilir.

B’nin işlevi, A’nın deposunun üzerine yazabilir ve başka herhangi bir sözleşmeye A gibi davranabilir.

msg.sender A’nın adresi olacak, B değil.

Bu durumda, sözleşme A esas olarak işlev çağrısını B’ye devrediyor. Önceki callcode yöntemiyle olan fark, delegatecall kullanmanın yalnızca sözleşme A depolamasının üzerine yazılmasını sağlamakla kalmamasıdır.

B sözleşmesi başka bir C sözleşmesini çağırırsa, C sözleşmesi msg.sender‘ın A sözleşmesi olduğunu görecektir.

Özellikler

  • Düşük seviyeli DELEGATECALL , bkz. Opcode OxF4) (mevcut sözleşme tarafından görülen tam msg bağlamı ile) bir argüman olarak geçirilen bellek (veri yükü) göz önüne alındığında.
  • Mevcut tüm gazı ilet, ayarlanabilir.
  • Bir demet döndürür:
    • delegecall sonucu için bir boolean (başarıda doğru, başarısızlıkta veya hatada yanlış).
    • Bayt formatındaki veriler.
address.staticcall(bytes memory) returns (bool, bytes memory)

Özellikler

  • Düşük seviyeli STATICCALL , bir argüman olarak iletilen memory (veri yükü) verildiğinde (mevcut sözleşme tarafından görülen tam msg bağlamıyla birlikte) Opcode OxF4‘e bakın.
  • Bir demet döndürür:
    • statik çağrı sonucu için bir boole (başarıda doğru, başarısızlıkta veya hatada yanlış).
    • Bayt formatındaki veriler.
  • Mevcut tüm gazı ilet, ayarlanabilir.

Düşük seviyeli aramalar için ek parametreler

Solidity‘deki sözleşmelerle düşük seviyeli çağrı işlevleri .call(…), .delegatecall(…) ve .staticcall(…) aracılığıyla etkileşim kurarken, bazı özel parametreler ekleme seçeneğiniz vardır.

Bu, aradığınız adrese ne kadar ether göndermek istediğinizi ( value ) ve ne kadar gaz kullanmak istediğinizi belirlemenizi sağlar.

Aşağıdaki kod parçacığı bir örnek sağlar.

address(contractRecipient).call{value: 0, gas: 8000}(_data);

5. address ve address payable arasındaki tür dönüştürme

  • address payable‘dan address‘e örtülü dönüşümlere izin verilir
  • address‘den address payable‘a örtülü dönüşümler mümkün değildir (ödenecek adres hariç).

Not: adresten ödenecek adrese dönüştürmenin tek yolu, uint160’a bir ara dönüştürme kullanmaktır (160 bit = 20 bayt, bir Ethereum adresinin boyutu).

  • Şunlar için address‘den ve address‘e açık dönüştürmeye izin verilir: tamsayılar, tamsayı değişmezleri, bytes20 ve sözleşme türü.
  • address payable(x) biçiminde açık dönüştürme (burada x = tamsayılar, tamsayı değişmezi, bytes veya sözleşme türü).
  • address(x) biçimindeki bir dönüştürmenin sonucu, address payable türüne sahiptir, eğer x tamsayı veya sabit bayt türündeyse, bir değişmez değer veya ödenebilir bir geri dönüş işlevine sahip bir sözleşme.

address olarak sözleşmeler

0.5.0 sürümünden önce, sözleşmeler doğrudan adres türünden türetilirdi (çünkü address ve address payable arasında bir ayrım yoktu).

Solidity‘nin 0.5.0 sürümünden itibaren, sözleşmeler artık adres türünden türetilmemektedir. Ancak, ödenebilir bir geri dönüş işlevi varsa, yine de açıkça address ve address payable‘a dönüştürülebilirler.

Aşağıdaki kodu varsayalım:

contract NotPayable {
     // Burada ödenecek bir işlev yok
}
contract Payable {
     // ödenebilir fonksiyon
     function() payable {
          // ödenebilir işlevi olan bir şey yapmak
          
     }
}
contract HelloWorld {
     address x = address(NotPayable);
     address y = address(Payable);
     function hello_world() public pure returns (string memory) {
          return "hello world";
     }
}

Anlamak için “Hello World” sözleşmemize bakalım:

  • NotPayable, ödenebilir bir geri dönüş işlevi olmayan bir sözleşmedir. Adres (NotPayable) değerine atanan x değişkeni, adres türünde olacaktır.
  • Payable, ödenebilir bir geri dönüş işlevine sahip bir sözleşmedir. address(Payable) değerine atanan y değişkeni, address payable türünde olacaktır.

Not : Dönüştürme hala address(variable) kullanılarak gerçekleştirilir ve address payable(variable) kullanılmaz.

Hem address hem de address payable türü için address harici işlev imzaları kullanılır.

Operatörleri kullanarak address dönüştürme

Aşağıdaki operatörler adreslerle kullanılabilir: <=, <, ==, !=, >= ve > .

6. Bir adres türü döndüren yöntemler

msg.sender()

Function : msg.sender() -> Returns : address payable

Adından da anlaşılacağı gibi, msg.sender işlevi bu sözleşme çağrısını başlatan adresi döndürür. Ancak, aşağıdakilerden bahsetmek önemlidir:

msg.sender geçerli aramayı döndürür. İşlemi gönderen kaynak EOA’yı mutlaka döndürmez.

  • A sözleşmemiz doğrudan bir EOA işlemiyle çağrıldıysa, msg.sender EOA’nın adresini döndürür.
  • A sözleşmemiz, B’nin bir EOA işlemi tarafından çağrıldığı başka bir B sözleşmesi tarafından çağrıldıysa, msg.sender B sözleşmesinin adresini döndürür.

tx.origin (UYARI -> GÜVENLİ DEĞİL !!!!)

Function : tx.origin() -> Returns : address payable

tx.origin, bu işlem için kaynak EOA’nın adresini döndürür. Bu nedenle, tam çağrı zincirini döndürür.

block.coinbase()

Function : block.coinbase() -> Returns : address payable

block.coinbase(_address payable)

Mevcut blok madencisinin adresi. (Mevcut bloğun ücretlerinin ve blok ödülünün alıcısı).

7. Sıfır Adres

Akıllı bir sözleşme derlendikten sonra, özel bir işlem kullanılarak Ethereum ağına dağıtılır. Ancak, bir işlem bir gönderici ve bir alıcı anlamına gelir. Dolayısıyla bu özel işlem belirli bir adrese ulaşmalıdır.

Peki, sözleşme oluşturma söz konusu olduğunda alıcı olarak hangi adres belirtilmelidir?

Ethereum’da bir sözleşmenin kaydedilmesi, hedefi 0x0000000000000000000000000000000000000000 olan ve sıfır adres olarak da bilinen özel bir işlem oluşturmayı içerir.

Ethereum Sanal Makinesi (EVM), bir işlemin alıcı alanında sıfır adres olarak bilinen belirli bir adresi belirttiğinde yeni bir sözleşme oluşturma niyetinde olduğunu anlar.

Sıfır adres biraz “sahte hesap” gibidir. Normal bir Ethereum adresi gibi, sıfır adres de 20 bayt uzunluğundadır ancak yalnızca boş bayt içerir. Bu nedenle, aşağıda gösterildiği gibi yalnızca 0x0 değerleri içerdiğinden, adı sıfır adresidir.

0x0000000000000000000000000000000000000000

Bu nedenle, bu adrese para göndermek aslında herhangi bir ether aktarmaz. Ethereum ağında madenciler, bu alıcıyı içeren bir işlemi yeni bir akıllı sözleşme oluşturma talimatı olarak yorumlar.

8. İleri Konu

addresses ile ilgili sınırlamalar

address aritmetik işlemlere izin vermez.

Toplamı Sağlama Adresi

EIP-55, onaltılık adresin büyük harf kullanımını değiştirerek Ethereum adresleri için geriye dönük uyumlu sağlama toplamı önermek için bir standarttır.

Çeşitli uygulamalar ve API’ler, 0.5.0 sürümünden itibaren eski Mist Ethereum cüzdanında tanıtılan yeni sağlama toplamı etkin adres şemasını uygulamak içindir.

Akıllı sözleşme geliştirme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeirğ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şlayacğaım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

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!

Hasan YILDIZ, Girişimci. Doktora Öğrencisi. Yazmayan YAZILIMCI. Veri Şeysi. Eğitmen...

Yazarın Profili
İlginizi Çekebilir

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