# 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ı.