Solidity'de Abstract ve Interface

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.

·

3 min read

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 ve increment() adlı count değişkenini bir arttıran fonksiyona sahip olduğunu görüyoruz.

  • Ardından Counter kontratındaki count değişkeni ve increment() fonksiyonu ile dışarıdan etkileşime geçmek için ICounter adlı bir interface ve içine count() ile increment() 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ı ile incrementCounter() adlı fonksiyon oluşturulmuş ve içerisiden interface vasıtası ile increment() fonksiyonu ile etkileşime geçilmesi sağlanmış.

  • Yine Counter kontratındaki count değişkenine erişmek için getCount() adlı fonksiyon oluşturulmuş ve içerisiden interface vasıtası ile count 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.

Did you find this article valuable?

Support Buildchain by becoming a sponsor. Any amount is appreciated!