1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 036 : Create2

🧵 #100GündeSolidity 036 : Create2
Create2
0

Create2 : Akıllı Sözleşmelerin Diğer Sözleşmeler Tarafından Oluşturulması ve Create2 Özelliği

Solidity, Ethereum blok zincirinde akıllı sözleşmeler oluşturmak için kullanılan en popüler programlama dillerinden biridir. Solidity ile, işlevselliklerini genişletmek için bir sözleşme başka bir sözleşme oluşturabilir. Bu işlem, “Contract that Creates other Contracts” olarak adlandırılır. Bu, Solidity programlamasının en ilginç ve güçlü yönlerinden biridir ve Ethereum ekosistemi için birçok fayda sağlar. Bu bültenimizde, Solidity ile Contract’ların nasıl oluşturulabileceği hakkında detaylı bir şekilde konuşacağız. Ayrıca, Solidity 0.8.0 sürümü ile sunulan create2 özelliği ile salt kullanarak yeni contract’lar oluşturma işlemi hakkında da bilgi vereceğiz.

Contract’ların Diğer Contract’lardan Oluşturulması

Solidity’de bir sözleşme, başka bir sözleşme tarafından oluşturulabilir. Bu, bir sözleşmenin işlevselliğini genişletmek için kullanışlı bir tekniktir. Yeni bir sözleşme oluşturmak için Solidity’de new anahtar kelimesi kullanılır. Bu anahtar kelime, yeni bir sözleşmenin oluşturulduğunu gösterir. Örneğin, aşağıdaki Solidity kodunda, “ChildContract” adında bir sözleşme oluşturuluyor.

pragma solidity ^0.8.0;

contract ParentContract {
    function createChildContract() public {
        ChildContract child = new ChildContract();
    }
}

contract ChildContract {
    // ...
}

Bu kodda, ParentContract adında bir sözleşme oluşturuluyor ve createChildContract adında bir fonksiyon içeriyor. Bu fonksiyon, new anahtar kelimesi kullanarak ChildContract adında yeni bir sözleşme oluşturuyor.

Böylece, ParentContract sözleşmesi, ChildContract sözleşmesini oluşturabilir ve ChildContract sözleşmesinin tüm işlevlerine erişebilir. Bu, Solidity’de sözleşmelerin modülerliğini artırır ve kodun yeniden kullanılabilirliğini artırır.

Yeni Contract’lar Oluşturma

Solidity’de, bir sözleşme, new anahtar kelimesi kullanılarak başka bir sözleşme tarafından oluşturulabilir. new anahtar kelimesi, sözleşmenin adını ve ardından parantez içinde argümanları alır. Örneğin, aşağıdaki Solidity kodu, ChildContract adında bir sözleşme oluşturur ve arg1 ve arg2 adında iki argüman alır.

ChildContract child = new ChildContract(arg1, arg2);

Bu kod, ChildContract sözleşmesini oluşturur ve arg1 ve arg2 değerlerini değişkenlere atar. Daha sonra, child adlı bir değişkene atar ve child değişkeni üzerinden ChildContract sözleşmesinin işlevlerine erişebilirsiniz.

Öte yandan, Solidity 0.8.0 sürümü ile birlikte new anahtar kelimesi, create2 özelliğini de desteklemektedir. Bu özellik, belirli bir “salt” (tuz) değeri kullanarak sözleşmelerin oluşturulmasına olanak tanır. Bu, bir sözleşmenin tekrarlanabilir olmasını sağlar ve işlem maliyetlerini azaltır. create2 özelliği, aşağıdaki gibi kullanılabilir.

bytes32 salt = 0x123456;
ChildContract child = new ChildContract{salt: salt}(arg1, arg2);

Burada, salt adında bir değişken tanımlanır ve ChildContract sözleşmesi, salt değeri kullanılarak oluşturulur. Bu, sözleşmenin tekrarlanabilir olmasını ve işlem maliyetlerinin azalmasını sağlar.

Yeni sözleşmeler oluşturma, Solidity’de sözleşmelerin modülerliğini artırır ve kodun yeniden kullanılabilirliğini sağlar. Ayrıca, create2 özelliği ile birlikte, sözleşme oluşturma işlemleri daha verimli hale getirilir.

Salt Kullanarak Create2 İşlemi Gerçekleştirme

Solidity 0.8.0 sürümü ile birlikte, new anahtar kelimesi, create2 özelliğini de desteklemektedir. create2, belirli bir “salt” (tuz) değeri kullanarak sözleşmelerin oluşturulmasına olanak tanır. Bu, sözleşmenin tekrarlanabilir olmasını sağlar ve işlem maliyetlerini azaltır.

create2 özelliği, aşağıdaki gibi kullanılabilir.

bytes32 salt = 0x123456;
ChildContract child = new ChildContract{salt: salt}(arg1, arg2);

Burada, salt adında bir değişken tanımlanır ve ChildContract sözleşmesi, salt değeri kullanılarak oluşturulur. Bu, sözleşmenin tekrarlanabilir olmasını ve işlem maliyetlerinin azalmasını sağlar.

create2 özelliği ayrıca, birden fazla sözleşmenin farklı salt değerleri kullanarak aynı sözleşmeyi oluşturmasına olanak tanır. Bu, aynı sözleşmenin birden çok kez oluşturulması gerektiği durumlarda faydalı olabilir. Örneğin, aşağıdaki Solidity kodu, farklı salt değerleri kullanarak birden çok sözleşme oluşturur.

pragma solidity ^0.8.0;

contract ChildContract {
    uint public value;
    
    constructor(uint _value) {
        value = _value;
    }
}

contract ParentContract {
    function createChildContract(bytes32 salt, uint _value) public {
        bytes32 hash = keccak256(abi.encodePacked(msg.sender, salt));
        ChildContract child = new ChildContract{salt: hash}(_value);
    }
}

Bu kod, ParentContract adında bir sözleşme oluşturur ve createChildContract adında bir fonksiyon içerir. Bu fonksiyon, salt ve _value olmak üzere iki parametre alır. createChildContract fonksiyonu, ChildContract sözleşmesini oluştururken salt değeri olarak keccak256(abi.encodePacked(msg.sender, salt)) değerini kullanır. Bu, aynı msg.sender ve salt değeri kullanarak farklı bir hash değeri oluşturur. Bu nedenle, farklı salt değerleri kullanarak birden çok ChildContract sözleşmesi oluşturulabilir.

Örnek Solidity Kodu İncelemesi

Aşağıdaki Solidity kodu, bir sözleşmeden diğer sözleşmeleri oluşturmanın nasıl yapılabileceğini göstermektedir.

pragma solidity ^0.8.0;

contract ChildContract {
    uint public value;

    constructor(uint _value) {
        value = _value;
    }
}

contract ParentContract {
    address[] public children;

    function createChild(uint _value) public {
        ChildContract child = new ChildContract(_value);
        children.push(address(child));
    }
}

Bu kodda, ParentContract adında bir sözleşme oluşturulur ve createChild adında bir fonksiyon içerir. createChild fonksiyonu, _value olmak üzere bir parametre alır. Bu fonksiyon, ChildContract sözleşmesini oluşturur ve oluşturulan sözleşmenin adresini children dizisine ekler.

Bu sözleşme, ChildContract sözleşmelerinin dinamik olarak oluşturulmasına izin verir ve bu sözleşmelerin adreslerini children dizisinde saklar. Bu yöntem, dinamik olarak oluşturulan sözleşmelerin izlenmesine ve yönetimine olanak tanır.

Akıllı Sözleşme Örneği Yorumlama

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Car {
    address public owner;
    string public model;
    address public carAddr;

    constructor(address _owner, string memory _model) payable {
        owner = _owner;
        model = _model;
        carAddr = address(this);
    }
}

contract CarFactory {
    Car[] public cars;

    function create(address _owner, string memory _model) public {
        Car car = new Car(_owner, _model);
        cars.push(car);
    }

    function createAndSendEther(address _owner, string memory _model) public payable {
        Car car = (new Car){value: msg.value}(_owner, _model);
        cars.push(car);
    }

    function create2(address _owner, string memory _model, bytes32 _salt) public {
        Car car = (new Car){salt: _salt}(_owner, _model);
        cars.push(car);
    }

    function create2AndSendEther(
        address _owner,
        string memory _model,
        bytes32 _salt
    ) public payable {
        Car car = (new Car){value: msg.value, salt: _salt}(_owner, _model);
        cars.push(car);
    }

    function getCar(
        uint _index
    )
        public
        view
        returns (address owner, string memory model, address carAddr, uint balance)
    {
        Car car = cars[_index];

        return (car.owner(), car.model(), car.carAddr(), address(car).balance);
    }
}

Bu örnek akıllı sözleşme, Car adında bir sözleşme ve CarFactory adında bir ana sözleşme içerir. Car sözleşmesi, bir araç sahibinin adresini, aracın modelini ve aracın adresini saklar. CarFactory sözleşmesi, Car sözleşmelerinin oluşturulmasını yönetir.

CarFactory sözleşmesinin create fonksiyonu, _owner ve _model olmak üzere iki parametre alır ve bir Car sözleşmesi oluşturur. Oluşturulan sözleşme, cars dizisine eklenir.

CarFactory sözleşmesinin createAndSendEther fonksiyonu, _owner ve _model olmak üzere iki parametre alır ve ayrıca sözleşmeye ether gönderir. Fonksiyon, sözleşme oluşturma işlemi sırasında ether gönderir.

CarFactory sözleşmesinin create2 fonksiyonu, _owner, _model ve _salt olmak üzere üç parametre alır ve Car sözleşmesini oluşturur. Bu yöntem, create2 özelliği ile birlikte çalışır ve sözleşmenin bir önceki oluşturulma durumunu dikkate alır.

CarFactory sözleşmesinin create2AndSendEther fonksiyonu, _owner, _model ve _salt olmak üzere üç parametre alır ve ayrıca sözleşmeye ether gönderir. Bu fonksiyon, create2 özelliği ile birlikte çalışır ve sözleşmenin bir önceki oluşturulma durumunu dikkate alır.

Son olarak, CarFactory sözleşmesinin getCar fonksiyonu, _index olmak üzere bir parametre alır ve sözleşmede saklanan Car sözleşmelerinin özelliklerini döndürür. Bu fonksiyon, sözleşmelerin yönetimini kolaylaştırır ve izleme işlemlerini sağlar.

SONUÇ BAĞLAMI

Bu e-bültenimizde, Solidity programlama dilinde bir sözleşmenin nasıl diğer sözleşmeler tarafından oluşturulabileceğini inceledik. Yeni bir sözleşme oluşturmak için new anahtar kelimesi kullanılabildiğini, ayrıca Solidity 0.8.0’dan itibaren create2 özelliği ile birlikte salt özelliğinin kullanılabileceğini gördük.

Örnek Solidity koduyla, CarFactory adında bir ana sözleşmenin, Car adında başka sözleşmeler oluşturmak için nasıl kullanılabileceğini de inceledik. CarFactory sözleşmesi, araç sahiplerinin adreslerini, araç modellerini ve sözleşme adreslerini saklayarak araç yönetimini kolaylaştırdı.

Solidity programlama dili hakkında daha fazla bilgi edinmek isterseniz, Solidity belgelerine ve OpenZeppelin gibi popüler Solidity kütüphanelerine göz atabilirsiniz.

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

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

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!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

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