Solidity Notlarım: View ve Pure Kullanım Yerleri ve Farkları
Bu iki fonksiyon türünü kontrat üzerinde herhangi bir durum değişiklik yapmadığımız durumlarda kullanıyoruz. Peki hangi durumlarda kontrat üzerinde durum değişikliği yapıyoruz?
Solidity’nin kendi dokümantasyonu incelediğimizde aşağıdaki 8 ifadenin durum değişikliği olarak kabul edildiğini söylemiş:
- Durum değişkenlerini yazmak
- Event’leri çalıştırmak
- Diğer kontratları yaratmak
Selfdestruct
‘ı kullanmak- Çağrı yoluyla ether göndermek
- View ya da pure ile işaretlenmemiş bir fonksiyonu çağırmak
- Düşük seviyeli çağrıları kullanma
- Belirli işlem kodlarını içeren satır içi derleme yapmak
Bu 8 madde bize durum değişikliği yaptımız işlemleri gösteriyor. Bunların dışındaki durumlarda herhangi bir değişiklik yapmıyor isek bu demek oluyor ki biz kontrat üzerinde ya kontratla ilgili bir işlem yapmıyoruz ya da sadece kontrat üzerindeki durumları okuyoruz. İşte okuma işlemleri yaptığımız durumlarda view, geriye kalan durumlarda ise pure fonksiyonlarını kullanıyoruz. Birlikte kontrat üzerinden okuma yaptığımız bir fonksiyonu inceleyelim:
contract Example{
uint public x = 3;function addToX(uint y) public view returns(uint){
return x + y;
}
}
Basit bir şekilde fonksiyonumuz kontrat üzerindeki x değişkeninin değerini okuyup bunu verdiğimiz y değişkeni ile toplayarak bize geri döndürüyor. Burada addToX fonksiyonu ile x’in değerini değiştiremiyoruz. Sadece onun şuanki değerini okuyabiliyoruz. Bu tür fonksiyonlarda view fonksiyonunu kullanıyoruz.
contract Example{
function add(uint a, uint b) public view returns (uint) {
return a * (b + 42) + block.timestamp;
}
}
Bu fonksiyonumuza baktığımızda ise blokzincir üzerinden zaman damgasının okunduğunu görüyoruz.
Peki Pure’un View’den farkı nedir? Bazı fonksiyonlar hem kontrat üzerinde durum değişikliği yapıyorken hem de kontrat üzerinden hiçbir durum bilgisini okumaya ihtiyaç duymuyorlar. Peki hangi durumlar okuma olarak kabul ediliyor?
Solidity’nin kendi dokümantasyona göre aşağıdaki 5 durum okuma olarak kabul edilir:
- Durum değişkenlerini okumak
address(this).balance
ya da<address>.balance
değerlerine ulaşmakblock
,tx
,msg
üyelerinden herhangi birine erişim (msg.sig
andmsg.data
hariç).Pure
ile işaretlenmemiş bir fonksiyonu çağırmak- Belirli işlem kodlarını içeren satır içi derleme yapmak
Başlangıçtaki 8 madde durum değişikliklerini listelerken buradaki 5 madde de okuma işlemlerini listeliyor. İşte bu 13 maddenin de dışındaki durumlarda biz Pure fonksiyonunu kullanıyoruz. Hemen örnek bir fonksiyon ile bunu inceleyelim:
contract Example{
function add(uint a, uint b) public pure returns (uint) {
return a * (b + 42);
}
}
Fonksiyonun geri döndürdüğü değeri incelediğimizde toplanan a ve değişkenlerini zaten fonksiyonu kullanırken biz tanımlıyoruz. Bu fonksiyonun bize döndüreceği değeri hesaplaması için kontrat üzerinden herhangi bir değişkeni okuması gerekmiyor. Böyle durumlarda Pure fonskiyonunu kullanıyoruz.
Yazılım dillerinin vazgeçilmezi olan “Hello World!” yazısını yazmak için gerekli olan fonksiyonu inceleyelim:
contract Example{
function hello() pure public returns(string memory) {
return 'Hello World!';
}
Bu fonksiyonda da kontrat üzerinden herhangi bir değer okumamız gerekmiyor. Fonksiyonu çağırdığımızda bize sadece “Hello World!” yazısını döndürüyor. Bu durumda hemen Pure fonksiyonunu kullanıyoruz.
Hali hazırda Remix IDE gibi derleyiciler kontratları derlerken bize yaptığımız modifier hatalarında bizi uyardığı için bu konuda yapılan yanlışlıklar bir sorun teşkil etmiyor.