Solidity Cheat Sheet
Kontrat yapısı
Her dosya bir lisans ve bir pragma ile başlar; kontrat, dağıtım birimidir.
| Sözdizimi | Anlamı |
|---|---|
// SPDX-License-Identifier: MIT | Derleyicinin 1. satırda beklediği lisans yorumu |
pragma solidity ^0.8.0; | Dosyanın yazıldığı derleyici sürümü |
contract Counter { ... } | Bir kontrat tanımla (durum + fonksiyonlar) |
constructor(uint start) { count = start; } | Dağıtımda bir kez çalışır |
import "./Token.sol"; | Başka bir dosyayı içe aktar |
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; | Bir kütüphane paketini içe aktar |
interface IToken { function balanceOf(address a) external view returns (uint); } | Bir arayüz tanımla (gövdesiz) |
library Math { function min(uint a, uint b) internal pure returns (uint) { ... } } | Yeniden kullanılabilir fonksiyonlardan oluşan bir kütüphane |
Değer türleri
Tam sayıların boyutu sabittir ve ondalık yoktur; 0.8 taşmada geri alır (revert).
| Tür | Ne tutar |
|---|---|
uint256 / uint | İşaretsiz tam sayı, 0 ile 2^256 - 1 arası (uint, uint256 demektir) |
uint8, uint16, ... uint128 | 8 bitlik adımlarla daha küçük işaretsiz tam sayılar |
int256 / int | İşaretli tam sayı (negatif olabilir) |
bool | true veya false |
address | 20 baytlık hesap veya kontrat adresi |
address payable | transfer/send ile Ether alabilen adres |
bytes32, bytes1... | Sabit boyutlu bayt dizileri |
enum Status { Open, Closed } | Adlandırılmış sabitler kümesi, uint8 olarak saklanır |
1 ether, 1 gwei, 1 wei | Ether birimleri: 1 ether = 10^18 wei |
1 days, 2 hours, 30 minutes | Zaman birimleri, saniye cinsinden |
Referans türleri ve veri konumu
Diziler, string'ler, bayt dizileri, struct'lar ve mapping'ler storage, memory veya calldata'da yaşar.
| Sözdizimi | Anlamı |
|---|---|
string memory name | Dinamik UTF-8 string (geçici bir kopya) |
bytes memory data | Dinamik bayt dizisi |
uint[] public scores; | Storage'da dinamik dizi |
uint[3] fixed; | 3 elemanlı sabit boyutlu dizi |
uint[] memory tmp = new uint[](5); | Memory'de bir dizi ayır |
scores.push(42); | Storage dizisinin sonuna ekle |
scores.pop(); | Son elemanı kaldır |
scores.length | Eleman sayısı |
storage | Kalıcı, zincir üzerinde, yazması pahalı |
memory | Geçici, tek bir çağrı boyunca yaşar |
calldata | Salt okunur external fonksiyon girdisi, en ucuzu |
Mapping'ler ve struct'lar
Mapping, uzunluğu ve yinelemesi olmayan bir hash tablosudur; struct alanları gruplar.
| Sözdizimi | Anlamı |
|---|---|
mapping(address => uint) public balances; | Anahtar-değer deposu; her anahtar vardır (varsayılan 0) |
balances[msg.sender] += 1; | Anahtarla oku/yaz |
mapping(address => mapping(address => uint)) allowance; | İç içe mapping |
struct User { string name; uint age; bool active; } | Bir struct tanımla |
User memory u = User("Ada", 36, true); | Memory'de bir struct oluştur |
User memory u = User({name: "Ada", age: 36, active: true}); | Adlandırılmış alanlarla oluşturma |
users[msg.sender] = u; | Bir struct'ı mapping'de sakla |
users[msg.sender].age = 37; | Storage'daki tek bir alanı güncelle |
delete users[msg.sender]; | Varsayılan değerlere sıfırla |
Fonksiyonlar ve görünürlük
Her fonksiyon, kimin çağırabileceğini ve durumu okuyup okumadığını ya da yazıp yazmadığını belirtir.
| Sözdizimi | Anlamı |
|---|---|
function add(uint a, uint b) public pure returns (uint) { return a + b; } | Parametreli ve dönüş değerli bir fonksiyon |
public | Her yerden çağrılabilir (içeriden ve dışarıdan) |
external | Yalnızca kontratın dışından çağrılabilir |
internal | Bu kontrat ve ondan miras alan kontratlar |
private | Yalnızca bu kontrat |
view | Durumu okur, asla yazmaz |
pure | Hiçbir durumu okumaz |
payable | Çağrıyla birlikte Ether alabilir |
returns (uint sum, bool ok) | Birden fazla adlandırılmış dönüş değeri |
(uint s, bool ok) = f(); | Birden fazla dönüş değerini ayrıştır |
uint public count; | Public durum değişkeni otomatik bir count() getter'ı alır |
Modifier'lar, sabitler ve kalıtım
Denetimleri modifier'larla yeniden kullan; değerleri constant ve immutable ile sabitle.
| Sözdizimi | Anlamı |
|---|---|
modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _; } | Bir modifier tanımla (_ = fonksiyon gövdesini çalıştır) |
function withdraw() public onlyOwner { ... } | Bir modifier uygula |
uint public constant MAX = 100; | Derleme zamanı sabiti |
address public immutable owner; | Constructor'da bir kez atanır, sonra sabittir |
contract Token is ERC20, Ownable { ... } | Başka kontratlardan miras al |
function f() public virtual { ... } | Geçersiz kılmaya izin ver |
function f() public override { ... } | Üst kontratın fonksiyonunu geçersiz kıl |
super.f(); | Üst kontratın uygulamasını çağır |
abstract contract Base { function f() public virtual; } | Uygulanmamış fonksiyonları olan kontrat |
Akış kontrolü
C ailesinin alışıldık deyimleri; switch yoktur ve döngüler her yinelemede gas harcar.
| Sözdizimi | Anlamı |
|---|---|
if (x > 5) { ... } else if (x > 2) { ... } else { ... } | Koşullu dallar |
for (uint i = 0; i < n; i++) { ... } | Sayaçlı döngü |
while (x < 10) { x++; } | Koşul sağlandığı sürece döngü |
do { ... } while (cond); | En az bir kez çalışır |
break; / continue; | Döngüden çık / sonraki yinelemeye geç |
x > 0 ? a : b | Üçlü (ternary) ifade |
a / b | Tam sayı bölmesi (kalanı atar) |
a % b | Kalan |
a ** 2 | Üs alma |
unchecked { x++; } | Taşma denetimlerini atla (gas kazandırır, dikkatli kullan) |
Hatalar: require, revert, assert
Başarısız bir denetim tüm işlemi geri alır ve kullanılmayan gas'ı iade eder.
| Sözdizimi | Anlamı |
|---|---|
require(amount > 0, "Amount must be positive"); | Girdiyi veya durumu doğrula; mesajla geri al |
revert("Not allowed"); | Koşulsuz olarak iptal et |
error Insufficient(uint available, uint requested); | Özel bir hata tanımla (string'lerden daha ucuz) |
revert Insufficient(balance, amount); | Özel bir hatayla geri al |
assert(total == a + b); | Asla başarısız olmaması gereken bir değişmezi denetle |
try token.transfer(to, amt) returns (bool ok) { ... } catch { ... } | Başarısız olan bir dış çağrıyı ele al |
Event'ler
Event'ler, zincir dışı uygulamaların abone olabileceği log'lar yazar; kontratlardan okunamazlar.
| Sözdizimi | Anlamı |
|---|---|
event Transfer(address indexed from, address indexed to, uint value); | Bir event tanımla |
emit Transfer(msg.sender, to, amount); | Event'i yayınla |
indexed | Filtrelenebilir parametre (event başına en fazla 3) |
event Log(string message); | Herhangi bir ABI türü log'lanabilir |
Ether, adresler ve global değişkenler
İşlem bağlamı msg, block ve tx'ten gelir.
| Sözdizimi | Anlamı |
|---|---|
msg.sender | Bu fonksiyonu çağıran adres |
msg.value | Çağrıyla gönderilen wei (payable gerektirir) |
block.timestamp | Geçerli blok zamanı (epoch'tan bu yana saniye) |
block.number | Geçerli blok yüksekliği |
tx.origin | İşlemi başlatan dış hesap (EOA); yetkilendirme için kullanma |
address(this).balance | Bu kontratın Ether bakiyesi |
payable(to).transfer(1 ether); | Ether gönder; başarısızlıkta geri alır |
(bool ok, ) = to.call{value: amt}(""); | Düşük seviyeli gönderim; başarı bayrağı döndürür |
receive() external payable {} | Düz bir Ether transferinde çalışır |
fallback() external payable {} | Hiçbir fonksiyon eşleşmediğinde çalışır |
keccak256(abi.encodePacked(a, b)) | Değerlerin hash'ini al |
abi.encode(x), abi.decode(data, (uint)) | ABI verisini kodla / kodunu çöz |
İhtiyaç duyduğun tüm Solidity sözdizimi tek sayfada. Bu Solidity cheat sheet, Ethereum'un ve tüm EVM zincirlerinin akıllı sözleşme dili için hızlı bir referanstır: kontrat tanımlama, tür seçme, verileri mapping ve struct'larda saklama, doğru görünürlük ve değiştirilebilirlikle fonksiyon yazma ve bunları require, modifier ve event'lerle koruma.
Buradaki sözdizimi, aritmetik taşmayı varsayılan olarak denetleyen ve Remix, Hardhat ve Foundry ile çalışan Solidity 0.8'e aittir. İhtiyacın olanı kopyala ya da Solidity playground'unda canlı dene: bir kontrat yaz, derle ve tarayıcında bir EVM üzerinde çalıştır.