Solidity'de Abstract ve Interface
Bu yazımızda, Solidity'de kullanılan önemli yapılardan abstract ve interface yapılarını anlayıp basit birer örnek ile inceleyeceğiz.
Abstract
Abstract kontratlar, tamamlanmamış kontratlardır ve deploy edilemezler. Bu kontratların amacı, diğer kontratlar tarafından kullanılıp düzen ve kolaylık anlamında fayda sağlamaktır. Abstract kontratlar asla doğrudan kullanılamadıklarından her zaman diğer kontratlar tarafından miras alınırlar.
Bir abstract kontrat, içerdiği fonksiyonlar ile ortak bir yapı sağlarken, kullanılacağı kontratta kod için daha az karmaşıklık ve kolaylıklar sağlar.
Basit bir abstract kontrat örneği:
// Abstract kontrat
abstract contract Animal {
function makeSound() public virtual returns (string memory);
}
// Abstract kontratın kullanıldığı kontrat
contract Cat is Animal {
function makeSound() public override returns (string memory) {
return "Meow";
}
}
Yukarıdaki örnekte, Animal
adlı bir abstract kontrat ve içerdiği makeSound()
adlı fonksiyonu görüyoruz.
Ardından Cat
adlı bir kontrat daha yazılmış ve Cat
kontratı, Animal
abstract kontratını miras alarak makeSound()
fonksiyonunu override ederek kullanmış.
Interface
Interface için kısaca başka bir kontratın fonksiyonlarına erişim sağlamamıza yarayan bir yapıdır diyebiliriz. Yapısı abstract kontratlara benzer ama daha kısıtlı halidir. Interface'ler Constructor ve state değişkenleri içermezler. Sadece interface kontratlardan miras alabilir diğer kontratlardan miras alamazlar. Kapsamlı merkeziyetsiz uygulamalarda modüler bir yapı oluşturduğu için verimlilik sağlar.
Bir kullanım örneği olarak farklı bir kontratın fonksiyonlarını kullanmamız gereken bir senaryoda, kontratın tamamını almak yerine bir interface oluşturarak o kontrattaki ihtiyacımız olan fonksiyonları kendi kontratımızdan kullanabiliriz.
Bir interface örneği inceleyelim.
Etkileşim kuracağımız kontrat:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Counter {
uint public count;
function increment() external {
count += 1;
}
}
Kendi kontratımız:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface ICounter {
function count() external view returns (uint);
function increment() external;
}
contract MyContract {
ICounter Counter;
constructor(address _counterAddress) {
Counter = ICounter(_counterAddress);
}
function incrementCounter() external {
Counter.increment();
}
function getCount() external view returns (uint) {
return Counter.count();
}
}
Yukarıdaki örnekte MyContract kontratından interface aracılığı ile Counter kontratındaki increment()
fonksiyonu ve count
değişkeni ile nasıl etkileşime geçildiğini adım adım inceleyelim.
Counter kontratının,
count
adlıuint
bir değişkene veincrement()
adlıcount
değişkenini bir arttıran fonksiyona sahip olduğunu görüyoruz.Ardından Counter kontratındaki
count
değişkeni veincrement()
fonksiyonu ile dışarıdan etkileşime geçmek içinICounter
adlı bir interface ve içinecount()
ileincrement()
adlı iki fonksiyon yazılmış.MyContract kontratında ise öncelikle ICounter interface'i tanımlanmış.
Ardından constructor kullanılarak interface vasıtasıyla etkileşime geçilecek kontratın adresinin deploy anında girilmesi sağlanmış.
Counter kontratındaki
increment()
fonksiyonunu çalıştırmak amacı ileincrementCounter()
adlı fonksiyon oluşturulmuş ve içerisiden interface vasıtası ileincrement()
fonksiyonu ile etkileşime geçilmesi sağlanmış.Yine Counter kontratındaki
count
değişkenine erişmek içingetCount()
adlı fonksiyon oluşturulmuş ve içerisiden interface vasıtası ilecount
değişkenine erişilmesi sağlanmış.
Sonuç
Abstract ve interface, Solidity’de kontratlar arasındaki etkileşimi kolaylaştıran ve birbirleri ile uyum içinde olmasını sağlayan önemli yapılardır.
Abstract kontratlar, bir kontratın belirli işlevlerinin uygulanmasını zorunlu kılarak bir uyum sağlarken interface ise bir kontratın sahip olması gereken işlevleri tanımlayarak kontratların birbiri ile etkileşim kurmasını kolaylaştırır.
Abstract ve interface yapılarını kullanarak solidity’de kontratlar arası etkileşimi kolaylaştırıp ayrıca daha tutarlı ve esnek kontratlar tasarlayabiliriz.