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 Twitter, Linkedin ve YouTube‘da takip edin.
Kısa bir yorum bırakmayı UNUTMAYIN!