---
# System prepended metadata

title: Bölüm 2 - SMART CONTRACT - Ethereum

---

# Bölüm 2 - SMART CONTRACT - Ethereum

Ethereum'da ki hesaplar hakkında genel bilginiz yoksa veya neler olup bittiğini öğrenmek istiyorsanız, bir önceki yazıya bakın. [Bölüm 1](https://hackmd.io/@yigitraphy/Byyy8E3qC)
## Smart Contract
 Bir "akıllı sözleşme" basitçe Ethereum blokzincirinde çalışan bir programdır. Ethereum blokzincirinde ki özel adreste bulunan bir kod (sözleşmenin fonksiyonları) ve veri (sözleşmenin durumu) koleksiyonudur. 
 
 ***Akıllı Sözleşmeler bir tür Ethereum hesabıdır.***
  
###   "Dijital Bir Otomat" ([Orijinal Makale](https://nakamotoinstitute.org/library/smart-contracts/)) 
 Nick Szabo'nun açıkladığı gibi, bir akıllı sözleşme için en iyi metafor, muhtemelen bir otomattır. Doğru girdilerle, belli bir çıktı garanti edilir. 
 
 Otomattan bir atıştırmalık için;
> money + snack selection = snack dispensed

Otomatlar, akıllı sözleşmelerle benzer sayılabilecek şekilde çalışırlar. 

1. Bir ürün seçersiniz.
2. Otomat fiyat gösterir.
3. Fiyatı ödersiniz.
4. Otomat doğru miktarı ödediğinizi onaylar. 
5. Otomat size ürünü verir.

 Otomat istediğiniz ürün sadece tüm gereksinimler karşılığında verecektir. Eğer ürün seçmezseniz veya yeterli parayı girmezseniz otomat ürününüzü vermeyecektir. 
 
``` 
pragma solidity 0.8.7;

contract VendingMachine {
    address public owner;                                  // sözleşmenin sahibini temsil eden değişken
    mapping(address => uint) public cupcakeBalances;      // cupcake stokları tutmak için mapping yapılmış

    constructor() {                                       
        owner = msg.sender;                                // sözleşmeyi başlatan adres, işlemi başlatan kişiyi belirler
        cupcakeBalances[address(this)] = 100;
    }

    function refill(uint amount) public {
        require(msg.sender == owner, "Yalnızca sahip yeniden doldurabilir");         // sadece sahibin çağırabileceği fonksiyon, cupcake eklemeye yarar
        cupcakeBalances[address(this)] += amount; 
    }

    function purchase(uint amount) public payable {                       // cupcake almak isteyenler tarafından çağrılır
        require(msg.value >= amount * 1 ether, "Yetersiz Bakiye");          // belirli ether ile ödeme yapması gerektiğini kontrol eder
        require(cupcakeBalances[address(this)] >= amount, "Stok yok");      // stokları kontrol eder
        cupcakeBalances[address(this)] -= amount;                           // satın alınan cupcake miktarını stoktan düşer
        cupcakeBalances[msg.sender] += amount;                             // alan kişinin hesabına cupcake ekler 
    }
}
```

> **require**: bu ifade bir koşulu kontrol eder ve eğer koşul sağlanmıyorsa durdurur, diğer türlü devam eder.  
> 
> require (koşul, "Hata mesajı")

> *purchase* fonksiyonu, cupcakeleri satın almak isteyen kullanıcıların kullanabileceği bir fonksiyonu temsil eder. 


#### Basit bir örnek
'amount', bir fonksiyonun parametresidir ve genellikle bir miktarı temsil eder. *refill* fonksiyonu cupcake'leri doldurmak için kullanılacak miktarı ifade eder.

Örnek:
> vendingMachine = newvendingMachine();
> vendingMachine.refill(50);

Bu çağrı da 'amount' değeri 50'dir. *"refill"* fonksiyonu 50 adet cupcake ekler. 

---
Notların devamı [Bölüm 3'de](https://hackmd.io/@yigitraphy/SJPULXJiC). Akıllı Sözleşmelerin Anatomisi ele alındı. 