Solidity, geliştiricilere çeşitli değişken türleri ve kapsam seviyeleri sunarak akıllı sözleşmelerin davranışını etkili bir şekilde kontrol etmelerini sağlar. Solidity Dersleri’nin bu bölümünde state, local ve global değişkenlerin neler olduğunu, aralarındaki farkları ve Solidity’de sabitlerin (“constant” ve “immutable”) nasıl kullanıldığını inceleyeceğiz.
State, Local ve Global Değişkenler
State (Durum) Değişkenleri
State değişkenleri, bir akıllı sözleşmenin depolama alanında (“storage”) saklanan ve sözleşme yaşam döngüsü boyunca kalıcı olan verilerdir. Bu değişkenler blockchain’e yazılır ve üzerlerinde yapılan her değişiklik kalıcıdır.
Özellikler:
- Blockchain’de saklanır.
- Gas maliyeti yaratır.
- Sözleşme düzeyinde tanımlanır ve tüm fonksiyonlar tarafından erişilebilir.
pragma solidity ^0.8.0;
contract StateVariableExample {
uint public count; // State değişkeni
function increment() public {
count += 1; // State değişkenini güncelleme
}
}
count adındaki state değişkeni sözleşmenin depolama alanında tutulur ve increment fonksiyonu bu değişkeni her çağrıldığında 1 artırır.
Local (Yerel) Değişkenler
Local değişkenler, bir fonksiyon içerisinde tanımlanan ve sadece o fonksiyon çalışırken var olan değişkenlerdir. Depolama alanında yer kaplamaz, bu nedenle blockchain’e yazılmazlar.
Özellikler:
- Sadece tanımlandıkları fonksiyonun kapsamında kullanılabilir.
- Blockchain’de depolanmadıkları için gas maliyeti yoktur.
pragma solidity ^0.8.0;
contract LocalVariableExample {
function add(uint a, uint b) public pure returns (uint) {
uint sum = a + b; // Local değişken
return sum;
}
}
sum adındaki değişken sadece add fonksiyonu içerisinde tanımlanmıştır ve bu fonksiyon dışında kullanılamaz.
Global Değişkenler
Global değişkenler Solidity tarafından sağlanan ve blockchain hakkında bilgiler sunan önceden tanımlanmış değişkenlerdir. Örneğin, bir işlemdeki gönderen adresini veya bloğun zaman damgasını alabilirsiniz.
Örnek Global Değişkenler:
- msg.sender: Fonksiyonu çağıran kişin adresi.
- block.timestamp: Bloğun oluşturulma zamanı.
- block.number: Mevcut bloğun numarası.
pragma solidity ^0.8.0;
contract GlobalVariableExample {
function getBlockInfo() public view returns (address, uint) {
return (msg.sender, block.timestamp); // Global değişkenler kullanılıyor
}
}
Bu örnekte, fonksiyonu çağıran adres ve işlemin yapıldığı zaman damgası döndürülür.
Sabitler (Constants ve Immutable)
Solidity’de sabitler, değerleri bir kez belirlendikten sonra değişmeyen değişkenlerdir. Bu, hem gas tasarrufu sağlar hem de kodun okunabilirliğini artırır. Sabitler iki ana kategoriye ayrılır:
constant
constant, tanımlandığı anda bir değer atanması gereken ve asla değişmeyen değişkenlerdir. Compiler bu değişkenleri kodun bir parçası olarak optimize eder.
pragma solidity ^0.8.0;
contract ConstantExample {
uint public constant MY_CONSTANT = 100; // Sabit bir değişken
function getConstant() public pure returns (uint) {
return MY_CONSTANT;
}
}
MY_CONSTANT sabit değişken sözleşme deploy edildiğinde blockchain’e yazılır ve değiştirilemez.
immutable
immutable, değeri constructor (önyükleyici) içerisinde bir kez atanabilen ancak daha sonrasında değiştirilemeyen değişkenlerdir. immutable, runtime bilgilerine dayanarak sabitler tanımlamak için kullanılır.
pragma solidity ^0.8.0;
contract ImmutableExample {
address public immutable OWNER;
constructor() {
OWNER = msg.sender; // Değer constructor'da atanıyor
}
function isOwner() public view returns (bool) {
return msg.sender == OWNER;
}
}
OWNER değişkeni sadece kontrat deploy edildiği anda bir kez atanabilir ve daha sonra değiştirilemez.