Türkçe

Ethereum blok zincirinde akıllı sözleşmeler geliştirmek için önde gelen programlama dili olan Solidity'yi keşfedin. Bu kapsamlı kılavuz, temel kavramlardan ileri tekniklere kadar her şeyi kapsar.

Solidity: Akıllı Sözleşme Programlamaya Kapsamlı Bir Bakış

Solidity, başta Ethereum olmak üzere çeşitli blok zinciri platformlarında akıllı sözleşmeler uygulamak için kullanılan, üst düzey, sözleşme odaklı bir programlama dilidir. Ethereum Sanal Makinesi'ni (EVM) hedeflemek üzere tasarlanmış olup, C++, Python ve JavaScript'ten büyük ölçüde etkilenmiştir. Bu kılavuz, hem yeni başlayanlar hem de blok zinciri geliştirme dünyasına dalmak isteyen deneyimli programcılar için uygun, Solidity'ye ayrıntılı bir genel bakış sunmaktadır.

Akıllı Sözleşmeler Nedir?

Solidity'ye dalmadan önce, akıllı sözleşmelerin ne olduğunu anlamak çok önemlidir. Akıllı sözleşme, anlaşmanın şartlarının doğrudan koda yazıldığı, kendi kendini yürüten bir sözleşmedir. Bir blok zincirinde saklanır ve önceden belirlenmiş koşullar karşılandığında otomatik olarak yürütülür. Akıllı sözleşmeler, aşağıdakiler de dahil olmak üzere çeşitli uygulamalarda otomasyonu, şeffaflığı ve güvenliği sağlar:

Neden Solidity?

Solidity, çeşitli faktörler nedeniyle Ethereum ve diğer EVM uyumlu blok zincirlerinde akıllı sözleşmeler yazmak için baskın dildir:

Geliştirme Ortamınızı Kurma

Solidity ile geliştirmeye başlamak için uygun bir geliştirme ortamı kurmanız gerekecektir. İşte bazı popüler seçenekler:

Remix IDE

Remix, Solidity'yi öğrenmek ve denemek için mükemmel olan çevrimiçi, tarayıcı tabanlı bir IDE'dir. Yerel kurulum gerektirmez ve aşağıdaki gibi özellikler sunar:

https://remix.ethereum.org/ adresinden Remix IDE'ye erişin

Truffle Suite

Truffle, akıllı sözleşmeleri oluşturma, test etme ve dağıtma sürecini basitleştiren kapsamlı bir geliştirme çerçevesidir. Aşağıdaki gibi araçlar sağlar:

Truffle'ı kurmak için:

npm install -g truffle

Hardhat

Hardhat, esnekliği ve genişletilebilirliği ile bilinen bir diğer popüler Ethereum geliştirme ortamıdır. Solidity kodunuzu derlemenize, dağıtmanıza, test etmenize ve hatalarını ayıklamanıza olanak tanır. Temel özellikler şunlardır:

Hardhat'ı kurmak için:

npm install --save-dev hardhat

Solidity Temelleri: Sözdizimi ve Veri Tipleri

Solidity'deki temel sözdizimini ve veri türlerini keşfedelim.

Solidity Sözleşmesinin Yapısı

Bir Solidity sözleşmesi, nesne yönelimli programlamadaki bir sınıfa benzer. Durum değişkenleri, fonksiyonlar ve olaylardan oluşur. İşte basit bir örnek:

pragma solidity ^0.8.0;

contract SimpleStorage {
 uint256 storedData;

 function set(uint256 x) public {
 storedData = x;
 }

 function get() public view returns (uint256) {
 return storedData;
 }
}

Açıklama:

Veri Tipleri

Solidity çeşitli veri tiplerini destekler:

Örnek:

pragma solidity ^0.8.0;

contract DataTypes {
 uint256 public age = 30;
 bool public isAdult = true;
 address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
 bytes32 public name = "JohnDoe";
 uint[] public numbers = [1, 2, 3, 4, 5];
 mapping(address => uint) public balances;

 constructor() {
 balances[msg.sender] = 100;
 }
}

Durum Değişkenleri - Yerel Değişkenler

Durum değişkenleri fonksiyonların dışında bildirilir ve blok zincirinde saklanır. Fonksiyon çağrıları ve sözleşme yürütmeleri arasında kalıcıdırlar. Yukarıdaki örnekte, storedData bir durum değişkenidir.

Yerel değişkenler fonksiyonların içinde bildirilir ve yalnızca o fonksiyonun kapsamı içinde var olur. Blok zincirinde saklanmazlar ve fonksiyon tamamlandığında atılırlar.

Solidity'de Fonksiyonlar

Fonksiyonlar, akıllı sözleşmelerin yapı taşlarıdır. Sözleşmenin gerçekleştirebileceği mantığı ve işlemleri tanımlarlar. Fonksiyonlar şunları yapabilir:

Fonksiyon Görünürlüğü

Solidity fonksiyonlarının dört görünürlük değiştiricisi vardır:

Fonksiyon Değiştiricileri

Fonksiyon değiştiricileri, bir fonksiyonun davranışını değiştirmek için kullanılır. Genellikle güvenlik kısıtlamalarını uygulamak veya fonksiyonun mantığını yürütmeden önce kontroller yapmak için kullanılırlar.

Örnek:

pragma solidity ^0.8.0;

contract Ownership {
 address public owner;

 constructor() {
 owner = msg.sender;
 }

 modifier onlyOwner() {
 require(msg.sender == owner, "Only owner can call this function");
 _;
 }

 function transferOwnership(address newOwner) public onlyOwner {
 owner = newOwner;
 }
}

Bu örnekte, onlyOwner değiştiricisi, çağıranın sözleşmenin sahibi olup olmadığını kontrol eder. Değilse, işlemi geri alır. _ yer tutucusu, fonksiyonun kodunun geri kalanını temsil eder.

Fonksiyon Durum Değişkenliği

Solidity fonksiyonları ayrıca durum değişkenliği değiştiricilerine sahip olabilir:

Örnek:

pragma solidity ^0.8.0;

contract Example {
 uint256 public value;

 function getValue() public view returns (uint256) {
 return value;
 }

 function add(uint256 x) public pure returns (uint256) {
 return x + 5;
 }

 function deposit() public payable {
 value += msg.value;
 }
}

Kontrol Yapıları

Solidity, if, else, for, while ve do-while döngüleri gibi standart kontrol yapılarını destekler.

Örnek:

pragma solidity ^0.8.0;

contract ControlStructures {
 function checkValue(uint256 x) public pure returns (string memory) {
 if (x > 10) {
 return "Value is greater than 10";
 } else if (x < 10) {
 return "Value is less than 10";
 } else {
 return "Value is equal to 10";
 }
 }

 function sumArray(uint[] memory arr) public pure returns (uint256) {
 uint256 sum = 0;
 for (uint256 i = 0; i < arr.length; i++) {
 sum += arr[i];
 }
 return sum;
 }
}

Olaylar ve Günlüğe Kaydetme

Olaylar, akıllı sözleşmelerin dış dünya ile iletişim kurmasını sağlar. Bir olay yayıldığında, blok zincirinin işlem günlüklerinde saklanır. Bu günlükler, sözleşmenin etkinliğini izlemek için harici uygulamalar tarafından izlenebilir.

Örnek:

pragma solidity ^0.8.0;

contract EventExample {
 event ValueChanged(address indexed caller, uint256 newValue);

 uint256 public value;

 function setValue(uint256 newValue) public {
 value = newValue;
 emit ValueChanged(msg.sender, newValue);
 }
}

Bu örnekte, setValue fonksiyonu her çağrıldığında ValueChanged olayı yayılır. caller parametresindeki indexed anahtar kelimesi, harici uygulamaların olayları çağıranın adresine göre filtrelemesine olanak tanır.

Kalıtım

Solidity, mevcut sözleşmelere dayalı olarak yeni sözleşmeler oluşturmanıza olanak tanıyan kalıtımı destekler. Bu, kodun yeniden kullanımını ve modülerliği teşvik eder.

Örnek:

pragma solidity ^0.8.0;

contract BaseContract {
 uint256 public value;

 function setValue(uint256 newValue) public {
 value = newValue;
 }
}

contract DerivedContract is BaseContract {
 function incrementValue() public {
 value++;
 }
}

Bu örnekte, DerivedContract, BaseContract'tan kalıtım alır. value durum değişkenini ve setValue fonksiyonunu devralır. Ayrıca kendi fonksiyonu olan incrementValue'yu da tanımlar.

Kütüphaneler

Kütüphaneler sözleşmelere benzer, ancak veri depolayamazlar. Birden çok sözleşme tarafından çağrılabilen yeniden kullanılabilir kodu dağıtmak için kullanılırlar. Kütüphaneler yalnızca bir kez dağıtılır, bu da gas maliyetlerini azaltır.

Örnek:

pragma solidity ^0.8.0;

library Math {
 function add(uint256 a, uint256 b) internal pure returns (uint256) {
 return a + b;
 }
}

contract Example {
 using Math for uint256;
 uint256 public result;

 function calculateSum(uint256 x, uint256 y) public {
 result = x.add(y);
 }
}

Bu örnekte, Math kütüphanesi bir add fonksiyonu tanımlar. using Math for uint256; ifadesi, nokta gösterimini kullanarak uint256 değişkenlerinde add fonksiyonunu çağırmanıza olanak tanır.

Yaygın Akıllı Sözleşme Güvenlik Açıkları

Akıllı sözleşmeler, fon kaybına veya beklenmeyen davranışlara yol açabilecek çeşitli güvenlik açıklarına karşı hassastır. Bu güvenlik açıklarının farkında olmak ve bunları azaltmak için adımlar atmak çok önemlidir.

Yeniden Giriş

Yeniden giriş, bir sözleşme harici bir sözleşmeyi çağırdığında ve harici sözleşme, orijinal sözleşmenin yürütülmesi tamamlanmadan orijinal sözleşmeye geri döndüğünde meydana gelir. Bu, beklenmeyen durum değişikliklerine yol açabilir.

Azaltma: Kontroller-Etkiler-Etkileşimler modelini kullanın ve harici çağrı için kullanılabilir gası sınırlamak için transfer veya send fonksiyonlarını kullanmayı düşünün.

Taşma ve Alt Akış

Taşma, bir aritmetik işlem bir veri türünün maksimum değerini aştığında meydana gelir. Alt akış, bir aritmetik işlem bir veri türünün minimum değerinden daha düşük bir değerle sonuçlandığında meydana gelir.

Azaltma: Bu sorunları önlemek için SafeMath kütüphanelerini kullanın (ancak Solidity 0.8.0 ve sonraki sürümlerle, taşma ve alt akış kontrolleri varsayılan olarak yerleşiktir).

Zaman Damgası Bağımlılığı

Blok zaman damgasına (block.timestamp) güvenmek, madencilerin zaman damgası üzerinde bir miktar kontrol sahibi olmaları nedeniyle sözleşmenizi manipülasyona karşı savunmasız hale getirebilir.

Azaltma: Kritik mantık için block.timestamp kullanmaktan kaçının. Zamanın daha güvenilir kaynakları olan oracle'ları veya diğer kaynakları kullanmayı düşünün.

Hizmet Reddi (DoS)

DoS saldırıları, bir sözleşmeyi meşru kullanıcılar tarafından kullanılamaz hale getirmeyi amaçlar. Bu, mevcut tüm gası tüketerek veya sözleşmenin geri dönmesine neden olan güvenlik açıklarından yararlanarak elde edilebilir.

Azaltma: Gas sınırları uygulayın, sınırsız yinelemeli döngülerden kaçının ve kullanıcı girişlerini dikkatlice doğrulayın.

Ön Çalıştırma

Ön çalıştırma, birinin bekleyen bir işlemi gözlemlediğinde ve orijinal işlemden önce yürütülmesini sağlamak için daha yüksek bir gas fiyatına sahip kendi işlemini gönderdiğinde meydana gelir.

Azaltma: İşlem ayrıntılarını yürütüldükten sonrasına kadar gizlemek için taahhüt-açıklama şemalarını veya diğer teknikleri kullanın.

Güvenli Akıllı Sözleşmeler Yazmak İçin En İyi Uygulamalar

Gelişmiş Solidity Kavramları

Temel bilgileri sağlam bir şekilde anladıktan sonra, daha gelişmiş kavramları keşfedebilirsiniz:

Assembly

Solidity, EVM üzerinde daha fazla kontrol sahibi olmanızı sağlayan satır içi assembly kodu yazmanıza olanak tanır. Ancak, hataları ve güvenlik açıklarını ortaya çıkarma riskini de artırır.

Proxy'ler

Proxy'ler, verileri geçirmeden akıllı sözleşmelerinizi yükseltmenize olanak tanır. Bu, çağrıları bir uygulama sözleşmesine ileten bir proxy sözleşmesi dağıtmayı içerir. Sözleşmeyi yükseltmek istediğinizde, yeni bir uygulama sözleşmesi dağıtırsınız ve proxy'yi yeni uygulamaya işaret edecek şekilde güncellersiniz.

Meta-İşlemler

Meta-işlemler, kullanıcıların doğrudan gas ücreti ödemeden akıllı sözleşmenizle etkileşim kurmasını sağlar. Bunun yerine, bir aktarıcı onlar adına gas ücretlerini öder. Bu, özellikle blok zincirinde yeni olan kullanıcılar için kullanıcı deneyimini iyileştirebilir.

EIP-721 ve EIP-1155 (NFT'ler)

Solidity, genellikle EIP-721 ve EIP-1155 gibi standartları kullanarak Değiştirilemez Token'lar (NFT'ler) oluşturmak için kullanılır. NFT tabanlı uygulamalar oluşturmak için bu standartları anlamak çok önemlidir.

Solidity ve Blok Zincirinin Geleceği

Solidity, hızla gelişen blok zinciri teknolojisi ortamında kritik bir rol oynamaktadır. Blok zinciri benimsenmesi büyümeye devam ettikçe, yenilikçi ve güvenli merkeziyetsiz uygulamalar oluşturmak için Solidity geliştiricilerine yüksek talep olacaktır. Dil sürekli olarak güncelleniyor ve geliştiriliyor, bu nedenle bu alanda başarı için en son gelişmelerden haberdar olmak önemlidir.

Sonuç

Solidity, Ethereum blok zincirinde akıllı sözleşmeler oluşturmak için güçlü ve çok yönlü bir dildir. Bu kılavuz, temel kavramlardan ileri tekniklere kadar Solidity'ye kapsamlı bir genel bakış sağlamıştır. Solidity'ye hakim olarak ve güvenli geliştirme için en iyi uygulamaları izleyerek, merkeziyetsiz uygulamaların heyecan verici dünyasına katkıda bulunabilir ve blok zinciri teknolojisinin geleceğini şekillendirmeye yardımcı olabilirsiniz. Güvenliğe her zaman öncelik vermeyi, kodunuzu iyice test etmeyi ve Solidity ekosistemindeki en son gelişmeler hakkında bilgi sahibi olmayı unutmayın. Akıllı sözleşmelerin potansiyeli çok büyük ve Solidity ile yenilikçi fikirlerinizi hayata geçirebilirsiniz.